diff --git a/pkg/collector/hwmon.go b/pkg/collector/hwmon.go index f1ec9f09..77ff9533 100644 --- a/pkg/collector/hwmon.go +++ b/pkg/collector/hwmon.go @@ -39,6 +39,7 @@ type hwmon struct { sensors []hwmonSensor name string chipName string + index string } type hwmonSensor struct { @@ -63,23 +64,23 @@ func NewHwmonCollector(logger *slog.Logger) (Collector, error) { metricDesc["power_input"] = prometheus.NewDesc( prometheus.BuildFQName(Namespace, hwmonCollectorSubSystem, "power_current_watts"), - "Current Power consumption in watts", []string{"hostname", "sensor", "chip", "chip_name"}, nil, + "Current Power consumption in watts", []string{"hostname", "index", "sensor", "chip", "chip_name"}, nil, ) metricDesc["power_input_lowest"] = prometheus.NewDesc( prometheus.BuildFQName(Namespace, hwmonCollectorSubSystem, "power_min_watts"), - "Minimum Power consumption in watts", []string{"hostname", "sensor", "chip", "chip_name"}, nil, + "Minimum Power consumption in watts", []string{"hostname", "index", "sensor", "chip", "chip_name"}, nil, ) metricDesc["power_input_highest"] = prometheus.NewDesc( prometheus.BuildFQName(Namespace, hwmonCollectorSubSystem, "power_max_watts"), - "Maximum Power consumption in watts", []string{"hostname", "sensor", "chip", "chip_name"}, nil, + "Maximum Power consumption in watts", []string{"hostname", "index", "sensor", "chip", "chip_name"}, nil, ) metricDesc["power_average"] = prometheus.NewDesc( prometheus.BuildFQName(Namespace, hwmonCollectorSubSystem, "power_avg_watts"), - "Average Power consumption in watts", []string{"hostname", "sensor", "chip", "chip_name"}, nil, + "Average Power consumption in watts", []string{"hostname", "index", "sensor", "chip", "chip_name"}, nil, ) metricDesc["energy_input"] = prometheus.NewDesc( prometheus.BuildFQName(Namespace, hwmonCollectorSubSystem, "energy_current_joules"), - "Current Energy consumption in joules", []string{"hostname", "sensor", "chip", "chip_name"}, nil, + "Current Energy consumption in joules", []string{"hostname", "index", "sensor", "chip", "chip_name"}, nil, ) hwmonCollector := &hwmonCollector{ @@ -116,6 +117,7 @@ func (c *hwmonCollector) Update(ch chan<- prometheus.Metric) error { prometheus.GaugeValue, val/1000000.0, c.hostname, + mon.index, fmt.Sprintf("%s%d", sensor.sensorType, sensor.sensorNum), mon.name, mon.chipName, @@ -215,6 +217,11 @@ func getHwmon(dir string) (*hwmon, error) { hwmon := &hwmon{dir: dir, name: hwmonName, sensors: sensors} + // Extract index from directory name (e.g., "hwmon1" -> "1") + if index, ok := strings.CutPrefix(filepath.Base(dir), "hwmon"); ok { + hwmon.index = index + } + hwmonChipName, err := hwmonHumanReadableChipName(dir) if err == nil { hwmon.chipName = hwmonChipName diff --git a/pkg/collector/hwmon_test.go b/pkg/collector/hwmon_test.go index c65cd7ae..e7678adf 100644 --- a/pkg/collector/hwmon_test.go +++ b/pkg/collector/hwmon_test.go @@ -90,6 +90,9 @@ func TestHwmonMetrics(t *testing.T) { gotValues[mon.name][sensor.sensorProperty][fmt.Sprintf("%s%d", sensor.sensorType, sensor.sensorNum)] = val } } + + // Verify index is extracted (should not be empty for hwmon devices) + assert.NotEmpty(t, mon.index, "Monitor index should not be empty") } assert.Equal(t, expectedHwmonValues, gotValues) diff --git a/pkg/collector/testdata/output/exporter/e2e-test-cgroupsv2-amd-ipmitool-output.txt b/pkg/collector/testdata/output/exporter/e2e-test-cgroupsv2-amd-ipmitool-output.txt index 19888b2c..33d6720a 100644 --- a/pkg/collector/testdata/output/exporter/e2e-test-cgroupsv2-amd-ipmitool-output.txt +++ b/pkg/collector/testdata/output/exporter/e2e-test-cgroupsv2-amd-ipmitool-output.txt @@ -157,24 +157,24 @@ ceems_cpu_seconds_total{hostname="",mode="user"} 3018.54 # TYPE ceems_exporter_build_info gauge # HELP ceems_hwmon_energy_current_joules Current Energy consumption in joules # TYPE ceems_hwmon_energy_current_joules gauge -ceems_hwmon_energy_current_joules{chip="socket",chip_name="socket",hostname="",sensor="energy1"} 22323 -ceems_hwmon_energy_current_joules{chip="socket",chip_name="socket",hostname="",sensor="energy2"} 9509 +ceems_hwmon_energy_current_joules{chip="socket",chip_name="socket",hostname="",index="4",sensor="energy1"} 22323 +ceems_hwmon_energy_current_joules{chip="socket",chip_name="socket",hostname="",index="4",sensor="energy2"} 9509 # HELP ceems_hwmon_power_avg_watts Average Power consumption in watts # TYPE ceems_hwmon_power_avg_watts gauge -ceems_hwmon_power_avg_watts{chip="socket",chip_name="socket",hostname="",sensor="power1"} 234 -ceems_hwmon_power_avg_watts{chip="socket",chip_name="socket",hostname="",sensor="power2"} 120 +ceems_hwmon_power_avg_watts{chip="socket",chip_name="socket",hostname="",index="4",sensor="power1"} 234 +ceems_hwmon_power_avg_watts{chip="socket",chip_name="socket",hostname="",index="4",sensor="power2"} 120 # HELP ceems_hwmon_power_current_watts Current Power consumption in watts # TYPE ceems_hwmon_power_current_watts gauge -ceems_hwmon_power_current_watts{chip="socket",chip_name="socket",hostname="",sensor="power1"} 270 -ceems_hwmon_power_current_watts{chip="socket",chip_name="socket",hostname="",sensor="power2"} 156 +ceems_hwmon_power_current_watts{chip="socket",chip_name="socket",hostname="",index="4",sensor="power1"} 270 +ceems_hwmon_power_current_watts{chip="socket",chip_name="socket",hostname="",index="4",sensor="power2"} 156 # HELP ceems_hwmon_power_max_watts Maximum Power consumption in watts # TYPE ceems_hwmon_power_max_watts gauge -ceems_hwmon_power_max_watts{chip="socket",chip_name="socket",hostname="",sensor="power1"} 328 -ceems_hwmon_power_max_watts{chip="socket",chip_name="socket",hostname="",sensor="power2"} 190 +ceems_hwmon_power_max_watts{chip="socket",chip_name="socket",hostname="",index="4",sensor="power1"} 328 +ceems_hwmon_power_max_watts{chip="socket",chip_name="socket",hostname="",index="4",sensor="power2"} 190 # HELP ceems_hwmon_power_min_watts Minimum Power consumption in watts # TYPE ceems_hwmon_power_min_watts gauge -ceems_hwmon_power_min_watts{chip="socket",chip_name="socket",hostname="",sensor="power1"} 65 -ceems_hwmon_power_min_watts{chip="socket",chip_name="socket",hostname="",sensor="power2"} 46 +ceems_hwmon_power_min_watts{chip="socket",chip_name="socket",hostname="",index="4",sensor="power1"} 65 +ceems_hwmon_power_min_watts{chip="socket",chip_name="socket",hostname="",index="4",sensor="power2"} 46 # HELP ceems_ipmi_dcmi_power_avg_watts Average power consumption reported by DCMI in watts # TYPE ceems_ipmi_dcmi_power_avg_watts gauge ceems_ipmi_dcmi_power_avg_watts{hostname=""} 2567