SEBA-973 Update kafka topic exporter to support voltha 2.0 KPI2 event types
Needs to be merged after mergeing VOL-2948

Change-Id: I29620969773d555294ce6eefe7cf52be6df63225
diff --git a/Gopkg.lock b/Gopkg.lock
index 5d9ed06..94ab340 100644
--- a/Gopkg.lock
+++ b/Gopkg.lock
@@ -66,12 +66,20 @@
   revision = "f62e125fcbfec116f56051e523699d5cce1d33f8"
 
 [[projects]]
-  digest = "1:573ca21d3669500ff845bdebee890eb7fc7f0f50c59f2132f2a0c6b03d85086a"
+  digest = "1:e990969aa1e50a90b32339bde4ba5bea3f81e8da8c15f20f62786c4dfb8ae45b"
   name = "github.com/golang/protobuf"
-  packages = ["proto"]
+  packages = [
+    "proto",
+    "protoc-gen-go/descriptor",
+    "ptypes",
+    "ptypes/any",
+    "ptypes/duration",
+    "ptypes/empty",
+    "ptypes/timestamp",
+  ]
   pruneopts = "UT"
-  revision = "6c65a5562fc06764971b7c5d05c76c75e84bdbf7"
-  version = "v1.3.2"
+  revision = "1b794fe86dd6a0c7c52ae69b5c9cb0aeedc52afa"
+  version = "v1.4.0"
 
 [[projects]]
   digest = "1:e4f5819333ac698d294fe04dbf640f84719658d5c7ce195b10060cc37292ce79"
@@ -117,6 +125,19 @@
   version = "v1.0.1"
 
 [[projects]]
