@cryptotaxi247 / netdata-1 / commits / 25a587f97

fix(go.d/upsd): remove UPS load charts if UPS load not found (#19457)

Ilya Mashchenko committed Jan 22, 2025 at 10:12 UTC 25a587f9798100b4fbcae9fd1810fabe8b4ed3d3
2 files changed +71 -18
src/go/plugin/go.d/collector/upsd/charts.go
+4
@@ -334,6 +334,9 @@ func (c *Collector) addUPSCharts(ups upsUnit) {
334
335 var removed []string
336 for _, v := range []struct{ v, id string }{
337 + {varUpsLoad, upsLoadChartTmpl.ID},
338 + {varUpsLoad, upsLoadUsageChartTmpl.ID},
339 +
340 {varBatteryVoltage, upsBatteryVoltageChartTmpl.ID},
341 {varBatteryVoltageNominal, upsBatteryVoltageNominalChartTmpl.ID},
342
@@ -362,6 +365,7 @@ func (c *Collector) addUPSCharts(ups upsUnit) {
365 c.Debugf("UPS '%s' no metrics: %v", ups.name, removed)
366
367 name := cleanUpsName(ups.name)
368 +
369 for _, chart := range *charts {
370 chart.ID = fmt.Sprintf(chart.ID, name)
371 chart.Labels = []module.Label{
src/go/plugin/go.d/collector/upsd/collector_test.go
+67 -18
@@ -170,6 +170,25 @@ func TestCollector_Collect(t *testing.T) {
170 "ups_cp1500_ups.status.RB": 0,
171 "ups_cp1500_ups.status.TRIM": 0,
172 "ups_cp1500_ups.status.other": 0,
173 + "ups_cp1600_battery.charge": 10000,
174 + "ups_cp1600_battery.runtime": 197000,
175 + "ups_cp1600_battery.voltage": 5480,
176 + "ups_cp1600_battery.voltage.nominal": 4800,
177 + "ups_cp1600_ups.status.BOOST": 0,
178 + "ups_cp1600_ups.status.BYPASS": 0,
179 + "ups_cp1600_ups.status.CAL": 0,
180 + "ups_cp1600_ups.status.CHRG": 0,
181 + "ups_cp1600_ups.status.DISCHRG": 0,
182 + "ups_cp1600_ups.status.FSD": 0,
183 + "ups_cp1600_ups.status.HB": 0,
184 + "ups_cp1600_ups.status.LB": 0,
185 + "ups_cp1600_ups.status.OB": 0,
186 + "ups_cp1600_ups.status.OFF": 0,
187 + "ups_cp1600_ups.status.OL": 1,
188 + "ups_cp1600_ups.status.OVER": 0,
189 + "ups_cp1600_ups.status.RB": 0,
190 + "ups_cp1600_ups.status.TRIM": 0,
191 + "ups_cp1600_ups.status.other": 0,
192 "ups_pr3000_battery.charge": 10000,
193 "ups_pr3000_battery.runtime": 110800,
194 "ups_pr3000_battery.voltage": 5990,
@@ -196,7 +215,7 @@ func TestCollector_Collect(t *testing.T) {
215 "ups_pr3000_ups.status.TRIM": 0,
216 "ups_pr3000_ups.status.other": 0,
217 },
199 - wantCharts: 20,
218 + wantCharts: 25,
219 wantConnConnect: true,
220 wantConnDisconnect: false,
221 wantConnAuthenticate: false,
@@ -255,10 +274,12 @@ func TestCollector_Collect(t *testing.T) {
274 mx := collr.Collect(context.Background())
275
276 assert.Equal(t, test.wantCollected, mx)
277 +
278 assert.Equalf(t, test.wantCharts, len(*collr.Charts()), "number of charts")
279 if len(test.wantCollected) > 0 {
260 - ensureCollectedHasAllChartsDims(t, collr, mx)
280 + module.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
281 }
282 +
283 assert.Equalf(t, test.wantConnConnect, mock.calledConnect, "calledConnect")
284 assert.Equalf(t, test.wantConnDisconnect, mock.calledDisconnect, "calledDisconnect")
285 assert.Equal(t, test.wantConnAuthenticate, mock.calledAuthenticate, "calledAuthenticate")
@@ -266,22 +287,6 @@ func TestCollector_Collect(t *testing.T) {
287 }
288 }
289
269 -func ensureCollectedHasAllChartsDims(t *testing.T, collr *Collector, mx map[string]int64) {
270 - for _, chart := range *collr.Charts() {
271 - if chart.Obsolete {
272 - continue
273 - }
274 - for _, dim := range chart.Dims {
275 - _, ok := mx[dim.ID]
276 - assert.Truef(t, ok, "collected metrics has no data for dim '%s' chart '%s'", dim.ID, chart.ID)
277 - }
278 - for _, v := range chart.Vars {
279 - _, ok := mx[v.ID]
280 - assert.Truef(t, ok, "collected metrics has no data for var '%s' chart '%s'", v.ID, chart.ID)
281 - }
282 - }
283 -}
284 -
290 func prepareMockConnOK() *mockUpsdConn {
291 return &mockUpsdConn{}
292 }
@@ -441,6 +446,50 @@ func (m *mockUpsdConn) upsUnits() ([]upsUnit, error) {
446 "ups.vendorid": "0764",
447 },
448 },
449 + {
450 + name: "cp1600",
451 + vars: map[string]string{
452 + "battery.charge": "100",
453 + "battery.charge.low": "10",
454 + "battery.charge.warning": "50",
455 + "battery.runtime": "1970",
456 + "battery.runtime.low": "150",
457 + "battery.type": "PbAc",
458 + "battery.voltage": "54.8",
459 + "battery.voltage.nominal": "48.0",
460 + "device.mfr": "American Power Conversion",
461 + "device.model": "Smart-UPS X 1500",
462 + "device.serial": "****************",
463 + "device.type": "ups",
464 + "driver.name": "usbhid-ups",
465 + "driver.parameter.bus": "001",
466 + "driver.parameter.pollfreq": "30",
467 + "driver.parameter.pollinterval": "2",
468 + "driver.parameter.port": "auto",
469 + "driver.parameter.product": "Smart-UPS X 1500 FW:UPS 09.8 / ID=20",
470 + "driver.parameter.productid": "0003",
471 + "driver.parameter.serial": "****************",
472 + "driver.parameter.synchronous": "auto",
473 + "driver.parameter.vendor": "American Power Conversion",
474 + "driver.parameter.vendorid": "051D",
475 + "driver.version": "2.8.0",
476 + "driver.version.data": "APC HID 0.98",
477 + "driver.version.internal": "0.47",
478 + "driver.version.usb": "libusb-1.0.26 (API: 0x1000109)",
479 + "ups.beeper.status": "enabled",
480 + "ups.delay.shutdown": "20",
481 + "ups.firmware": "UPS 09.8 / ID=20",
482 + "ups.mfr": "American Power Conversion",
483 + "ups.mfr.date": "2019/01/12",
484 + "ups.model": "Smart-UPS X 1500",
485 + "ups.productid": "0003",
486 + "ups.serial": "****************",
487 + "ups.status": "OL",
488 + "ups.timer.reboot": "-1",
489 + "ups.timer.shutdown": "-1",
490 + "ups.vendorid": "051d",
491 + },
492 + },
493 }
494
495 return upsUnits, nil