@cryptotaxi247 / netdata-1 / commits / 380901855

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