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