+  digest = "1:c2b2d407417b550f4e45ae161bce8cc511f275d3af400d13ce1df9679755cec7"
+  name = "github.com/opencord/voltha-protos"
+  packages = [
+    "go/common",
+    "go/omci",
+    "go/openflow_13",
+    "go/voltha",
+  ]
+  pruneopts = "UT"
+  revision = "b6b797cceae987556bc705acc6273b1c7e43ce05"
+  version = "v1.0.3"
+
+[[projects]]
   digest = "1:f690a0a27cefae695fa9587aa3ed23652e593be1d98b35f8184d10bccec30444"
   name = "github.com/pierrec/lz4"
   packages = [
@@ -128,7 +149,7 @@
   version = "v2.2.4"
 
 [[projects]]
-  digest = "1:eb04f69c8991e52eff33c428bd729e04208bf03235be88e4df0d88497c6861b9"
+  digest = "1:e89f2cdede55684adbe44b5566f55838ad2aee1dff348d14b73ccf733607b671"
   name = "github.com/prometheus/client_golang"
   packages = [
     "prometheus",
@@ -136,8 +157,8 @@
     "prometheus/promhttp",
   ]
   pruneopts = "UT"
-  revision = "4ab88e80c249ed361d3299e2930427d9ac43ef8d"
-  version = "v1.0.0"
+  revision = "2641b987480bca71fb39738eb8c8b0d577cb1d76"
+  version = "v0.9.4"
 
 [[projects]]
   branch = "master"
@@ -199,27 +220,155 @@
 
 [[projects]]
   branch = "master"
-  digest = "1:3e0062766e6b0bcfe1ba1ed1d3f08a8e1e99cd5831426e2596dc9537d28f2adb"
+  digest = "1:6709f392f6c8449ec1d23face6328ffe1f1cd7f4b28422bbc3218314ff78bf33"
   name = "golang.org/x/net"
   packages = [
+    "http/httpguts",
+    "http2",
+    "http2/hpack",
+    "idna",
     "internal/socks",
+    "internal/timeseries",
     "proxy",
+    "trace",
   ]
   pruneopts = "UT"
   revision = "da137c7871d730100384dbcf36e6f8fa493aef5b"
 
 [[projects]]
   branch = "master"
-  digest = "1:31d44814b45607afa77c6e8ef20ea8bacc1d1053fe084440c874f311732e7ec3"
+  digest = "1:5632b0c4d972da51b5914f09fc5c1a8535e9d8d5d937e95ef83c423a0dd67f13"
   name = "golang.org/x/sys"
-  packages = [
-    "unix",
-    "windows",
-  ]
+  packages = ["unix"]
   pruneopts = "UT"
   revision = "fae7ac547cb717d141c433a2a173315e216b64c4"
 
 [[projects]]
+  digest = "1:8d8faad6b12a3a4c819a3f9618cb6ee1fa1cfc33253abeeea8b55336721e3405"
+  name = "golang.org/x/text"
+  packages = [
+    "collate",
+    "collate/build",
+    "internal/colltab",
+    "internal/gen",
+    "internal/language",
+    "internal/language/compact",
+    "internal/tag",
+    "internal/triegen",
+    "internal/ucd",
+    "language",
+    "secure/bidirule",
+    "transform",
+    "unicode/bidi",
+    "unicode/cldr",
+    "unicode/norm",
+    "unicode/rangetable",
+  ]
+  pruneopts = "UT"
+  revision = "342b2e1fbaa52c93f31447ad2c6abc048c63e475"
+  version = "v0.3.2"
+
+[[projects]]
+  branch = "master"
+  digest = "1:23dd3fce7112bfe3398e02c3d31da8ed4e657b3a37d37c21bea9a091c6505ac0"
+  name = "google.golang.org/genproto"
+  packages = [
+    "googleapis/api/annotations",
+    "googleapis/rpc/status",
+  ]
+  pruneopts = "UT"
+  revision = "bca184e23272c97429f0cb78a825f71ede0635fc"
+
+[[projects]]
+  digest = "1:712fa3cb36bfb9e0d333e10f8dcb9b1e64aa2ec30cabed56c114b5e64d775823"
+  name = "google.golang.org/grpc"
+  packages = [
+    ".",
+    "attributes",
+    "backoff",
+    "balancer",
+    "balancer/base",
+    "balancer/roundrobin",
+    "binarylog/grpc_binarylog_v1",
+    "codes",
+    "connectivity",
+    "credentials",
+    "credentials/internal",
+    "encoding",
+    "encoding/proto",
+    "grpclog",
+    "internal",
+    "internal/backoff",
+    "internal/balancerload",
+    "internal/binarylog",
+    "internal/buffer",
+    "internal/channelz",
+    "internal/envconfig",
+    "internal/grpclog",
+    "internal/grpcrand",
+    "internal/grpcsync",
+    "internal/grpcutil",
+    "internal/resolver/dns",
+    "internal/resolver/passthrough",
+    "internal/status",
+    "internal/syscall",
+    "internal/transport",
+    "keepalive",
+    "metadata",
+    "naming",
+    "peer",
+    "resolver",
+    "serviceconfig",
+    "stats",
+    "status",
+    "tap",
+  ]
+  pruneopts = "UT"
+  revision = "754ee590a4f386d0910d887f3b8776354042260b"
+  version = "v1.29.1"
+
+[[projects]]
+  digest = "1:e98a83a6464ab71657c759d986a8a1dd9757885bc6c0e4167dffa9f5233c97cf"
+  name = "google.golang.org/protobuf"
+  packages = [
+    "encoding/prototext",
+    "encoding/protowire",
+    "internal/descfmt",
+    "internal/descopts",
+    "internal/detrand",
+    "internal/encoding/defval",
+    "internal/encoding/messageset",
+    "internal/encoding/tag",
+    "internal/encoding/text",
+    "internal/errors",
+    "internal/fieldnum",
+    "internal/fieldsort",
+    "internal/filedesc",
+    "internal/filetype",
+    "internal/flags",
+    "internal/genname",
+    "internal/impl",
+    "internal/mapsort",
+    "internal/pragma",
+    "internal/set",
+    "internal/strs",
+    "internal/version",
+    "proto",
+    "reflect/protoreflect",
+    "reflect/protoregistry",
+    "runtime/protoiface",
+    "runtime/protoimpl",
+    "types/descriptorpb",
+    "types/known/anypb",
+    "types/known/durationpb",
+    "types/known/emptypb",
+    "types/known/timestamppb",
+  ]
+  pruneopts = "UT"
+  revision = "3b9eee12916ce611400f93d6c2fed2fc2911b0ad"
+  version = "v1.21.0"
+
+[[projects]]
   digest = "1:c902038ee2d6f964d3b9f2c718126571410c5d81251cbab9fe58abd37803513c"
   name = "gopkg.in/jcmturner/aescts.v1"
   packages = ["."]
@@ -299,6 +448,8 @@
   input-imports = [
     "github.com/Shopify/sarama",
     "github.com/gfremex/logrus-kafka-hook",
+    "github.com/golang/protobuf/proto",
+    "github.com/opencord/voltha-protos/go/voltha",
     "github.com/prometheus/client_golang/prometheus",
     "github.com/prometheus/client_golang/prometheus/promhttp",
     "github.com/sirupsen/logrus",
diff --git a/Gopkg.toml b/Gopkg.toml
index ebbf24e..be6f760 100644
--- a/Gopkg.toml
+++ b/Gopkg.toml
@@ -62,3 +62,7 @@
 [prune]
   go-tests = true
   unused-packages = true
+
+[[constraint]]
+  name = "github.com/golang/protobuf"
+  version = "1.3.2"
diff --git a/config/conf.yaml b/config/conf.yaml
index 398e4f2..a1ec3fa 100644
--- a/config/conf.yaml
+++ b/config/conf.yaml
@@ -8,7 +8,7 @@
     - onos.kpis
     - onos.aaa.stats.kpis
     - bng.stats
-    - voltha.kpis
+    - voltha.events
 logger:
   loglevel: debug
   host: cord-kafka.default.svc.cluster.local:9092
diff --git a/main.go b/main.go
index 752882b..6838cd7 100644
--- a/main.go
+++ b/main.go
@@ -71,23 +71,80 @@
 	err := http.ListenAndServe(":"+strconv.Itoa(target.Port), nil)
 	if err != nil {
 		logger.Error("HTTP Server Error: %s", err.Error())
-       }
+	}
 }
 
 func init() {
 	// register metrics within Prometheus
-	prometheus.MustRegister(volthaTxBytesTotal)
-	prometheus.MustRegister(volthaRxBytesTotal)
-	prometheus.MustRegister(volthaTxPacketsTotal)
-	prometheus.MustRegister(volthaRxPacketsTotal)
-	prometheus.MustRegister(volthaTxErrorPacketsTotal)
-	prometheus.MustRegister(volthaRxErrorPacketsTotal)
+	prometheus.MustRegister(volthaOltTxBytesTotal)
+	prometheus.MustRegister(volthaOltRxBytesTotal)
+	prometheus.MustRegister(volthaOltTxPacketsTotal)
+	prometheus.MustRegister(volthaOltRxPacketsTotal)
+	prometheus.MustRegister(volthaOltTxErrorPacketsTotal)
+	prometheus.MustRegister(volthaOltRxErrorPacketsTotal)
+	prometheus.MustRegister(volthaOltTxBroadcastPacketsTotal)
+	prometheus.MustRegister(volthaOltTxUnicastPacketsTotal)
+	prometheus.MustRegister(volthaOltTxMulticastPacketsTotal)
+	prometheus.MustRegister(volthaOltRxBroadcastPacketsTotal)
+	prometheus.MustRegister(volthaOltRxUnicastPacketsTotal)
+	prometheus.MustRegister(volthaOltRxMulticastPacketsTotal)
 
 	prometheus.MustRegister(VolthaOnuLaserBiasCurrent)
 	prometheus.MustRegister(volthaOnuTemperature)
 	prometheus.MustRegister(VolthaOnuPowerFeedVoltage)
 	prometheus.MustRegister(VolthaOnuMeanOpticalLaunchPower)
 	prometheus.MustRegister(VolthaOnuReceivedOpticalPower)
+	prometheus.MustRegister(VolthaOnuTransmtOpticalPower)
+
+	prometheus.MustRegister(volthaOnuFecCorrectedCodewordsTotal)
+	prometheus.MustRegister(volthaOnuFecCodewordsTotal)
+	prometheus.MustRegister(volthaOnuFecCorrectedBytesTotal)
+	prometheus.MustRegister(volthaOnuFecSecondsTotal)
+	prometheus.MustRegister(volthaOnuFecUncorrectablewordsTotal)
+
+	prometheus.MustRegister(volthaEthernetUniSingleCollisionTotal)
+	prometheus.MustRegister(volthaEthernetUniMacLayerTramsmitErrorTotal)
+	prometheus.MustRegister(volthaEthernetUniMultiCollisionTotal)
+	prometheus.MustRegister(volthaEthernetUniFramestooLongTotal)
+	prometheus.MustRegister(volthaEthernetUniAlignmentErrorTotal)
+	prometheus.MustRegister(volthaEthernetUniCarrierErrorTotal)
+	prometheus.MustRegister(volthaEthernetUniExcessiveCollisionErrorTotal)
+	prometheus.MustRegister(volthaEthernetUniDeferredTxTotal)
+	prometheus.MustRegister(volthaEthernetUniLateCollisionTotal)
+	prometheus.MustRegister(volthaEthernetUniBufferOverflowsRxErrorTotal)
+	prometheus.MustRegister(volthaEthernetUniFcsErrorTotal)
+	prometheus.MustRegister(volthaEthernetUniSqeErrorTotal)
+	prometheus.MustRegister(volthaEthernetUniBufferOverflowsTxErrorTotal)
+
+	prometheus.MustRegister(volthaOnuBridgePortRxBytesTotal)
+	prometheus.MustRegister(volthaOnuBridgePortRxPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePort_64octetRxPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePort_65_127_octetRxPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePort_128_255_octetRxPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePort_256_511_octetRxPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePort_512_1023_octetRxPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePort_1024_1518_octetRxPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePortRxMulticastPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePortRxBroadcastPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePortRxOversizePacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePortRxCrcErrorPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePortRxUndersizePacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePortRxDropEventsTotal)
+
+	prometheus.MustRegister(volthaOnuBridgePortTxBytesTotal)
+	prometheus.MustRegister(volthaOnuBridgePortTxPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePort_64octetTxPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePort_65_127_octetTxPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePort_128_255_octetTxPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePort_256_511_octetTxPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePort_512_1023_octetTxPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePort_1024_1518_octetTxPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePortTxMulticastPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePortTxBroadcastPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePortTxOversizePacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePortTxCrcErrorPacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePortTxUndersizePacketsTotal)
+	prometheus.MustRegister(volthaOnuBridgePortTxDropEventsTotal)
 
 	prometheus.MustRegister(onosTxBytesTotal)
 	prometheus.MustRegister(onosRxBytesTotal)
@@ -134,7 +191,7 @@
 	prometheus.MustRegister(onosaaaEapPktTxAuthChooseEap)
 	prometheus.MustRegister(onosaaaTxRespnotNak)
 
-        prometheus.MustRegister(onosaaaEapolFramesTx)
+	prometheus.MustRegister(onosaaaEapolFramesTx)
 	prometheus.MustRegister(onosaaaAuthStateIdle)
 	prometheus.MustRegister(onosaaaRequestIdFramesTx)
 	prometheus.MustRegister(onosaaaRequestEapFramesTx)
diff --git a/topic-exporter.go b/topic-exporter.go
index 4532c28..2923c87 100644
--- a/topic-exporter.go
+++ b/topic-exporter.go
@@ -17,6 +17,8 @@
 import (
 	"encoding/json"
 	"gerrit.opencord.org/kafka-topic-exporter/common/logger"
+	"github.com/golang/protobuf/proto"
+	"github.com/opencord/voltha-protos/go/voltha"
 	"github.com/prometheus/client_golang/prometheus"
 	log "github.com/sirupsen/logrus"
 	"strconv"
@@ -25,51 +27,99 @@
 
 var (
 	// voltha kpis
-	volthaTxBytesTotal = prometheus.NewGaugeVec(
+	volthaOltTxBytesTotal = prometheus.NewGaugeVec(
 		prometheus.GaugeOpts{
-			Name: "voltha_tx_bytes_total",
+			Name: "voltha_olt_tx_bytes_total",
 			Help: "Number of total bytes transmitted",
 		},
 		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
 	)
-	volthaRxBytesTotal = prometheus.NewGaugeVec(
+	volthaOltRxBytesTotal = prometheus.NewGaugeVec(
 		prometheus.GaugeOpts{
-			Name: "voltha_rx_bytes_total",
+			Name: "voltha_olt_rx_bytes_total",
 			Help: "Number of total bytes received",
 		},
 		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
 	)
-	volthaTxPacketsTotal = prometheus.NewGaugeVec(
+	volthaOltTxPacketsTotal = prometheus.NewGaugeVec(
 		prometheus.GaugeOpts{
-			Name: "voltha_tx_packets_total",
+			Name: "voltha_olt_tx_packets_total",
 			Help: "Number of total packets transmitted",
 		},
 		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
 	)
-	volthaRxPacketsTotal = prometheus.NewGaugeVec(
+	volthaOltRxPacketsTotal = prometheus.NewGaugeVec(
 		prometheus.GaugeOpts{
-			Name: "voltha_rx_packets_total",
+			Name: "voltha_olt_rx_packets_total",
 			Help: "Number of total packets received",
 		},
 		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
 	)
 
-	volthaTxErrorPacketsTotal = prometheus.NewGaugeVec(
+	volthaOltTxErrorPacketsTotal = prometheus.NewGaugeVec(
 		prometheus.GaugeOpts{
-			Name: "voltha_tx_error_packets_total",
+			Name: "voltha_olt_tx_error_packets_total",
 			Help: "Number of total transmitted packets error",
 		},
 		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
 	)
 
-	volthaRxErrorPacketsTotal = prometheus.NewGaugeVec(
+	volthaOltRxErrorPacketsTotal = prometheus.NewGaugeVec(
 		prometheus.GaugeOpts{
-			Name: "voltha_rx_error_packets_total",
+			Name: "voltha_olt_rx_error_packets_total",
 			Help: "Number of total received packets error",
 		},
 		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
 	)
 
+	volthaOltTxBroadcastPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_olt_tx_broadcast_packets_total",
+			Help: "Number of total broadcast packets transmitted",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
+	)
+
+	volthaOltTxUnicastPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_olt_tx_unicast_packets_total",
+			Help: "Number of total unicast packets transmitted",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
+	)
+
+	volthaOltTxMulticastPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_olt_tx_multicast_packets_total",
+			Help: "Number of total multicast packets transmitted",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
+	)
+
+	volthaOltRxBroadcastPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_olt_rx_broadcast_packets_total",
+			Help: "Number of total broadcast packets received",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
+	)
+
+	volthaOltRxUnicastPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_olt_rx_unicast_packets_total",
+			Help: "Number of total unicast packets received",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
+	)
+
+	volthaOltRxMulticastPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_olt_rx_multicast_packets_total",
+			Help: "Number of total multicast packets received",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
+	)
+
 	// optical parameters
 	VolthaOnuLaserBiasCurrent = prometheus.NewGaugeVec(
 		prometheus.GaugeOpts{
@@ -111,6 +161,363 @@
 		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
 	)
 
+	VolthaOnuTransmtOpticalPower = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_transmit_optical_power",
+			Help: "ONU transmited optical power",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
+	)
+
+	// FEC parameters
+	volthaOnuFecCorrectedCodewordsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_fec_corrected_code_words",
+			Help: "Number of total code words corrected",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+
+	volthaOnuFecCodewordsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_fec_code_words_total",
+			Help: "Number of total code words",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+
+	volthaOnuFecCorrectedBytesTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_fec_corrected_bytes_total",
+			Help: "Number of total corrected bytes",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+
+	volthaOnuFecSecondsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_fec_corrected_fec_seconds_total",
+			Help: "Number of fec seconds total",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+
+	volthaOnuFecUncorrectablewordsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_fec_uncorrectable_words_total",
+			Help: "Number of fec uncorrectable words",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+	//Etheret UNI
+
+	volthaEthernetUniSingleCollisionTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_ethernet_uni_single_collision_frame_counter",
+			Help: "successfully transmitted frames but delayed by exactly one collision.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "port_number", "title"},
+	)
+
+	volthaEthernetUniMacLayerTramsmitErrorTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_ethernet_uni_internal_mac_rx_error_counter",
+			Help: "transmission failed due to an internal MAC sublayer transmit error.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "port_number", "title"},
+	)
+
+	volthaEthernetUniMultiCollisionTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_ethernet_uni_multiple_collisions_frame_counter",
+			Help: "successfully transmitted frames but delayed by multiple collisions.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "port_number", "title"},
+	)
+
+	volthaEthernetUniFramestooLongTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_ethernet_uni_frames_too_long",
+			Help: "frames that exceeded the maximum permitted frame size.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "port_number", "title"},
+	)
+
+	volthaEthernetUniAlignmentErrorTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_ethernet_uni_alignment_error_counter",
+			Help: "frames that were not an integral number of octets in length and did not pass the FCS check.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "port_number", "title"},
+	)
+	volthaEthernetUniCarrierErrorTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_ethernet_uni_carrier_sense_error_counter",
+			Help: "number of times that carrier sense was lost or never asserted when attempting to transmit a frame.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "port_number", "title"},
+	)
+	volthaEthernetUniExcessiveCollisionErrorTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_ethernet_uni_excessive_collision_counter",
+			Help: "frames whose transmission failed due to excessive collisions.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "port_number", "title"},
+	)
+	volthaEthernetUniDeferredTxTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_ethernet_uni_deferred_tx_counter",
+			Help: "frames whose first transmission attempt was delayed because the medium was busy.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "port_number", "title"},
+	)
+	volthaEthernetUniLateCollisionTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_ethernet_uni_late_collision_counter",
+			Help: "number of times that a collision was detected later than 512 bit times into the transmission of a packet.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "port_number", "title"},
+	)
+	volthaEthernetUniBufferOverflowsRxErrorTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_ethernet_uni_buffer_overflows_on_rx",
+			Help: "number of times that the receive buffer overflowed.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "port_number", "title"},
+	)
+	volthaEthernetUniFcsErrorTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_ethernet_uni_fcs_errors",
+			Help: " frames failed the frame check sequence (FCS) check.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "port_number", "title"},
+	)
+	volthaEthernetUniSqeErrorTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_ethernet_uni_sqe_counter",
+			Help: "number of times that the SQE test error message was generated by the PLS sublayer",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "port_number", "title"},
+	)
+	volthaEthernetUniBufferOverflowsTxErrorTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_ethernet_uni_buffer_overflows_on_tx",
+			Help: " number of times that the transmit buffer overflowed.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "port_number", "title"},
+	)
+	//Ethernet_Bridge_Port
+
+	volthaOnuBridgePortTxBytesTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_tx_bytes_total",
+			Help: "Number of total bytes transmitted",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+	volthaOnuBridgePortRxBytesTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_rx_bytes_total",
+			Help: "Number of total bytes received",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+	volthaOnuBridgePortTxPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_tx_packets_total",
+			Help: "Number of total packets transmitted",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+	volthaOnuBridgePortRxPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_rx_packets_total",
+			Help: "Number of total packets received",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+
+	volthaOnuBridgePort_64octetTxPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_64_octets_Txpackets",
+			Help: "packets (including bad packets) that were 64 octets long",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+
+	volthaOnuBridgePort_65_127_octetTxPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_65_to_127_octet_Txpackets",
+			Help: "packets (including bad packets) that were 65..127 octets long, excluding framing bits but including FCS.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+
+	volthaOnuBridgePort_128_255_octetTxPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_128_to_255_octet_Txpackets",
+			Help: "packets (including bad packets) received that were 128..255 octets long, excluding framing bits but including FCS.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+
+	volthaOnuBridgePort_256_511_octetTxPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_256_to_511_octet_Txpackets",
+			Help: "packets (including bad packets) received that were 256..511 octets long, excluding framing bits but including FCS.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+
+	volthaOnuBridgePort_512_1023_octetTxPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_512_to_1023_octet_Txpackets",
+			Help: "packets (including bad packets) received that were 512..1 023 octets long, excluding framing bits but including FCS.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+
+	volthaOnuBridgePort_1024_1518_octetTxPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_1024_to_1518_octet_Txpackets",
+			Help: "packets (including bad packets) received that were 1024..1518 octets long, excluding framing bits, but including FCS.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+	volthaOnuBridgePortTxMulticastPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_multicast_Txpackets",
+			Help: "packets received that were directed to a multicast address.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+	volthaOnuBridgePortTxBroadcastPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_broadcast_Txpackets",
+			Help: "packets received that were directed to the broadcast address.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+	volthaOnuBridgePortTxOversizePacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_oversize_Txpackets",
+			Help: " packets received that were longer than 1518 octets",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+	volthaOnuBridgePortTxCrcErrorPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_crc_errored_Txpackets",
+			Help: "Packets with CRC errors",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+	volthaOnuBridgePortTxUndersizePacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_undersize_Txpackets",
+			Help: "Packets received that were less than 64 octets long, but were otherwise well formed",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+
+	volthaOnuBridgePortTxDropEventsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_Txdrop_events",
+			Help: "total number of events in which packets were dropped due to a lack of resources. ",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+	volthaOnuBridgePort_64octetRxPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_64_octets_Rxpackets",
+			Help: "packets (including bad packets) that were 64 octets long",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+
+	volthaOnuBridgePort_65_127_octetRxPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_65_to_127_octet_Rxpackets",
+			Help: "packets (including bad packets) that were 65..127 octets long, excluding framing bits but including FCS.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+
+	volthaOnuBridgePort_128_255_octetRxPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_128_to_255_octet_packets",
+			Help: "packets (including bad packets) received that were 128..255 octets long, excluding framing bits but including FCS.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+
+	volthaOnuBridgePort_256_511_octetRxPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_256_to_511_octet_Rxpackets",
+			Help: "packets (including bad packets) received that were 256..511 octets long, excluding framing bits but including FCS.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+
+	volthaOnuBridgePort_512_1023_octetRxPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_512_to_1023_octet_Rxpackets",
+			Help: "packets (including bad packets) received that were 512..1 023 octets long, excluding framing bits but including FCS.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+
+	volthaOnuBridgePort_1024_1518_octetRxPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_1024_to_1518_octet_Rxpackets",
+			Help: "packets (including bad packets) received that were 1024..1518 octets long, excluding framing bits, but including FCS.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+	volthaOnuBridgePortRxMulticastPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_multicast_Rxpackets",
+			Help: "packets received that were directed to a multicast address.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+	volthaOnuBridgePortRxBroadcastPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_broadcast_Rxpackets",
+			Help: "packets received that were directed to the broadcast address.",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+	volthaOnuBridgePortRxOversizePacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_oversize_Rxpackets",
+			Help: " packets received that were longer than 1518 octets",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+	volthaOnuBridgePortRxCrcErrorPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_crc_errored_Rxpackets",
+			Help: "Packets with CRC errors",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+	volthaOnuBridgePortRxUndersizePacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_undersize_Rxpackets",
+			Help: "Packets received that were less than 64 octets long, but were otherwise well formed",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+
+	volthaOnuBridgePortRxDropEventsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_onu_bridge_port_Rxdrop_events",
+			Help: "total number of events in which packets were dropped due to a lack of resources. ",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "title"},
+	)
+
 	// onos kpis
 	onosTxBytesTotal = prometheus.NewGaugeVec(
 		prometheus.GaugeOpts{
@@ -433,249 +840,527 @@
 		})
 )
 
