blob: 1713cfc00ed04d45f379d0a80bfc6eb5eac64ff4 [file] [log] [blame]
Matteo Scandoloaab36db2018-10-09 19:54:11 -07001// Copyright 2018 Open Networking Foundation
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package main
16
17import (
Ganesh Bhure8d0c9942019-05-24 11:42:09 +053018 "encoding/json"
Ganesh Bhure8d0c9942019-05-24 11:42:09 +053019 "gerrit.opencord.org/kafka-topic-exporter/common/logger"
Ganesh Bhure74fb7b02019-06-28 16:16:26 +053020 "github.com/prometheus/client_golang/prometheus"
Matteo Scandoloaab36db2018-10-09 19:54:11 -070021)
22
23var (
Ganesh Bhure8d0c9942019-05-24 11:42:09 +053024 // voltha kpis
Matteo Scandoloaab36db2018-10-09 19:54:11 -070025 volthaTxBytesTotal = prometheus.NewGaugeVec(
26 prometheus.GaugeOpts{
27 Name: "voltha_tx_bytes_total",
28 Help: "Number of total bytes transmitted",
29 },
30 []string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
31 )
32 volthaRxBytesTotal = prometheus.NewGaugeVec(
33 prometheus.GaugeOpts{
34 Name: "voltha_rx_bytes_total",
35 Help: "Number of total bytes received",
36 },
37 []string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
38 )
39 volthaTxPacketsTotal = prometheus.NewGaugeVec(
40 prometheus.GaugeOpts{
41 Name: "voltha_tx_packets_total",
42 Help: "Number of total packets transmitted",
43 },
44 []string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
45 )
46 volthaRxPacketsTotal = prometheus.NewGaugeVec(
47 prometheus.GaugeOpts{
48 Name: "voltha_rx_packets_total",
49 Help: "Number of total packets received",
50 },
51 []string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
52 )
53
54 volthaTxErrorPacketsTotal = prometheus.NewGaugeVec(
55 prometheus.GaugeOpts{
56 Name: "voltha_tx_error_packets_total",
57 Help: "Number of total transmitted packets error",
58 },
59 []string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
60 )
61
62 volthaRxErrorPacketsTotal = prometheus.NewGaugeVec(
63 prometheus.GaugeOpts{
64 Name: "voltha_rx_error_packets_total",
65 Help: "Number of total received packets error",
66 },
67 []string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
68 )
Ganesh Bhure8d0c9942019-05-24 11:42:09 +053069
Ganesh Bhure967018e2019-07-29 14:48:32 +053070 // optical parameters
71 VolthaOnuLaserBiasCurrent = prometheus.NewGaugeVec(
72 prometheus.GaugeOpts{
73 Name: "voltha_onu_laser_bias_current",
74 Help: "ONU Laser bias current value",
75 },
76 []string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
77 )
78
79 volthaOnuTemperature = prometheus.NewGaugeVec(
80 prometheus.GaugeOpts{
81 Name: "voltha_onu_temperature",
82 Help: "ONU temperature value",
83 },
84 []string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
85 )
86
87 VolthaOnuPowerFeedVoltage = prometheus.NewGaugeVec(
88 prometheus.GaugeOpts{
89 Name: "voltha_onu_power_feed_voltage",
90 Help: "ONU power feed voltage",
91 },
92 []string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
93 )
94
95 VolthaOnuMeanOpticalLaunchPower = prometheus.NewGaugeVec(
96 prometheus.GaugeOpts{
97 Name: "voltha_onu_mean_optical_launch_power",
98 Help: "ONU mean optical launch power",
99 },
100 []string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
101 )
102
103 VolthaOnuReceivedOpticalPower = prometheus.NewGaugeVec(
104 prometheus.GaugeOpts{
105 Name: "voltha_onu_received_optical_power",
106 Help: "ONU received optical power",
107 },
108 []string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
109 )
110
Ganesh Bhure8d0c9942019-05-24 11:42:09 +0530111 // onos kpis
112 onosTxBytesTotal = prometheus.NewGaugeVec(
113 prometheus.GaugeOpts{
114 Name: "onos_tx_bytes_total",
115 Help: "Number of total bytes transmitted",
116 },
117 []string{"device_id", "port_id"},
118 )
119 onosRxBytesTotal = prometheus.NewGaugeVec(
120 prometheus.GaugeOpts{
121 Name: "onos_rx_bytes_total",
122 Help: "Number of total bytes received",
123 },
124 []string{"device_id", "port_id"},
125 )
126 onosTxPacketsTotal = prometheus.NewGaugeVec(
127 prometheus.GaugeOpts{
128 Name: "onos_tx_packets_total",
129 Help: "Number of total packets transmitted",
130 },
131 []string{"device_id", "port_id"},
132 )
133 onosRxPacketsTotal = prometheus.NewGaugeVec(
134 prometheus.GaugeOpts{
135 Name: "onos_rx_packets_total",
136 Help: "Number of total packets received",
137 },
138 []string{"device_id", "port_id"},
139 )
140
141 onosTxDropPacketsTotal = prometheus.NewGaugeVec(
142 prometheus.GaugeOpts{
143 Name: "onos_tx_drop_packets_total",
144 Help: "Number of total transmitted packets dropped",
145 },
146 []string{"device_id", "port_id"},
147 )
148
149 onosRxDropPacketsTotal = prometheus.NewGaugeVec(
150 prometheus.GaugeOpts{
151 Name: "onos_rx_drop_packets_total",
152 Help: "Number of total received packets dropped",
153 },
154 []string{"device_id", "port_id"},
155 )
kartikey dubey72ef3b82019-05-27 06:50:04 +0000156
157 // onos.aaa kpis
158 onosaaaRxAcceptResponses = prometheus.NewGauge(
159 prometheus.GaugeOpts{
160 Name: "onosaaa_rx_accept_responses",
161 Help: "Number of access accept packets received from the server",
162 })
163 onosaaaRxRejectResponses = prometheus.NewGauge(
164 prometheus.GaugeOpts{
165 Name: "onosaaa_rx_reject_responses",
166 Help: "Number of access reject packets received from the server",
167 })
168 onosaaaRxChallengeResponses = prometheus.NewGauge(
169 prometheus.GaugeOpts{
170 Name: "onosaaa_rx_challenge_response",
171 Help: "Number of access challenge packets received from the server",
172 })
173 onosaaaTxAccessRequests = prometheus.NewGauge(
174 prometheus.GaugeOpts{
175 Name: "onosaaa_tx_access_requests",
176 Help: "Number of access request packets sent to the server",
177 })
178 onosaaaRxInvalidValidators = prometheus.NewGauge(
179 prometheus.GaugeOpts{
180 Name: "onosaaa_rx_invalid_validators",
181 Help: "Number of access response packets received from the server with an invalid validator",
182 })
183 onosaaaRxUnknownType = prometheus.NewGauge(
184 prometheus.GaugeOpts{
185 Name: "onosaaa_rx_unknown_type",
186 Help: "Number of packets of an unknown RADIUS type received from the accounting server",
187 })
188 onosaaaPendingRequests = prometheus.NewGauge(
189 prometheus.GaugeOpts{
190 Name: "onosaaa_pending_responses",
191 Help: "Number of access request packets pending a response from the server",
192 })
193 onosaaaRxDroppedResponses = prometheus.NewGauge(
194 prometheus.GaugeOpts{
195 Name: "onosaaa_rx_dropped_responses",
196 Help: "Number of dropped packets received from the accounting server",
197 })
198 onosaaaRxMalformedResponses = prometheus.NewGauge(
199 prometheus.GaugeOpts{
200 Name: "onosaaa_rx_malformed_responses",
201 Help: "Number of malformed access response packets received from the server",
202 })
203 onosaaaRxUnknownserver = prometheus.NewGauge(
204 prometheus.GaugeOpts{
205 Name: "onosaaa_rx_from_unknown_server",
206 Help: "Number of packets received from an unknown server",
207 })
208 onosaaaRequestRttMillis = prometheus.NewGauge(
209 prometheus.GaugeOpts{
210 Name: "onosaaa_request_rttmillis",
211 Help: "Roundtrip packet time to the accounting server in Miliseconds",
212 })
213 onosaaaRequestReTx = prometheus.NewGauge(
214 prometheus.GaugeOpts{
215 Name: "onosaaa_request_re_tx",
216 Help: "Number of access request packets retransmitted to the server",
217 })
Matteo Scandoloaab36db2018-10-09 19:54:11 -0700218)
219
220func exportVolthaKPI(kpi VolthaKPI) {
221
222 for _, data := range kpi.SliceDatas {
223 switch title := data.Metadata.Title; title {
224 case "Ethernet", "PON":
225 volthaTxBytesTotal.WithLabelValues(
226 data.Metadata.LogicalDeviceID,
227 data.Metadata.SerialNumber,
228 data.Metadata.DeviceID,
229 data.Metadata.Context.InterfaceID,
230 data.Metadata.Context.PonID,
231 data.Metadata.Context.PortNumber,
232 data.Metadata.Title,
233 ).Set(data.Metrics.TxBytes)
234
235 volthaRxBytesTotal.WithLabelValues(
236 data.Metadata.LogicalDeviceID,
237 data.Metadata.SerialNumber,
238 data.Metadata.DeviceID,
239 data.Metadata.Context.InterfaceID,
240 data.Metadata.Context.PonID,
241 data.Metadata.Context.PortNumber,
242 data.Metadata.Title,
243 ).Set(data.Metrics.RxBytes)
244
245 volthaTxPacketsTotal.WithLabelValues(
246 data.Metadata.LogicalDeviceID,
247 data.Metadata.SerialNumber,
248 data.Metadata.DeviceID,
249 data.Metadata.Context.InterfaceID,
250 data.Metadata.Context.PonID,
251 data.Metadata.Context.PortNumber,
252 data.Metadata.Title,
253 ).Set(data.Metrics.TxPackets)
254
255 volthaRxPacketsTotal.WithLabelValues(
256 data.Metadata.LogicalDeviceID,
257 data.Metadata.SerialNumber,
258 data.Metadata.DeviceID,
259 data.Metadata.Context.InterfaceID,
260 data.Metadata.Context.PonID,
261 data.Metadata.Context.PortNumber,
262 data.Metadata.Title,
263 ).Set(data.Metrics.RxPackets)
264
265 volthaTxErrorPacketsTotal.WithLabelValues(
266 data.Metadata.LogicalDeviceID,
267 data.Metadata.SerialNumber,
268 data.Metadata.DeviceID,
269 data.Metadata.Context.InterfaceID,
270 data.Metadata.Context.PonID,
271 data.Metadata.Context.PortNumber,
272 data.Metadata.Title,
273 ).Set(data.Metrics.TxErrorPackets)
274
275 volthaRxErrorPacketsTotal.WithLabelValues(
276 data.Metadata.LogicalDeviceID,
277 data.Metadata.SerialNumber,
278 data.Metadata.DeviceID,
279 data.Metadata.Context.InterfaceID,
280 data.Metadata.Context.PonID,
281 data.Metadata.Context.PortNumber,
282 data.Metadata.Title,
283 ).Set(data.Metrics.RxErrorPackets)
284
285 // TODO add metrics for:
286 // TxBcastPackets
287 // TxUnicastPackets
288 // TxMulticastPackets
289 // RxBcastPackets
290 // RxMulticastPackets
291
292 case "Ethernet_Bridge_Port_History":
293 if data.Metadata.Context.Upstream == "True" {
294 // ONU. Extended Ethernet statistics.
295 volthaTxPacketsTotal.WithLabelValues(
296 data.Metadata.LogicalDeviceID,
297 data.Metadata.SerialNumber,
298 data.Metadata.DeviceID,
299 "NA", // InterfaceID
300 "NA", // PonID
301 "NA", // PortNumber
302 data.Metadata.Title,
303 ).Add(data.Metrics.Packets)
304
305 volthaTxBytesTotal.WithLabelValues(
306 data.Metadata.LogicalDeviceID,
307 data.Metadata.SerialNumber,
308 data.Metadata.DeviceID,
309 "NA", // InterfaceID
310 "NA", // PonID
311 "NA", // PortNumber
312 data.Metadata.Title,
313 ).Add(data.Metrics.Octets)
314 } else {
315 // ONU. Extended Ethernet statistics.
316 volthaRxPacketsTotal.WithLabelValues(
317 data.Metadata.LogicalDeviceID,
318 data.Metadata.SerialNumber,
319 data.Metadata.DeviceID,
320 "NA", // InterfaceID
321 "NA", // PonID
322 "NA", // PortNumber
323 data.Metadata.Title,
324 ).Add(data.Metrics.Packets)
325
326 volthaRxBytesTotal.WithLabelValues(
327 data.Metadata.LogicalDeviceID,
328 data.Metadata.SerialNumber,
329 data.Metadata.DeviceID,
330 "NA", // InterfaceID
331 "NA", // PonID
332 "NA", // PortNumber
333 data.Metadata.Title,
334 ).Add(data.Metrics.Octets)
335 }
336
Ganesh Bhure967018e2019-07-29 14:48:32 +0530337 case "PON_Optical":
338 VolthaOnuLaserBiasCurrent.WithLabelValues(
339 data.Metadata.LogicalDeviceID,
340 data.Metadata.SerialNumber,
341 data.Metadata.DeviceID,
342 data.Metadata.Context.InterfaceID,
343 data.Metadata.Context.PonID,
344 data.Metadata.Context.PortNumber,
345 data.Metadata.Title,
346 ).Set(data.Metrics.LaserBiasCurrent)
347
348 volthaOnuTemperature.WithLabelValues(
349 data.Metadata.LogicalDeviceID,
350 data.Metadata.SerialNumber,
351 data.Metadata.DeviceID,
352 data.Metadata.Context.InterfaceID,
353 data.Metadata.Context.PonID,
354 data.Metadata.Context.PortNumber,
355 data.Metadata.Title,
356 ).Set(data.Metrics.Temperature)
357
358 VolthaOnuPowerFeedVoltage.WithLabelValues(
359 data.Metadata.LogicalDeviceID,
360 data.Metadata.SerialNumber,
361 data.Metadata.DeviceID,
362 data.Metadata.Context.InterfaceID,
363 data.Metadata.Context.PonID,
364 data.Metadata.Context.PortNumber,
365 data.Metadata.Title,
366 ).Set(data.Metrics.PowerFeedVoltage)
367
368 VolthaOnuMeanOpticalLaunchPower.WithLabelValues(
369 data.Metadata.LogicalDeviceID,
370 data.Metadata.SerialNumber,
371 data.Metadata.DeviceID,
372 data.Metadata.Context.InterfaceID,
373 data.Metadata.Context.PonID,
374 data.Metadata.Context.PortNumber,
375 data.Metadata.Title,
376 ).Set(data.Metrics.MeanOpticalLaunchPower)
377
378 VolthaOnuReceivedOpticalPower.WithLabelValues(
379 data.Metadata.LogicalDeviceID,
380 data.Metadata.SerialNumber,
381 data.Metadata.DeviceID,
382 data.Metadata.Context.InterfaceID,
383 data.Metadata.Context.PonID,
384 data.Metadata.Context.PortNumber,
385 data.Metadata.Title,
386 ).Set(data.Metrics.ReceivedOpticalPower)
387
388
Matteo Scandoloaab36db2018-10-09 19:54:11 -0700389 case "Ethernet_UNI_History":
390 // ONU. Do nothing.
391
392 case "FEC_History":
393 // ONU. Do Nothing.
394
395 volthaTxBytesTotal.WithLabelValues(
396 data.Metadata.LogicalDeviceID,
397 data.Metadata.SerialNumber,
398 data.Metadata.DeviceID,
399 data.Metadata.Context.InterfaceID,
400 data.Metadata.Context.PonID,
401 data.Metadata.Context.PortNumber,
402 data.Metadata.Title,
403 ).Set(data.Metrics.TxBytes)
404
405 volthaRxBytesTotal.WithLabelValues(
406 data.Metadata.LogicalDeviceID,
407 data.Metadata.SerialNumber,
408 data.Metadata.DeviceID,
409 data.Metadata.Context.InterfaceID,
410 data.Metadata.Context.PonID,
411 data.Metadata.Context.PortNumber,
412 data.Metadata.Title,
413 ).Set(data.Metrics.RxBytes)
414
415 volthaTxPacketsTotal.WithLabelValues(
416 data.Metadata.LogicalDeviceID,
417 data.Metadata.SerialNumber,
418 data.Metadata.DeviceID,
419 data.Metadata.Context.InterfaceID,
420 data.Metadata.Context.PonID,
421 data.Metadata.Context.PortNumber,
422 data.Metadata.Title,
423 ).Set(data.Metrics.TxPackets)
424
425 volthaRxPacketsTotal.WithLabelValues(
426 data.Metadata.LogicalDeviceID,
427 data.Metadata.SerialNumber,
428 data.Metadata.DeviceID,
429 data.Metadata.Context.InterfaceID,
430 data.Metadata.Context.PonID,
431 data.Metadata.Context.PortNumber,
432 data.Metadata.Title,
433 ).Set(data.Metrics.RxPackets)
434
435 volthaTxErrorPacketsTotal.WithLabelValues(
436 data.Metadata.LogicalDeviceID,
437 data.Metadata.SerialNumber,
438 data.Metadata.DeviceID,
439 data.Metadata.Context.InterfaceID,
440 data.Metadata.Context.PonID,
441 data.Metadata.Context.PortNumber,
442 data.Metadata.Title,
443 ).Set(data.Metrics.TxErrorPackets)
444
445 volthaRxErrorPacketsTotal.WithLabelValues(
446 data.Metadata.LogicalDeviceID,
447 data.Metadata.SerialNumber,
448 data.Metadata.DeviceID,
449 data.Metadata.Context.InterfaceID,
450 data.Metadata.Context.PonID,
451 data.Metadata.Context.PortNumber,
452 data.Metadata.Title,
453 ).Set(data.Metrics.RxErrorPackets)
454
455 // TODO add metrics for:
456 // TxBcastPackets
457 // TxUnicastPackets
458 // TxMulticastPackets
459 // RxBcastPackets
460 // RxMulticastPackets
461
462 case "voltha.internal":
463 // Voltha Internal. Do nothing.
464 }
465 }
466}
Ganesh Bhure8d0c9942019-05-24 11:42:09 +0530467
468func exportOnosKPI(kpi OnosKPI) {
469
470 for _, data := range kpi.Ports {
471
472 onosTxBytesTotal.WithLabelValues(
473 kpi.DeviceID,
474 data.PortID,
475 ).Set(data.TxBytes)
476
477 onosRxBytesTotal.WithLabelValues(
478 kpi.DeviceID,
479 data.PortID,
480 ).Set(data.RxBytes)
481
482 onosTxPacketsTotal.WithLabelValues(
483 kpi.DeviceID,
484 data.PortID,
485 ).Set(data.TxPackets)
486
487 onosRxPacketsTotal.WithLabelValues(
488 kpi.DeviceID,
489 data.PortID,
490 ).Set(data.RxPackets)
491
492 onosTxDropPacketsTotal.WithLabelValues(
493 kpi.DeviceID,
494 data.PortID,
495 ).Set(data.TxPacketsDrop)
496
497 onosRxDropPacketsTotal.WithLabelValues(
498 kpi.DeviceID,
499 data.PortID,
500 ).Set(data.RxPacketsDrop)
501 }
502}
503
504func exportImporterKPI(kpi ImporterKPI) {
505 // TODO: add metrics for importer data
506 logger.Info("To be implemented")
507}
508
kartikey dubey72ef3b82019-05-27 06:50:04 +0000509func exportOnosAaaKPI(kpi OnosAaaKPI) {
510
511 onosaaaRxAcceptResponses.Set(kpi.RxAcceptResponses)
512
513 onosaaaRxRejectResponses.Set(kpi.RxRejectResponses)
514
515 onosaaaRxChallengeResponses.Set(kpi.RxChallengeResponses)
516
517 onosaaaTxAccessRequests.Set(kpi.TxAccessRequests)
518
519 onosaaaRxInvalidValidators.Set(kpi.RxInvalidValidators)
520
521 onosaaaRxUnknownType.Set(kpi.RxUnknownType)
522
523 onosaaaPendingRequests.Set(kpi.PendingRequests)
524
525 onosaaaRxDroppedResponses.Set(kpi.RxDroppedResponses)
526
527 onosaaaRxMalformedResponses.Set(kpi.RxMalformedResponses)
528
529 onosaaaRxUnknownserver.Set(kpi.RxUnknownserver)
530
531 onosaaaRequestRttMillis.Set(kpi.RequestRttMillis)
532
533 onosaaaRequestReTx.Set(kpi.RequestReTx)
534}
535
Ganesh Bhure8d0c9942019-05-24 11:42:09 +0530536func export(topic *string, data []byte) {
537 switch *topic {
538 case "voltha.kpis":
539 kpi := VolthaKPI{}
540 err := json.Unmarshal(data, &kpi)
541 if err != nil {
Ganesh Bhure74fb7b02019-06-28 16:16:26 +0530542 logger.Error("Invalid msg on voltha.kpis: %s, Unprocessed Msg: %s", err.Error(), string(data))
Ganesh Bhure8d0c9942019-05-24 11:42:09 +0530543 }
544 exportVolthaKPI(kpi)
545 case "onos.kpis":
546 kpi := OnosKPI{}
547 err := json.Unmarshal(data, &kpi)
548 if err != nil {
Ganesh Bhure74fb7b02019-06-28 16:16:26 +0530549 logger.Error("Invalid msg on onos.kpis: %s, Unprocessed Msg: %s", err.Error(), string(data))
Ganesh Bhure8d0c9942019-05-24 11:42:09 +0530550 }
551 exportOnosKPI(kpi)
552 case "importer.kpis":
553 kpi := ImporterKPI{}
554 err := json.Unmarshal(data, &kpi)
555 if err != nil {
Ganesh Bhure74fb7b02019-06-28 16:16:26 +0530556 logger.Error("Invalid msg on importer.kpis: %s, Unprocessed Msg: %s", err.Error(), string(data))
Ganesh Bhure8d0c9942019-05-24 11:42:09 +0530557 }
558 exportImporterKPI(kpi)
kartikey dubey72ef3b82019-05-27 06:50:04 +0000559 case "onos.aaa.stats.kpis":
560 kpi := OnosAaaKPI{}
561 err := json.Unmarshal(data, &kpi)
562 if err != nil {
Ganesh Bhure74fb7b02019-06-28 16:16:26 +0530563 logger.Error("Invalid msg on onos.aaa.stats.kpis: %s, Unprocessed Msg: %s", err.Error(), string(data))
kartikey dubey72ef3b82019-05-27 06:50:04 +0000564 }
565 exportOnosAaaKPI(kpi)
Ganesh Bhure8d0c9942019-05-24 11:42:09 +0530566 default:
Ganesh Bhure74fb7b02019-06-28 16:16:26 +0530567 logger.Warn("Unexpected export. Topic [%s] not supported. Should not come here", *topic)
Ganesh Bhure8d0c9942019-05-24 11:42:09 +0530568 }
569}