diff --git a/collector/hwmon_linux.go b/collector/hwmon_linux.go index d879aca9..ef4b7272 100644 --- a/collector/hwmon_linux.go +++ b/collector/hwmon_linux.go @@ -36,6 +36,7 @@ var ( hwmonInvalidMetricChars = regexp.MustCompile("[^a-z0-9:_]") hwmonFilenameFormat = regexp.MustCompile(`^(?P[^0-9]+)(?P[0-9]*)?(_(?P.+))?$`) hwmonLabelDesc = []string{"chip", "sensor"} + hwmonChipNameLabelDesc = []string{"chip", "chip_name"} hwmonSensorTypes = []string{ "vrm", "beep_enable", "update_interval", "in", "cpu", "fan", "pwm", "temp", "curr", "power", "energy", "humidity", @@ -143,6 +144,26 @@ func (c *hwMonCollector) updateHwmon(ch chan<- prometheus.Metric, dir string) (e } } + hwmonChipName, err := c.hwmonHumanReadableChipName(dir) + + if err == nil { + // sensor chip metadata + desc := prometheus.NewDesc( + "node_hwmon_chip_names", + "Annotation metric for human-readable chip names", + hwmonChipNameLabelDesc, + nil, + ) + + ch <- prometheus.MustNewConstMetric( + desc, + prometheus.GaugeValue, + 1.0, + hwmonName, + hwmonChipName, + ) + } + // format all sensors for sensor, sensorData := range data { @@ -351,6 +372,27 @@ func (c *hwMonCollector) hwmonName(dir string) (string, error) { return "", errors.New("Could not derive a monitoring name for " + dir) } +func (c *hwMonCollector) hwmonHumanReadableChipName(dir string) (string, error) { + // this is similar to the methods in hwmonName, but with different + // precedences -- we can allow duplicates here. + + // preference 1: is there a name file + + sysnameRaw, nameErr := ioutil.ReadFile(path.Join(dir, "name")) + if nameErr != nil { + return "", nameErr + } + + if string(sysnameRaw) != "" { + cleanName := cleanMetricName(string(sysnameRaw)) + if cleanName != "" { + return cleanName, nil + } + } + + return "", errors.New("Could not derive a human-readable chip type for " + dir) +} + func (c *hwMonCollector) Update(ch chan<- prometheus.Metric) (err error) { // Step 1: scan /sys/class/hwmon, resolve all symlinks and call // updatesHwmon for each folder