Browse Source

go.d sensors add parsing intrusion to exec method (#18449)

Ilya Mashchenko 6 months ago
parent
commit
3809018556

+ 4 - 2
src/go/plugin/go.d/modules/sensors/charts.go

@@ -121,8 +121,8 @@ var sensorIntrusionChartTmpl = module.Chart{
 	Type:     module.Line,
 	Priority: prioSensorIntrusion,
 	Dims: module.Dims{
-		{ID: "sensor_chip_%s_feature_%s_subfeature_%s_alarm_off", Name: "alarm_off"},
-		{ID: "sensor_chip_%s_feature_%s_subfeature_%s_alarm_on", Name: "alarm_on"},
+		{ID: "sensor_chip_%s_feature_%s_subfeature_%s_clear", Name: "alarm_clear"},
+		{ID: "sensor_chip_%s_feature_%s_subfeature_%s_triggered", Name: "alarm_triggered"},
 	},
 }
 
@@ -144,6 +144,8 @@ func (s *Sensors) addExecSensorChart(sn execSensor) {
 		chart = sensorCurrentChartTmpl.Copy()
 	case sensorTypeEnergy:
 		chart = sensorEnergyChartTmpl.Copy()
+	case sensorTypeIntrusion:
+		chart = sensorIntrusionChartTmpl.Copy()
 	default:
 		return
 	}

+ 27 - 15
src/go/plugin/go.d/modules/sensors/collect_exec.go

@@ -12,13 +12,14 @@ import (
 )
 
 const (
-	sensorTypeTemp     = "temperature"
-	sensorTypeVoltage  = "voltage"
-	sensorTypePower    = "power"
-	sensorTypeHumidity = "humidity"
-	sensorTypeFan      = "fan"
-	sensorTypeCurrent  = "current"
-	sensorTypeEnergy   = "energy"
+	sensorTypeTemp      = "temperature"
+	sensorTypeVoltage   = "voltage"
+	sensorTypePower     = "power"
+	sensorTypeHumidity  = "humidity"
+	sensorTypeFan       = "fan"
+	sensorTypeCurrent   = "current"
+	sensorTypeEnergy    = "energy"
+	sensorTypeIntrusion = "intrusion"
 )
 
 type execSensor struct {
@@ -36,6 +37,8 @@ func (s *execSensor) sensorType() string {
 	switch {
 	case strings.HasPrefix(s.subfeature, "temp"):
 		return sensorTypeTemp
+	case strings.HasPrefix(s.subfeature, "intrusion"):
+		return sensorTypeIntrusion
 	case strings.HasPrefix(s.subfeature, "in"):
 		return sensorTypeVoltage
 	case strings.HasPrefix(s.subfeature, "power"):
@@ -96,9 +99,18 @@ func (s *Sensors) collectExec() (map[string]int64, error) {
 	seen := make(map[string]bool)
 
 	for _, sn := range sensors {
-		sx := "_input"
-		if sn.sensorType() == sensorTypePower {
+		var sx string
+
+		switch sn.sensorType() {
+		case "":
+			s.Debugf("can not find type for sensor '%s'", sn)
+			continue
+		case sensorTypePower:
 			sx = "_average"
+		case sensorTypeIntrusion:
+			sx = "_alarm"
+		default:
+			sx = "_input"
 		}
 
 		if !strings.HasSuffix(sn.subfeature, sx) {
@@ -112,11 +124,6 @@ func (s *Sensors) collectExec() (map[string]int64, error) {
 			continue
 		}
 
-		if sn.sensorType() == "" {
-			s.Debugf("can not find type for sensor '%s'", sn)
-			continue
-		}
-
 		if minVal, maxVal, ok := sn.limits(); ok && (v < minVal || v > maxVal) {
 			s.Debugf("value outside limits [%d/%d] for sensor '%s'", int64(minVal), int64(maxVal), sn)
 			continue
@@ -132,7 +139,12 @@ func (s *Sensors) collectExec() (map[string]int64, error) {
 
 		seen[key] = true
 
-		mx[key] = int64(v * precision)
+		if sn.sensorType() == sensorTypeIntrusion {
+			mx[key+"_triggered"] = boolToInt(v != 0)
+			mx[key+"_clear"] = boolToInt(v == 0)
+		} else {
+			mx[key] = int64(v * precision)
+		}
 	}
 
 	for k := range s.sensors {

+ 2 - 2
src/go/plugin/go.d/modules/sensors/collect_sysfs.go

@@ -50,8 +50,8 @@ func (s *Sensors) collectSysfs() (map[string]int64, error) {
 				mx[key] = int64(v.Input * precision)
 			case *lmsensors.IntrusionSensor:
 				key = snakeCase(fmt.Sprintf("sensor_chip_%s_feature_%s_subfeature_%s_alarm", dev.Name, firstNotEmpty(v.Label, v.Name), v.Name))
-				mx[key+"_on"] = boolToInt(v.Alarm)
-				mx[key+"_off"] = boolToInt(!v.Alarm)
+				mx[key+"_triggered"] = boolToInt(v.Alarm)
+				mx[key+"_clear"] = boolToInt(!v.Alarm)
 			default:
 				s.Debugf("unexpected sensor type: %T", v)
 				continue

+ 7 - 0
src/go/plugin/go.d/modules/sensors/metadata.yaml

@@ -157,3 +157,10 @@ modules:
               chart_type: area
               dimensions:
                 - name: humidity
+            - name: sensors.sensor_intrusion
+              description: Sensor intrusion
+              unit: status
+              chart_type: line
+              dimensions:
+                - name: alarm_clear
+                - name: alarm_triggered

+ 23 - 52
src/go/plugin/go.d/modules/sensors/sensors_test.go

@@ -18,8 +18,7 @@ var (
 	dataConfigJSON, _ = os.ReadFile("testdata/config.json")
 	dataConfigYAML, _ = os.ReadFile("testdata/config.yaml")
 
-	dataSensorsTemp, _               = os.ReadFile("testdata/sensors-temp.txt")
-	dataSensorsTempInCurrPowerFan, _ = os.ReadFile("testdata/sensors-temp-in-curr-power-fan.txt")
+	dataSensors, _ = os.ReadFile("testdata/sensors.txt")
 )
 
 func Test_testDataIsValid(t *testing.T) {
@@ -27,8 +26,7 @@ func Test_testDataIsValid(t *testing.T) {
 		"dataConfigJSON": dataConfigJSON,
 		"dataConfigYAML": dataConfigYAML,
 
-		"dataSensorsTemp":               dataSensorsTemp,
-		"dataSensorsTempInCurrPowerFan": dataSensorsTempInCurrPowerFan,
+		"dataSensors": dataSensors,
 	} {
 		require.NotNil(t, data, name)
 
@@ -84,7 +82,7 @@ func TestSensors_Cleanup(t *testing.T) {
 		"after check": {
 			prepare: func() *Sensors {
 				sensors := New()
-				sensors.exec = prepareMockExecOkOnlyTemp()
+				sensors.exec = prepareMockExecOk()
 				_ = sensors.Check()
 				return sensors
 			},
@@ -92,7 +90,7 @@ func TestSensors_Cleanup(t *testing.T) {
 		"after collect": {
 			prepare: func() *Sensors {
 				sensors := New()
-				sensors.exec = prepareMockExecOkTempInCurrPowerFan()
+				sensors.exec = prepareMockExecOk()
 				_ = sensors.Collect()
 				return sensors
 			},
@@ -119,11 +117,7 @@ func TestSensors_Check(t *testing.T) {
 	}{
 		"exec: only temperature": {
 			wantFail:    false,
-			prepareMock: prepareMockExecOkOnlyTemp,
-		},
-		"exec: temperature and voltage": {
-			wantFail:    false,
-			prepareMock: prepareMockExecOkTempInCurrPowerFan,
+			prepareMock: prepareMockExecOk,
 		},
 		"exec: error on sensors info call": {
 			wantFail:    true,
@@ -161,39 +155,9 @@ func TestSensors_Collect(t *testing.T) {
 		wantMetrics      map[string]int64
 		wantCharts       int
 	}{
-		"exec: only temperature": {
-			prepareExecMock: prepareMockExecOkOnlyTemp,
-			wantCharts:      24,
-			wantMetrics: map[string]int64{
-				"sensor_chip_bnxt_en-pci-6200_feature_temp1_subfeature_temp1_input":  80000,
-				"sensor_chip_bnxt_en-pci-6201_feature_temp1_subfeature_temp1_input":  81000,
-				"sensor_chip_k10temp-pci-00c3_feature_tccd1_subfeature_temp3_input":  58250,
-				"sensor_chip_k10temp-pci-00c3_feature_tccd2_subfeature_temp4_input":  60250,
-				"sensor_chip_k10temp-pci-00c3_feature_tccd3_subfeature_temp5_input":  57000,
-				"sensor_chip_k10temp-pci-00c3_feature_tccd4_subfeature_temp6_input":  57250,
-				"sensor_chip_k10temp-pci-00c3_feature_tccd5_subfeature_temp7_input":  57750,
-				"sensor_chip_k10temp-pci-00c3_feature_tccd6_subfeature_temp8_input":  59500,
-				"sensor_chip_k10temp-pci-00c3_feature_tccd7_subfeature_temp9_input":  58500,
-				"sensor_chip_k10temp-pci-00c3_feature_tccd8_subfeature_temp10_input": 61250,
-				"sensor_chip_k10temp-pci-00c3_feature_tctl_subfeature_temp1_input":   62000,
-				"sensor_chip_k10temp-pci-00cb_feature_tccd1_subfeature_temp3_input":  54000,
-				"sensor_chip_k10temp-pci-00cb_feature_tccd2_subfeature_temp4_input":  55500,
-				"sensor_chip_k10temp-pci-00cb_feature_tccd3_subfeature_temp5_input":  56000,
-				"sensor_chip_k10temp-pci-00cb_feature_tccd4_subfeature_temp6_input":  52750,
-				"sensor_chip_k10temp-pci-00cb_feature_tccd5_subfeature_temp7_input":  53500,
-				"sensor_chip_k10temp-pci-00cb_feature_tccd6_subfeature_temp8_input":  55250,
-				"sensor_chip_k10temp-pci-00cb_feature_tccd7_subfeature_temp9_input":  53000,
-				"sensor_chip_k10temp-pci-00cb_feature_tccd8_subfeature_temp10_input": 53750,
-				"sensor_chip_k10temp-pci-00cb_feature_tctl_subfeature_temp1_input":   57500,
-				"sensor_chip_nouveau-pci-4100_feature_temp1_subfeature_temp1_input":  51000,
-				"sensor_chip_nvme-pci-0100_feature_composite_subfeature_temp1_input": 39850,
-				"sensor_chip_nvme-pci-6100_feature_composite_subfeature_temp1_input": 48850,
-				"sensor_chip_nvme-pci-8100_feature_composite_subfeature_temp1_input": 39850,
-			},
-		},
 		"exec: multiple sensors": {
-			prepareExecMock: prepareMockExecOkTempInCurrPowerFan,
-			wantCharts:      20,
+			prepareExecMock: prepareMockExecOk,
+			wantCharts:      22,
 			wantMetrics: map[string]int64{
 				"sensor_chip_acpitz-acpi-0_feature_temp1_subfeature_temp1_input":                        88000,
 				"sensor_chip_amdgpu-pci-0300_feature_edge_subfeature_temp1_input":                       53000,
@@ -210,6 +174,10 @@ func TestSensors_Collect(t *testing.T) {
 				"sensor_chip_asus-isa-0000_feature_gpu_fan_subfeature_fan2_input":                       6600000,
 				"sensor_chip_bat0-acpi-0_feature_in0_subfeature_in0_input":                              17365,
 				"sensor_chip_k10temp-pci-00c3_feature_tctl_subfeature_temp1_input":                      90000,
+				"sensor_chip_nct6779-isa-0290_feature_intrusion0_subfeature_intrusion0_alarm_clear":     0,
+				"sensor_chip_nct6779-isa-0290_feature_intrusion0_subfeature_intrusion0_alarm_triggered": 1,
+				"sensor_chip_nct6779-isa-0290_feature_intrusion1_subfeature_intrusion1_alarm_clear":     0,
+				"sensor_chip_nct6779-isa-0290_feature_intrusion1_subfeature_intrusion1_alarm_triggered": 1,
 				"sensor_chip_nvme-pci-0600_feature_composite_subfeature_temp1_input":                    33850,
 				"sensor_chip_nvme-pci-0600_feature_sensor_1_subfeature_temp2_input":                     48850,
 				"sensor_chip_nvme-pci-0600_feature_sensor_2_subfeature_temp3_input":                     33850,
@@ -232,7 +200,7 @@ func TestSensors_Collect(t *testing.T) {
 
 		"sysfs: multiple sensors": {
 			prepareSysfsMock: prepareMockSysfsScannerOk,
-			wantCharts:       20,
+			wantCharts:       21,
 			wantMetrics: map[string]int64{
 				"sensor_chip_acpitz-acpi-0_feature_temp1_subfeature_temp1_input":                        88000,
 				"sensor_chip_amdgpu-pci-0300_feature_edge_subfeature_temp1_input":                       53000,
@@ -247,6 +215,8 @@ func TestSensors_Collect(t *testing.T) {
 				"sensor_chip_amdgpu-pci-6700_feature_vddnb_subfeature_in1_input":                        973,
 				"sensor_chip_asus-isa-0000_feature_cpu_fan_subfeature_fan1_input":                       5700000,
 				"sensor_chip_asus-isa-0000_feature_gpu_fan_subfeature_fan2_input":                       6600000,
+				"sensor_chip_asus-isa-0000_feature_intrusion0_subfeature_intrusion0_alarm_clear":        0,
+				"sensor_chip_asus-isa-0000_feature_intrusion0_subfeature_intrusion0_alarm_triggered":    1,
 				"sensor_chip_bat0-acpi-0_feature_in0_subfeature_in0_input":                              17365,
 				"sensor_chip_k10temp-pci-00c3_feature_tctl_subfeature_temp1_input":                      90000,
 				"sensor_chip_nvme-pci-0600_feature_composite_subfeature_temp1_input":                    33850,
@@ -265,6 +235,7 @@ func TestSensors_Collect(t *testing.T) {
 	for name, test := range tests {
 		t.Run(name, func(t *testing.T) {
 			sensors := New()
+
 			if test.prepareExecMock != nil {
 				sensors.exec = test.prepareExecMock()
 			} else if test.prepareSysfsMock != nil {
@@ -274,6 +245,7 @@ func TestSensors_Collect(t *testing.T) {
 			}
 
 			var mx map[string]int64
+
 			for i := 0; i < 10; i++ {
 				mx = sensors.Collect()
 			}
@@ -289,15 +261,9 @@ func TestSensors_Collect(t *testing.T) {
 	}
 }
 
-func prepareMockExecOkOnlyTemp() *mockSensorsBinary {
-	return &mockSensorsBinary{
-		sensorsInfoData: dataSensorsTemp,
-	}
-}
-
-func prepareMockExecOkTempInCurrPowerFan() *mockSensorsBinary {
+func prepareMockExecOk() *mockSensorsBinary {
 	return &mockSensorsBinary{
-		sensorsInfoData: dataSensorsTempInCurrPowerFan,
+		sensorsInfoData: dataSensors,
 	}
 }
 
@@ -348,6 +314,11 @@ func prepareMockSysfsScannerOk() *mockSysfsScanner {
 					Label: "gpu_fan",
 					Input: 6600,
 				},
+				&lmsensors.IntrusionSensor{
+					Name:  "intrusion0",
+					Label: "intrusion0",
+					Alarm: true,
+				},
 			}},
 			{Name: "nvme-pci-0600", Sensors: []lmsensors.Sensor{
 				&lmsensors.TemperatureSensor{

+ 0 - 81
src/go/plugin/go.d/modules/sensors/testdata/sensors-temp.txt

@@ -1,81 +0,0 @@
-k10temp-pci-00cb
-Tctl:
-  temp1_input: 57.500
-Tccd1:
-  temp3_input: 54.000
-Tccd2:
-  temp4_input: 55.500
-Tccd3:
-  temp5_input: 56.000
-Tccd4:
-  temp6_input: 52.750
-Tccd5:
-  temp7_input: 53.500
-Tccd6:
-  temp8_input: 55.250
-Tccd7:
-  temp9_input: 53.000
-Tccd8:
-  temp10_input: 53.750
-
-bnxt_en-pci-6201
-temp1:
-  temp1_input: 81.000
-
-nvme-pci-6100
-Composite:
-  temp1_input: 48.850
-  temp1_max: 89.850
-  temp1_min: -20.150
-  temp1_crit: 94.850
-  temp1_alarm: 0.000
-
-nvme-pci-0100
-Composite:
-  temp1_input: 39.850
-  temp1_max: 89.850
-  temp1_min: -20.150
-  temp1_crit: 94.850
-  temp1_alarm: 0.000
-
-nouveau-pci-4100
-temp1:
-  temp1_input: 51.000
-  temp1_max: 95.000
-  temp1_max_hyst: 3.000
-  temp1_crit: 105.000
-  temp1_crit_hyst: 5.000
-  temp1_emergency: 135.000
-  temp1_emergency_hyst: 5.000
-
-k10temp-pci-00c3
-Tctl:
-  temp1_input: 62.000
-Tccd1:
-  temp3_input: 58.250
-Tccd2:
-  temp4_input: 60.250
-Tccd3:
-  temp5_input: 57.000
-Tccd4:
-  temp6_input: 57.250
-Tccd5:
-  temp7_input: 57.750
-Tccd6:
-  temp8_input: 59.500
-Tccd7:
-  temp9_input: 58.500
-Tccd8:
-  temp10_input: 61.250
-
-bnxt_en-pci-6200
-temp1:
-  temp1_input: 80.000
-
-nvme-pci-8100
-Composite:
-  temp1_input: 39.850
-  temp1_max: 89.850
-  temp1_min: -20.150
-  temp1_crit: 94.850
-  temp1_alarm: 0.000

+ 7 - 0
src/go/plugin/go.d/modules/sensors/testdata/sensors-temp-in-curr-power-fan.txt → src/go/plugin/go.d/modules/sensors/testdata/sensors.txt

@@ -70,3 +70,10 @@ PPT:
 acpitz-acpi-0
 temp1:
   temp1_input: 88.000
+nct6779-isa-0290
+intrusion0:
+  intrusion0_alarm: 1.000
+  intrusion0_beep: 0.000
+intrusion1:
+  intrusion1_alarm: 1.000
+  intrusion1_beep: 0.000