-func exportVolthaKPI(kpi VolthaKPI) {
+func exportVolthaEthernetPonStats(data *voltha.MetricInformation) {
 
-	for _, data := range kpi.SliceDatas {
-		switch title := data.Metadata.Title; title {
-		case "Ethernet", "PON":
-			volthaTxBytesTotal.WithLabelValues(
-				data.Metadata.LogicalDeviceID,
-				data.Metadata.SerialNumber,
-				data.Metadata.DeviceID,
-				data.Metadata.Context.InterfaceID,
-				data.Metadata.Context.PonID,
-				data.Metadata.Context.PortNumber,
-				data.Metadata.Title,
-			).Set(data.Metrics.TxBytes)
+	volthaOltTxBytesTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		"NA", // InterfaceID
+		"NA", // PonID
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["TxBytes"]))
 
-			volthaRxBytesTotal.WithLabelValues(
-				data.Metadata.LogicalDeviceID,
-				data.Metadata.SerialNumber,
-				data.Metadata.DeviceID,
-				data.Metadata.Context.InterfaceID,
-				data.Metadata.Context.PonID,
-				data.Metadata.Context.PortNumber,
-				data.Metadata.Title,
-			).Set(data.Metrics.RxBytes)
+	volthaOltRxBytesTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		"NA", // InterfaceID
+		"NA", // PonID
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["RxBytes"]))
 
