Re-introduce human-readable chip types

The chip label generation has been changed in #334 to prefer the
unique device path (e.g. the location on the PCI bus) due to #333.

Here, a new annotation metric ``node_hwmon_chip_names`` is
introduced which allows to link the unique chip sysfs path to a
human-readable chip name which may not be unique among chip sysfs
paths (for example, dual-slot systems have multiple
chipType="coretemp" sensors).

This allows to mitigate the downsides of the solution to #333
(namely that the device path may not be stable across kernels and
reboots) for cases where it does not matter that multiple devices
may have the same human-readable name (e.g. aggregation or where
at most one device with a common chip name is present).

For cases where no human-readable name can be derived, the
annotation metric is not emitted.
This commit is contained in:
Jonas Wielicki 2016-11-29 11:53:29 +01:00 committed by Jonas Wielicki
parent 006d1c7922
commit c481dd19da
1 changed files with 42 additions and 0 deletions

View File

@ -36,6 +36,7 @@ var (
hwmonInvalidMetricChars = regexp.MustCompile("[^a-z0-9:_]") hwmonInvalidMetricChars = regexp.MustCompile("[^a-z0-9:_]")
hwmonFilenameFormat = regexp.MustCompile(`^(?P<type>[^0-9]+)(?P<id>[0-9]*)?(_(?P<property>.+))?$`) hwmonFilenameFormat = regexp.MustCompile(`^(?P<type>[^0-9]+)(?P<id>[0-9]*)?(_(?P<property>.+))?$`)
hwmonLabelDesc = []string{"chip", "sensor"} hwmonLabelDesc = []string{"chip", "sensor"}
hwmonChipNameLabelDesc = []string{"chip", "chip_name"}
hwmonSensorTypes = []string{ hwmonSensorTypes = []string{
"vrm", "beep_enable", "update_interval", "in", "cpu", "fan", "vrm", "beep_enable", "update_interval", "in", "cpu", "fan",
"pwm", "temp", "curr", "power", "energy", "humidity", "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 // format all sensors
for sensor, sensorData := range data { 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) 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) { func (c *hwMonCollector) Update(ch chan<- prometheus.Metric) (err error) {
// Step 1: scan /sys/class/hwmon, resolve all symlinks and call // Step 1: scan /sys/class/hwmon, resolve all symlinks and call
// updatesHwmon for each folder // updatesHwmon for each folder