From 9ec7d6ba3c2c4c8dc3c70d5ea5248221585788e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Knecht?= Date: Thu, 16 Jun 2022 11:40:51 +0200 Subject: [PATCH] collector/diskstats: Only get device properties from udev MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When parsing udev data, skip lines that don't start with `E:`. Lines prefixed with `E:` represent device properties, as documented in udevadm(8). Signed-off-by: BenoƮt Knecht --- collector/diskstats_linux.go | 64 +++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 26 deletions(-) diff --git a/collector/diskstats_linux.go b/collector/diskstats_linux.go index 83247828..961be248 100644 --- a/collector/diskstats_linux.go +++ b/collector/diskstats_linux.go @@ -38,28 +38,31 @@ const ( diskstatsDefaultIgnoredDevices = "^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\\d+n\\d+p)\\d+$" - // udev attributes - udevDMLVLayer = "E:DM_LV_LAYER" - udevDMLVName = "E:DM_LV_NAME" - udevDMName = "E:DM_NAME" - udevDMUUID = "E:DM_UUID" - udevDMVGName = "E:DM_VG_NAME" - udevIDATA = "E:ID_ATA" - udevIDATARotationRateRPM = "E:ID_ATA_ROTATION_RATE_RPM" - udevIDATASATA = "E:ID_ATA_SATA" - udevIDATASATASignalRateGen1 = "E:ID_ATA_SATA_SIGNAL_RATE_GEN1" - udevIDATASATASignalRateGen2 = "E:ID_ATA_SATA_SIGNAL_RATE_GEN2" - udevIDATAWriteCache = "E:ID_ATA_WRITE_CACHE" - udevIDATAWriteCacheEnabled = "E:ID_ATA_WRITE_CACHE_ENABLED" - udevIDFSType = "E:ID_FS_TYPE" - udevIDFSUsage = "E:ID_FS_USAGE" - udevIDFSUUID = "E:ID_FS_UUID" - udevIDFSVersion = "E:ID_FS_VERSION" - udevIDModel = "E:ID_MODEL" - udevIDPath = "E:ID_PATH" - udevIDRevision = "E:ID_REVISION" - udevIDSerialShort = "E:ID_SERIAL_SHORT" - udevIDWWN = "E:ID_WWN" + // See udevadm(8). + udevDevicePropertyPrefix = "E:" + + // Udev device properties. + udevDMLVLayer = "DM_LV_LAYER" + udevDMLVName = "DM_LV_NAME" + udevDMName = "DM_NAME" + udevDMUUID = "DM_UUID" + udevDMVGName = "DM_VG_NAME" + udevIDATA = "ID_ATA" + udevIDATARotationRateRPM = "ID_ATA_ROTATION_RATE_RPM" + udevIDATASATA = "ID_ATA_SATA" + udevIDATASATASignalRateGen1 = "ID_ATA_SATA_SIGNAL_RATE_GEN1" + udevIDATASATASignalRateGen2 = "ID_ATA_SATA_SIGNAL_RATE_GEN2" + udevIDATAWriteCache = "ID_ATA_WRITE_CACHE" + udevIDATAWriteCacheEnabled = "ID_ATA_WRITE_CACHE_ENABLED" + udevIDFSType = "ID_FS_TYPE" + udevIDFSUsage = "ID_FS_USAGE" + udevIDFSUUID = "ID_FS_UUID" + udevIDFSVersion = "ID_FS_VERSION" + udevIDModel = "ID_MODEL" + udevIDPath = "ID_PATH" + udevIDRevision = "ID_REVISION" + udevIDSerialShort = "ID_SERIAL_SHORT" + udevIDWWN = "ID_WWN" ) type typedFactorDesc struct { @@ -268,7 +271,7 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error { continue } - info, err := udevDeviceInformation(stats.MajorNumber, stats.MinorNumber) + info, err := getUdevDeviceProperties(stats.MajorNumber, stats.MinorNumber) if err != nil { level.Error(c.logger).Log("msg", "Failed to parse udev info", "err", err) } @@ -348,7 +351,7 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error { return nil } -func udevDeviceInformation(major, minor uint32) (udevInfo, error) { +func getUdevDeviceProperties(major, minor uint32) (udevInfo, error) { filename := udevDataFilePath(fmt.Sprintf("b%d:%d", major, minor)) data, err := os.Open(filename) @@ -361,13 +364,22 @@ func udevDeviceInformation(major, minor uint32) (udevInfo, error) { scanner := bufio.NewScanner(data) for scanner.Scan() { + line := scanner.Text() + + // We're only interested in device properties. + if !strings.HasPrefix(line, udevDevicePropertyPrefix) { + continue + } + + line = strings.TrimPrefix(line, udevDevicePropertyPrefix) + /* TODO: After we drop support for Go 1.17, the condition below can be simplified to: - if name, value, found := strings.Cut(scanner.Text(), "="); found { + if name, value, found := strings.Cut(line, "="); found { info[name] = value } */ - if fields := strings.SplitN(scanner.Text(), "=", 2); len(fields) == 2 { + if fields := strings.SplitN(line, "=", 2); len(fields) == 2 { info[fields[0]] = fields[1] } }