-			volthaTxPacketsTotal.WithLabelValues(
-				data.Metadata.LogicalDeviceID,
-				data.Metadata.SerialNumber,
-				data.Metadata.DeviceID,
-				data.Metadata.Context.InterfaceID,
-				data.Metadata.Context.PonID,
-				data.Metadata.Context.PortNumber,
-				data.Metadata.Title,
-			).Set(data.Metrics.TxPackets)
+	volthaOltTxPacketsTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		"NA", // InterfaceID
+		"NA", // PonID
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["TxPackets"]))
 
-			volthaRxPacketsTotal.WithLabelValues(
-				data.Metadata.LogicalDeviceID,
-				data.Metadata.SerialNumber,
-				data.Metadata.DeviceID,
-				data.Metadata.Context.InterfaceID,
-				data.Metadata.Context.PonID,
-				data.Metadata.Context.PortNumber,
-				data.Metadata.Title,
-			).Set(data.Metrics.RxPackets)
+	volthaOltRxPacketsTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		"NA", // InterfaceID
+		"NA", // PonID
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["RxPackets"]))
 
-			volthaTxErrorPacketsTotal.WithLabelValues(
-				data.Metadata.LogicalDeviceID,
-				data.Metadata.SerialNumber,
-				data.Metadata.DeviceID,
-				data.Metadata.Context.InterfaceID,
-				data.Metadata.Context.PonID,
-				data.Metadata.Context.PortNumber,
-				data.Metadata.Title,
-			).Set(data.Metrics.TxErrorPackets)
+	volthaOltTxErrorPacketsTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		"NA", // InterfaceID
+		"NA", // PonID
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["TxErrorPackets"]))
 
