diff --git a/collector/fixtures/e2e-output.txt b/collector/fixtures/e2e-output.txt index ccd927d0..3b57cb33 100644 --- a/collector/fixtures/e2e-output.txt +++ b/collector/fixtures/e2e-output.txt @@ -549,6 +549,11 @@ node_filefd_maximum 1.631329e+06 # HELP node_forks Total number of forks. # TYPE node_forks counter node_forks 26442 +# HELP node_hwmon_chip_names Annotation metric for human-readable chip names +# TYPE node_hwmon_chip_names gauge +node_hwmon_chip_names{chip="nct6779",chip_name="nct6779"} 1 +node_hwmon_chip_names{chip="platform_coretemp_0",chip_name="coretemp"} 1 +node_hwmon_chip_names{chip="platform_coretemp_1",chip_name="coretemp"} 1 # HELP node_hwmon_fan_alarm Hardware sensor alarm status (fan) # TYPE node_hwmon_fan_alarm gauge node_hwmon_fan_alarm{chip="nct6779",sensor="fan2"} 0 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