go.d sensors add parsing intrusion to exec method (#18449)
Ilya Mashchenko committed
Sep 1, 2024 at 10:13 UTC
38090185560164cd72149151051d073dbad6cb91
7 files changed
+70
-152
src/go/plugin/go.d/modules/sensors/charts.go
+4
-2
@@ -121,8 +121,8 @@ var sensorIntrusionChartTmpl = module.Chart{
121
Type: module.Line,
122
Priority: prioSensorIntrusion,
123
Dims: module.Dims{
124
- {ID: "sensor_chip_%s_feature_%s_subfeature_%s_alarm_off", Name: "alarm_off"},
125
- {ID: "sensor_chip_%s_feature_%s_subfeature_%s_alarm_on", Name: "alarm_on"},
124
+ {ID: "sensor_chip_%s_feature_%s_subfeature_%s_clear", Name: "alarm_clear"},
125
+ {ID: "sensor_chip_%s_feature_%s_subfeature_%s_triggered", Name: "alarm_triggered"},
126
},
127
}
128
@@ -144,6 +144,8 @@ func (s *Sensors) addExecSensorChart(sn execSensor) {
144
chart = sensorCurrentChartTmpl.Copy()
145
case sensorTypeEnergy:
146
chart = sensorEnergyChartTmpl.Copy()
147
+ case sensorTypeIntrusion:
148
+ chart = sensorIntrusionChartTmpl.Copy()
149
default:
150
return
151
}
src/go/plugin/go.d/modules/sensors/collect_exec.go
+27
-15
@@ -12,13 +12,14 @@ import (
12
)
13
14
const (
15
- sensorTypeTemp = "temperature"
16
- sensorTypeVoltage = "voltage"
17
- sensorTypePower = "power"
18
- sensorTypeHumidity = "humidity"
19
- sensorTypeFan = "fan"
20
- sensorTypeCurrent = "current"
21
- sensorTypeEnergy = "energy"
15
+ sensorTypeTemp = "temperature"
16
+ sensorTypeVoltage = "voltage"
17
+ sensorTypePower = "power"
18
+ sensorTypeHumidity = "humidity"
19
+ sensorTypeFan = "fan"
20
+ sensorTypeCurrent = "current"
21
+ sensorTypeEnergy = "energy"
22
+ sensorTypeIntrusion = "intrusion"
23
)
24
25
type execSensor struct {
@@ -36,6 +37,8 @@ func (s *execSensor) sensorType() string {
37
switch {
38
case strings.HasPrefix(s.subfeature, "temp"):
39
return sensorTypeTemp
40
+ case strings.HasPrefix(s.subfeature, "intrusion"):
41
+ return sensorTypeIntrusion
42
case strings.HasPrefix(s.subfeature, "in"):
43
return sensorTypeVoltage
44
case strings.HasPrefix(s.subfeature, "power"):
@@ -96,9 +99,18 @@ func (s *Sensors) collectExec() (map[string]int64, error) {
99
seen := make(map[string]bool)
100
101
for _, sn := range sensors {
99
- sx := "_input"
100
- if sn.sensorType() == sensorTypePower {
102
+ var sx string
103
+
104
+ switch sn.sensorType() {
105
+ case "":
106
+ s.Debugf("can not find type for sensor '%s'", sn)
107
+ continue
108
+ case sensorTypePower:
109
sx = "_average"
110
+ case sensorTypeIntrusion:
111
+ sx = "_alarm"
112
+ default:
113
+ sx = "_input"
114
}
115
116
if !strings.HasSuffix(sn.subfeature, sx) {
@@ -112,11 +124,6 @@ func (s *Sensors) collectExec() (map[string]int64, error) {
124
continue
125
}
126
115
- if sn.sensorType() == "" {
116
- s.Debugf("can not find type for sensor '%s'", sn)
117
- continue
118
- }
119
-
127
if minVal, maxVal, ok := sn.limits(); ok && (v < minVal || v > maxVal) {
128
s.Debugf("value outside limits [%d/%d] for sensor '%s'", int64(minVal), int64(maxVal), sn)
129
continue
@@ -132,7 +139,12 @@ func (s *Sensors) collectExec() (map[string]int64, error) {
139
140
seen[key] = true
141
135
- mx[key] = int64(v * precision)
142
+ if sn.sensorType() == sensorTypeIntrusion {
143
+ mx[key+"_triggered"] = boolToInt(v != 0)
144
+ mx[key+"_clear"] = boolToInt(v == 0)
145
+ } else {
146
+ mx[key] = int64(v * precision)
147
+ }
148
}
149
150
for k := range s.sensors {
src/go/plugin/go.d/modules/sensors/collect_sysfs.go
+2
-2
@@ -50,8 +50,8 @@ func (s *Sensors) collectSysfs() (map[string]int64, error) {
50
mx[key] = int64(v.Input * precision)
51
case *lmsensors.IntrusionSensor:
52
key = snakeCase(fmt.Sprintf("sensor_chip_%s_feature_%s_subfeature_%s_alarm", dev.Name, firstNotEmpty(v.Label, v.Name), v.Name))
53
- mx[key+"_on"] = boolToInt(v.Alarm)
54
- mx[key+"_off"] = boolToInt(!v.Alarm)
53
+ mx[key+"_triggered"] = boolToInt(v.Alarm)
54
+ mx[key+"_clear"] = boolToInt(!v.Alarm)
55
default:
56
s.Debugf("unexpected sensor type: %T", v)
57
continue
src/go/plugin/go.d/modules/sensors/metadata.yaml
+7
@@ -157,3 +157,10 @@ modules:
157
chart_type: area
158
dimensions:
159
- name: humidity
160
+ - name: sensors.sensor_intrusion
161
+ description: Sensor intrusion
162
+ unit: status
163
+ chart_type: line
164
+ dimensions:
165
+ - name: alarm_clear
166
+ - name: alarm_triggered
src/go/plugin/go.d/modules/sensors/sensors_test.go
+23
-52
@@ -18,8 +18,7 @@ var (
18
dataConfigJSON, _ = os.ReadFile("testdata/config.json")
19
dataConfigYAML, _ = os.ReadFile("testdata/config.yaml")
20
21
- dataSensorsTemp, _ = os.ReadFile("testdata/sensors-temp.txt")
22
- dataSensorsTempInCurrPowerFan, _ = os.ReadFile("testdata/sensors-temp-in-curr-power-fan.txt")
21
+ dataSensors, _ = os.ReadFile("testdata/sensors.txt")
22
)
23
24
func Test_testDataIsValid(t *testing.T) {
@@ -27,8 +26,7 @@ func Test_testDataIsValid(t *testing.T) {
26
"dataConfigJSON": dataConfigJSON,
27
"dataConfigYAML": dataConfigYAML,
28
30
- "dataSensorsTemp": dataSensorsTemp,
31
- "dataSensorsTempInCurrPowerFan": dataSensorsTempInCurrPowerFan,
29
+ "dataSensors": dataSensors,
30
} {
31
require.NotNil(t, data, name)
32
@@ -84,7 +82,7 @@ func TestSensors_Cleanup(t *testing.T) {
82
"after check": {
83
prepare: func() *Sensors {
84
sensors := New()
87
- sensors.exec = prepareMockExecOkOnlyTemp()
85
+ sensors.exec = prepareMockExecOk()
86
_ = sensors.Check()
87
return sensors
88
},
@@ -92,7 +90,7 @@ func TestSensors_Cleanup(t *testing.T) {
90
"after collect": {
91
prepare: func() *Sensors {
92
sensors := New()
95
- sensors.exec = prepareMockExecOkTempInCurrPowerFan()
93
+ sensors.exec = prepareMockExecOk()
94
_ = sensors.Collect()
95
return sensors
96
},
@@ -119,11 +117,7 @@ func TestSensors_Check(t *testing.T) {
117
}{
118
"exec: only temperature": {
119
wantFail: false,
122
- prepareMock: prepareMockExecOkOnlyTemp,
123
- },
124
- "exec: temperature and voltage": {
125
- wantFail: false,
126
- prepareMock: prepareMockExecOkTempInCurrPowerFan,
120
+ prepareMock: prepareMockExecOk,
121
},
122
"exec: error on sensors info call": {
123
wantFail: true,
@@ -161,39 +155,9 @@ func TestSensors_Collect(t *testing.T) {
155
wantMetrics map[string]int64
156
wantCharts int
157
}{
164
- "exec: only temperature": {
165
- prepareExecMock: prepareMockExecOkOnlyTemp,
166
- wantCharts: 24,
167
- wantMetrics: map[string]int64{
168
- "sensor_chip_bnxt_en-pci-6200_feature_temp1_subfeature_temp1_input": 80000,
169
- "sensor_chip_bnxt_en-pci-6201_feature_temp1_subfeature_temp1_input": 81000,
170
- "sensor_chip_k10temp-pci-00c3_feature_tccd1_subfeature_temp3_input": 58250,
171
- "sensor_chip_k10temp-pci-00c3_feature_tccd2_subfeature_temp4_input": 60250,
172
- "sensor_chip_k10temp-pci-00c3_feature_tccd3_subfeature_temp5_input": 57000,
173
- "sensor_chip_k10temp-pci-00c3_feature_tccd4_subfeature_temp6_input": 57250,
174
- "sensor_chip_k10temp-pci-00c3_feature_tccd5_subfeature_temp7_input": 57750,
175
- "sensor_chip_k10temp-pci-00c3_feature_tccd6_subfeature_temp8_input": 59500,
176
- "sensor_chip_k10temp-pci-00c3_feature_tccd7_subfeature_temp9_input": 58500,
177
- "sensor_chip_k10temp-pci-00c3_feature_tccd8_subfeature_temp10_input": 61250,
178
- "sensor_chip_k10temp-pci-00c3_feature_tctl_subfeature_temp1_input": 62000,
179
- "sensor_chip_k10temp-pci-00cb_feature_tccd1_subfeature_temp3_input": 54000,
180
- "sensor_chip_k10temp-pci-00cb_feature_tccd2_subfeature_temp4_input": 55500,
181
- "sensor_chip_k10temp-pci-00cb_feature_tccd3_subfeature_temp5_input": 56000,
182
- "sensor_chip_k10temp-pci-00cb_feature_tccd4_subfeature_temp6_input": 52750,
183
- "sensor_chip_k10temp-pci-00cb_feature_tccd5_subfeature_temp7_input": 53500,
184
- "sensor_chip_k10temp-pci-00cb_feature_tccd6_subfeature_temp8_input": 55250,
185
- "sensor_chip_k10temp-pci-00cb_feature_tccd7_subfeature_temp9_input": 53000,
186
- "sensor_chip_k10temp-pci-00cb_feature_tccd8_subfeature_temp10_input": 53750,
187
- "sensor_chip_k10temp-pci-00cb_feature_tctl_subfeature_temp1_input": 57500,
188
- "sensor_chip_nouveau-pci-4100_feature_temp1_subfeature_temp1_input": 51000,
189
- "sensor_chip_nvme-pci-0100_feature_composite_subfeature_temp1_input": 39850,
190
- "sensor_chip_nvme-pci-6100_feature_composite_subfeature_temp1_input": 48850,
191
- "sensor_chip_nvme-pci-8100_feature_composite_subfeature_temp1_input": 39850,
192
- },
193
- },
158
"exec: multiple sensors": {
195
- prepareExecMock: prepareMockExecOkTempInCurrPowerFan,
196
- wantCharts: 20,
159
+ prepareExecMock: prepareMockExecOk,
160
+ wantCharts: 22,
161
wantMetrics: map[string]int64{
162
"sensor_chip_acpitz-acpi-0_feature_temp1_subfeature_temp1_input": 88000,
163
"sensor_chip_amdgpu-pci-0300_feature_edge_subfeature_temp1_input": 53000,
@@ -210,6 +174,10 @@ func TestSensors_Collect(t *testing.T) {
174
"sensor_chip_asus-isa-0000_feature_gpu_fan_subfeature_fan2_input": 6600000,
175
"sensor_chip_bat0-acpi-0_feature_in0_subfeature_in0_input": 17365,
176
"sensor_chip_k10temp-pci-00c3_feature_tctl_subfeature_temp1_input": 90000,
177
+ "sensor_chip_nct6779-isa-0290_feature_intrusion0_subfeature_intrusion0_alarm_clear": 0,
178
+ "sensor_chip_nct6779-isa-0290_feature_intrusion0_subfeature_intrusion0_alarm_triggered": 1,
179
+ "sensor_chip_nct6779-isa-0290_feature_intrusion1_subfeature_intrusion1_alarm_clear": 0,
180
+ "sensor_chip_nct6779-isa-0290_feature_intrusion1_subfeature_intrusion1_alarm_triggered": 1,
181
"sensor_chip_nvme-pci-0600_feature_composite_subfeature_temp1_input": 33850,
182
"sensor_chip_nvme-pci-0600_feature_sensor_1_subfeature_temp2_input": 48850,
183
"sensor_chip_nvme-pci-0600_feature_sensor_2_subfeature_temp3_input": 33850,
@@ -232,7 +200,7 @@ func TestSensors_Collect(t *testing.T) {
200
201
"sysfs: multiple sensors": {
202
prepareSysfsMock: prepareMockSysfsScannerOk,
235
- wantCharts: 20,
203
+ wantCharts: 21,
204
wantMetrics: map[string]int64{
205
"sensor_chip_acpitz-acpi-0_feature_temp1_subfeature_temp1_input": 88000,
206
"sensor_chip_amdgpu-pci-0300_feature_edge_subfeature_temp1_input": 53000,
@@ -247,6 +215,8 @@ func TestSensors_Collect(t *testing.T) {
215
"sensor_chip_amdgpu-pci-6700_feature_vddnb_subfeature_in1_input": 973,
216
"sensor_chip_asus-isa-0000_feature_cpu_fan_subfeature_fan1_input": 5700000,
217
"sensor_chip_asus-isa-0000_feature_gpu_fan_subfeature_fan2_input": 6600000,
218
+ "sensor_chip_asus-isa-0000_feature_intrusion0_subfeature_intrusion0_alarm_clear": 0,
219
+ "sensor_chip_asus-isa-0000_feature_intrusion0_subfeature_intrusion0_alarm_triggered": 1,
220
"sensor_chip_bat0-acpi-0_feature_in0_subfeature_in0_input": 17365,
221
"sensor_chip_k10temp-pci-00c3_feature_tctl_subfeature_temp1_input": 90000,
222
"sensor_chip_nvme-pci-0600_feature_composite_subfeature_temp1_input": 33850,
@@ -265,6 +235,7 @@ func TestSensors_Collect(t *testing.T) {
235
for name, test := range tests {
236
t.Run(name, func(t *testing.T) {
237
sensors := New()
238
+
239
if test.prepareExecMock != nil {
240
sensors.exec = test.prepareExecMock()
241
} else if test.prepareSysfsMock != nil {
@@ -274,6 +245,7 @@ func TestSensors_Collect(t *testing.T) {
245
}
246
247
var mx map[string]int64
248
+
249
for i := 0; i < 10; i++ {
250
mx = sensors.Collect()
251
}
@@ -289,15 +261,9 @@ func TestSensors_Collect(t *testing.T) {
261
}
262
}
263
292
-func prepareMockExecOkOnlyTemp() *mockSensorsBinary {
293
- return &mockSensorsBinary{
294
- sensorsInfoData: dataSensorsTemp,
295
- }
296
-}
297
-
298
-func prepareMockExecOkTempInCurrPowerFan() *mockSensorsBinary {
264
+func prepareMockExecOk() *mockSensorsBinary {
265
return &mockSensorsBinary{
300
- sensorsInfoData: dataSensorsTempInCurrPowerFan,
266
+ sensorsInfoData: dataSensors,
267
}
268
}
269
@@ -348,6 +314,11 @@ func prepareMockSysfsScannerOk() *mockSysfsScanner {
314
Label: "gpu_fan",
315
Input: 6600,
316
},
317
+ &lmsensors.IntrusionSensor{
318
+ Name: "intrusion0",
319
+ Label: "intrusion0",
320
+ Alarm: true,
321
+ },
322
}},
323
{Name: "nvme-pci-0600", Sensors: []lmsensors.Sensor{
324
&lmsensors.TemperatureSensor{
src/go/plugin/go.d/modules/sensors/testdata/sensors-temp.txt
deleted
-81
@@ -1,81 +0,0 @@
1
-k10temp-pci-00cb
2
-Tctl:
3
- temp1_input: 57.500
4
-Tccd1:
5
- temp3_input: 54.000
6
-Tccd2:
7
- temp4_input: 55.500
8
-Tccd3:
9
- temp5_input: 56.000
10
-Tccd4:
11
- temp6_input: 52.750
12
-Tccd5:
13
- temp7_input: 53.500
14
-Tccd6:
15
- temp8_input: 55.250
16
-Tccd7:
17
- temp9_input: 53.000
18
-Tccd8:
19
- temp10_input: 53.750
20
-
21
-bnxt_en-pci-6201
22
-temp1:
23
- temp1_input: 81.000
24
-
25
-nvme-pci-6100
26
-Composite:
27
- temp1_input: 48.850
28
- temp1_max: 89.850
29
- temp1_min: -20.150
30
- temp1_crit: 94.850
31
- temp1_alarm: 0.000
32
-
33
-nvme-pci-0100
34
-Composite:
35
- temp1_input: 39.850
36
- temp1_max: 89.850
37
- temp1_min: -20.150
38
- temp1_crit: 94.850
39
- temp1_alarm: 0.000
40
-
41
-nouveau-pci-4100
42
-temp1:
43
- temp1_input: 51.000
44
- temp1_max: 95.000
45
- temp1_max_hyst: 3.000
46
- temp1_crit: 105.000
47
- temp1_crit_hyst: 5.000
48
- temp1_emergency: 135.000
49
- temp1_emergency_hyst: 5.000
50
-
51
-k10temp-pci-00c3
52
-Tctl:
53
- temp1_input: 62.000
54
-Tccd1:
55
- temp3_input: 58.250
56
-Tccd2:
57
- temp4_input: 60.250
58
-Tccd3:
59
- temp5_input: 57.000
60
-Tccd4:
61
- temp6_input: 57.250
62
-Tccd5:
63
- temp7_input: 57.750
64
-Tccd6:
65
- temp8_input: 59.500
66
-Tccd7:
67
- temp9_input: 58.500
68
-Tccd8:
69
- temp10_input: 61.250
70
-
71
-bnxt_en-pci-6200
72
-temp1:
73
- temp1_input: 80.000
74
-
75
-nvme-pci-8100
76
-Composite:
77
- temp1_input: 39.850
78
- temp1_max: 89.850
79
- temp1_min: -20.150
80
- temp1_crit: 94.850
81
- temp1_alarm: 0.000
src/go/plugin/go.d/modules/sensors/testdata/sensors.txt
renamed
+7
@@ -70,3 +70,10 @@ PPT:
70
acpitz-acpi-0
71
temp1:
72
temp1_input: 88.000
73
+nct6779-isa-0290
74
+intrusion0:
75
+ intrusion0_alarm: 1.000
76
+ intrusion0_beep: 0.000
77
+intrusion1:
78
+ intrusion1_alarm: 1.000
79
+ intrusion1_beep: 0.000