-			volthaRxErrorPacketsTotal.WithLabelValues(
-				data.Metadata.LogicalDeviceID,
-				data.Metadata.SerialNumber,
-				data.Metadata.DeviceID,
-				data.Metadata.Context.InterfaceID,
-				data.Metadata.Context.PonID,
-				data.Metadata.Context.PortNumber,
-				data.Metadata.Title,
-			).Set(data.Metrics.RxErrorPackets)
+	volthaOltRxErrorPacketsTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		"NA", // InterfaceID
+		"NA", // PonID
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["RxErrorPackets"]))
 
-			// TODO add metrics for:
-			// TxBcastPackets
-			// TxUnicastPackets
-			// TxMulticastPackets
-			// RxBcastPackets
-			// RxMulticastPackets
+	volthaOltTxBroadcastPacketsTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		"NA", // InterfaceID
+		"NA", // PonID
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["TxBcastPackets"]))
 
+	volthaOltTxUnicastPacketsTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		"NA", // InterfaceID
+		"NA", // PonID
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["TxUcastPackets"]))
+
+	volthaOltTxMulticastPacketsTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		"NA", // InterfaceID
+		"NA", // PonID
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["TxMcastPackets"]))
+
+	volthaOltRxBroadcastPacketsTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		"NA", // InterfaceID
+		"NA", // PonID
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["RxBcastPackets"]))
+
+	volthaOltRxUnicastPacketsTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		"NA", // InterfaceID
+		"NA", // PonID
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["RxUcastPackets"]))
+
+	volthaOltRxMulticastPacketsTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		"NA", // InterfaceID
+		"NA", // PonID
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["RxMcastPackets"]))
+}
+
+func exportVolthaOnuEthernetBridgePortStats(data *voltha.MetricInformation) {
+
+	if (data.GetMetadata().GetContext()["upstream"]) == "True" {
+		// ONU. Extended Ethernet statistics.
+		volthaOnuBridgePortTxPacketsTotal.WithLabelValues(
+			data.Metadata.GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["packets"]))
+
+		volthaOnuBridgePortTxBytesTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.GetMetadata().GetSerialNo(),
+			data.GetMetadata().GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["octets"]))
+
+		volthaOnuBridgePort_64octetTxPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["64_octets"]))
+
+		volthaOnuBridgePort_65_127_octetTxPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["65_to_127_octets"]))
+
+		volthaOnuBridgePort_128_255_octetTxPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["128_to_255_octets"]))
+
+		volthaOnuBridgePort_256_511_octetTxPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["256_to_511_octets"]))
+
+		volthaOnuBridgePort_512_1023_octetTxPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["512_to_1023_octets"]))
+
+		volthaOnuBridgePort_1024_1518_octetTxPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["1024_to_1518_octets"]))
+
+		volthaOnuBridgePortTxMulticastPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["multicast_packets"]))
+
+		volthaOnuBridgePortTxBroadcastPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["broadcast_packets"]))
+
+		volthaOnuBridgePortTxOversizePacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["oversize_packets"]))
+
+		volthaOnuBridgePortTxCrcErrorPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["crc_errored_packets"]))
+
+		volthaOnuBridgePortTxUndersizePacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["undersize_packets"]))
+
+		volthaOnuBridgePortTxDropEventsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["drop_events"]))
+
+	} else {
+
+		// ONU. Extended Ethernet statistics.
+		volthaOnuBridgePortRxPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.GetMetadata().GetSerialNo(),
+			data.GetMetadata().GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["packets"]))
+
+		volthaOnuBridgePortRxBytesTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.GetMetadata().GetSerialNo(),
+			data.GetMetadata().GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["octets"]))
+
+		volthaOnuBridgePort_64octetRxPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["64_octets"]))
+
+		volthaOnuBridgePort_65_127_octetRxPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["65_to_127_octets"]))
+
+		volthaOnuBridgePort_128_255_octetRxPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["128_to_255_octets"]))
+
+		volthaOnuBridgePort_256_511_octetRxPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["256_to_511_octets"]))
+
+		volthaOnuBridgePort_512_1023_octetRxPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["512_to_1023_octets"]))
+
+		volthaOnuBridgePort_1024_1518_octetRxPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["1024_to_1518_octets"]))
+
+		volthaOnuBridgePortRxMulticastPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["multicast_packets"]))
+
+		volthaOnuBridgePortRxBroadcastPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["broadcast_packets"]))
+
+		volthaOnuBridgePortRxOversizePacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["oversize_packets"]))
+
+		volthaOnuBridgePortRxCrcErrorPacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["crc_errored_packets"]))
+
+		volthaOnuBridgePortRxUndersizePacketsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["undersize_packets"]))
+
+		volthaOnuBridgePortRxDropEventsTotal.WithLabelValues(
+			data.GetMetadata().GetLogicalDeviceId(),
+			data.Metadata.GetSerialNo(),
+			data.Metadata.GetDeviceId(),
+			data.GetMetadata().GetTitle(),
+		).Add(float64(data.GetMetrics()["drop_events"]))
+
+	}
+}
+
+func exportVolthaOnuPonOpticalStats(data *voltha.MetricInformation) {
+	VolthaOnuTransmtOpticalPower.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetContext()["intf_id"],
+		"NA", // PonID,
+		"NA", //PortNumber
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["transmit_power"]))
+
+	VolthaOnuReceivedOpticalPower.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetContext()["intf_id"],
+		"NA", // PonID,
+		"NA", //PortNumber
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["receive_power"]))
+}
+func exportVolthaOnuFecStats(data *voltha.MetricInformation) {
+	volthaOnuFecCorrectedCodewordsTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["corrected_code_words"]))
+
+	volthaOnuFecCodewordsTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["total_code_words"]))
+
+	volthaOnuFecCorrectedBytesTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["corrected_bytes"]))
+
+	volthaOnuFecSecondsTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["fec_seconds"]))
+
+	volthaOnuFecUncorrectablewordsTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["uncorrectable_code_words"]))
+}
+func exportVolthaOnuEthernetUniStats(data *voltha.MetricInformation) {
+
+	volthaEthernetUniSingleCollisionTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetContext()["intf_id"],
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["single_collision_frame_counter"]))
+
+	volthaEthernetUniMacLayerTramsmitErrorTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetContext()["intf_id"],
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["internal_mac_rx_error_counter"]))
+
+	volthaEthernetUniMultiCollisionTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetContext()["intf_id"],
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["multiple_collisions_frame_counter"]))
+
+	volthaEthernetUniFramestooLongTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetContext()["intf_id"],
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["frames_too_long"]))
+	volthaEthernetUniAlignmentErrorTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetContext()["intf_id"],
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["alignment_error_counter"]))
+
+	volthaEthernetUniCarrierErrorTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetContext()["intf_id"],
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["carrier_sense_error_counter"]))
+	volthaEthernetUniExcessiveCollisionErrorTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetContext()["intf_id"],
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["excessive_collision_counter"]))
+
+	volthaEthernetUniDeferredTxTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetContext()["intf_id"],
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["deferred_tx_counter"]))
+
+	volthaEthernetUniLateCollisionTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetContext()["intf_id"],
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["late_collision_counter"]))
+
+	volthaEthernetUniBufferOverflowsRxErrorTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetContext()["intf_id"],
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()[""]))
+
+	volthaEthernetUniFcsErrorTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetContext()["intf_id"],
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["fcs_errors"]))
+
+	volthaEthernetUniSqeErrorTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetContext()["intf_id"],
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["sqe_counter"]))
+
+	volthaEthernetUniBufferOverflowsTxErrorTotal.WithLabelValues(
+		data.GetMetadata().GetLogicalDeviceId(),
+		data.GetMetadata().GetSerialNo(),
+		data.GetMetadata().GetDeviceId(),
+		data.GetMetadata().GetContext()["intf_id"],
+		data.GetMetadata().GetContext()["portno"],
+		data.GetMetadata().GetTitle(),
+	).Set(float64(data.GetMetrics()["buffer_overflows_on_tx"]))
+
+}
+
+func exportVolthaKPIevent2(kpi *voltha.KpiEvent2) {
+	for _, data := range kpi.GetSliceData() {
+		switch title := data.GetMetadata().GetTitle(); title {
+		case "ETHERNET_NNI", "PON_OLT":
+			exportVolthaEthernetPonStats(data)
 		case "Ethernet_Bridge_Port_History":
-			if data.Metadata.Context.Upstream == "True" {
-				// ONU. Extended Ethernet statistics.
-				volthaTxPacketsTotal.WithLabelValues(
-					data.Metadata.LogicalDeviceID,
-					data.Metadata.SerialNumber,
-					data.Metadata.DeviceID,
-					"NA", // InterfaceID
-					"NA", // PonID
-					"NA", // PortNumber
-					data.Metadata.Title,
-				).Add(data.Metrics.Packets)
-
-				volthaTxBytesTotal.WithLabelValues(
-					data.Metadata.LogicalDeviceID,
-					data.Metadata.SerialNumber,
-					data.Metadata.DeviceID,
-					"NA", // InterfaceID
-					"NA", // PonID
-					"NA", // PortNumber
-					data.Metadata.Title,
-				).Add(data.Metrics.Octets)
-			} else {
-				// ONU. Extended Ethernet statistics.
-				volthaRxPacketsTotal.WithLabelValues(
-					data.Metadata.LogicalDeviceID,
-					data.Metadata.SerialNumber,
-					data.Metadata.DeviceID,
-					"NA", // InterfaceID
-					"NA", // PonID
-					"NA", // PortNumber
-					data.Metadata.Title,
-				).Add(data.Metrics.Packets)
-
-				volthaRxBytesTotal.WithLabelValues(
-					data.Metadata.LogicalDeviceID,
-					data.Metadata.SerialNumber,
-					data.Metadata.DeviceID,
-					"NA", // InterfaceID
-					"NA", // PonID
-					"NA", // PortNumber
-					data.Metadata.Title,
-				).Add(data.Metrics.Octets)
-			}
-
+			exportVolthaOnuEthernetBridgePortStats(data)
 		case "PON_Optical":
-			VolthaOnuLaserBiasCurrent.WithLabelValues(
-				data.Metadata.LogicalDeviceID,
-				data.Metadata.SerialNumber,
-				data.Metadata.DeviceID,
-				data.Metadata.Context.InterfaceID,
-				data.Metadata.Context.PonID,
-				data.Metadata.Context.PortNumber,
-				data.Metadata.Title,
-			).Set(data.Metrics.LaserBiasCurrent)
-
-			volthaOnuTemperature.WithLabelValues(
-				data.Metadata.LogicalDeviceID,
-				data.Metadata.SerialNumber,
-				data.Metadata.DeviceID,
-				data.Metadata.Context.InterfaceID,
-				data.Metadata.Context.PonID,
-				data.Metadata.Context.PortNumber,
-				data.Metadata.Title,
-			).Set(data.Metrics.Temperature)
-
-			VolthaOnuPowerFeedVoltage.WithLabelValues(
-				data.Metadata.LogicalDeviceID,
-				data.Metadata.SerialNumber,
-				data.Metadata.DeviceID,
-				data.Metadata.Context.InterfaceID,
-				data.Metadata.Context.PonID,
-				data.Metadata.Context.PortNumber,
-				data.Metadata.Title,
-			).Set(data.Metrics.PowerFeedVoltage)
-
-			VolthaOnuMeanOpticalLaunchPower.WithLabelValues(
-				data.Metadata.LogicalDeviceID,
-				data.Metadata.SerialNumber,
-				data.Metadata.DeviceID,
-				data.Metadata.Context.InterfaceID,
-				data.Metadata.Context.PonID,
-				data.Metadata.Context.PortNumber,
-				data.Metadata.Title,
-			).Set(data.Metrics.MeanOpticalLaunchPower)
-
-			VolthaOnuReceivedOpticalPower.WithLabelValues(
-				data.Metadata.LogicalDeviceID,
-				data.Metadata.SerialNumber,
-				data.Metadata.DeviceID,
-				data.Metadata.Context.InterfaceID,
-				data.Metadata.Context.PonID,
-				data.Metadata.Context.PortNumber,
-				data.Metadata.Title,
-			).Set(data.Metrics.ReceivedOpticalPower)
-
+			exportVolthaOnuPonOpticalStats(data)
 		case "Ethernet_UNI_History":
-			// ONU. Do nothing.
-
+			exportVolthaOnuEthernetUniStats(data)
 		case "FEC_History":
-			// ONU. Do Nothing.
+			exportVolthaOnuFecStats(data)
+		case "UNI_Status":
+			//  Do nothing.
 
-			volthaTxBytesTotal.WithLabelValues(
-				data.Metadata.LogicalDeviceID,
-				data.Metadata.SerialNumber,
-				data.Metadata.DeviceID,
-				data.Metadata.Context.InterfaceID,
-				data.Metadata.Context.PonID,
-				data.Metadata.Context.PortNumber,
-				data.Metadata.Title,
-			).Set(data.Metrics.TxBytes)
-
-			volthaRxBytesTotal.WithLabelValues(
-				data.Metadata.LogicalDeviceID,
-				data.Metadata.SerialNumber,
-				data.Metadata.DeviceID,
-				data.Metadata.Context.InterfaceID,
-				data.Metadata.Context.PonID,
-				data.Metadata.Context.PortNumber,
-				data.Metadata.Title,
-			).Set(data.Metrics.RxBytes)
-
-			volthaTxPacketsTotal.WithLabelValues(
-				data.Metadata.LogicalDeviceID,
-				data.Metadata.SerialNumber,
-				data.Metadata.DeviceID,
-				data.Metadata.Context.InterfaceID,
-				data.Metadata.Context.PonID,
-				data.Metadata.Context.PortNumber,
-				data.Metadata.Title,
-			).Set(data.Metrics.TxPackets)
-
-			volthaRxPacketsTotal.WithLabelValues(
-				data.Metadata.LogicalDeviceID,
-				data.Metadata.SerialNumber,
-				data.Metadata.DeviceID,
-				data.Metadata.Context.InterfaceID,
-				data.Metadata.Context.PonID,
-				data.Metadata.Context.PortNumber,
-				data.Metadata.Title,
-			).Set(data.Metrics.RxPackets)
-
-			volthaTxErrorPacketsTotal.WithLabelValues(
-				data.Metadata.LogicalDeviceID,
-				data.Metadata.SerialNumber,
-				data.Metadata.DeviceID,
-				data.Metadata.Context.InterfaceID,
-				data.Metadata.Context.PonID,
-				data.Metadata.Context.PortNumber,
-				data.Metadata.Title,
-			).Set(data.Metrics.TxErrorPackets)
-
-			volthaRxErrorPacketsTotal.WithLabelValues(
-				data.Metadata.LogicalDeviceID,
-				data.Metadata.SerialNumber,
-				data.Metadata.DeviceID,
-				data.Metadata.Context.InterfaceID,
-				data.Metadata.Context.PonID,
-				data.Metadata.Context.PortNumber,
-				data.Metadata.Title,
-			).Set(data.Metrics.RxErrorPackets)
-
-			// TODO add metrics for:
-			// TxBcastPackets
-			// TxUnicastPackets
-			// TxMulticastPackets
-			// RxBcastPackets
-			// RxMulticastPackets
-
-		case "voltha.internal":
-			// Voltha Internal. Do nothing.
 		}
 	}
 }
@@ -953,14 +1638,19 @@
 
 func export(topic *string, data []byte) {
 	switch *topic {
-	case "voltha.kpis":
-		kpi := VolthaKPI{}
-		err := json.Unmarshal(data, &kpi)
+	case "voltha.events":
+		event := voltha.Event{}
+		err := proto.Unmarshal(data, &event)
 		if err != nil {
 			logger.Error("Invalid msg on voltha.kpis: %s, Unprocessed Msg: %s", err.Error(), string(data))
 			break
 		}
-		exportVolthaKPI(kpi)
+		if event.GetHeader().GetType() == voltha.EventType_KPI_EVENT2 {
+			logger.Debug("KPI_EVENT2 received on voltha.events")
+			kpiEvent2 := event.GetKpiEvent2()
+			exportVolthaKPIevent2(kpiEvent2)
+		}
+
 	case "onos.kpis":
 		kpi := OnosKPI{}
 		err := json.Unmarshal(data, &kpi)