This commit is contained in:
Will Jordan 2025-08-18 21:10:14 +08:00 committed by GitHub
commit ed5710721d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -24,6 +24,7 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/alecthomas/kingpin/v2"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs/blockdevice" "github.com/prometheus/procfs/blockdevice"
) )
@ -65,6 +66,10 @@ const (
udevSCSIIdentSerial = "SCSI_IDENT_SERIAL" udevSCSIIdentSerial = "SCSI_IDENT_SERIAL"
) )
var (
disableQueueStats = kingpin.Flag("collector.diskstats.disable-queue-stats", "disable queue stats").Default("false").Bool()
)
type typedFactorDesc struct { type typedFactorDesc struct {
desc *prometheus.Desc desc *prometheus.Desc
valueType prometheus.ValueType valueType prometheus.ValueType
@ -106,13 +111,16 @@ func NewDiskstatsCollector(logger *slog.Logger) (Collector, error) {
return nil, fmt.Errorf("failed to parse device filter flags: %w", err) return nil, fmt.Errorf("failed to parse device filter flags: %w", err)
} }
infoLabels := []string{"device", "major", "minor", "path", "wwn", "model", "serial", "revision"}
if !*disableQueueStats {
infoLabels = append(infoLabels, "rotational")
}
collector := diskstatsCollector{ collector := diskstatsCollector{
deviceFilter: deviceFilter, deviceFilter: deviceFilter,
fs: fs, fs: fs,
infoDesc: typedFactorDesc{ infoDesc: typedFactorDesc{
desc: prometheus.NewDesc(prometheus.BuildFQName(namespace, diskSubsystem, "info"), desc: prometheus.NewDesc(prometheus.BuildFQName(namespace, diskSubsystem, "info"),
"Info of /sys/block/<block_device>.", "Info of /sys/block/<block_device>.", infoLabels,
[]string{"device", "major", "minor", "path", "wwn", "model", "serial", "revision", "rotational"},
nil, nil,
), valueType: prometheus.GaugeValue, ), valueType: prometheus.GaugeValue,
}, },
@ -294,13 +302,8 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error {
serial = info[udevIDSerialShort] serial = info[udevIDSerialShort]
} }
queueStats, err := c.fs.SysBlockDeviceQueueStats(dev) labels := []string{
// Block Device Queue stats may not exist for all devices. dev,
if err != nil && !os.IsNotExist(err) {
c.logger.Debug("Failed to get block device queue stats", "device", dev, "err", err)
}
ch <- c.infoDesc.mustNewConstMetric(1.0, dev,
fmt.Sprint(stats.MajorNumber), fmt.Sprint(stats.MajorNumber),
fmt.Sprint(stats.MinorNumber), fmt.Sprint(stats.MinorNumber),
info[udevIDPath], info[udevIDPath],
@ -308,8 +311,18 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error {
info[udevIDModel], info[udevIDModel],
serial, serial,
info[udevIDRevision], info[udevIDRevision],
strconv.FormatUint(queueStats.Rotational, 2), }
)
if !*disableQueueStats {
queueStats, err := c.fs.SysBlockDeviceQueueStats(dev)
// Block Device Queue stats may not exist for all devices.
if err != nil && !os.IsNotExist(err) {
c.logger.Debug("Failed to get block device queue stats", "device", dev, "err", err)
}
labels = append(labels, strconv.FormatUint(queueStats.Rotational, 2))
}
ch <- c.infoDesc.mustNewConstMetric(1.0, labels...)
statCount := stats.IoStatsCount - 3 // Total diskstats record count, less MajorNumber, MinorNumber and DeviceName statCount := stats.IoStatsCount - 3 // Total diskstats record count, less MajorNumber, MinorNumber and DeviceName