Skip to content

Commit

Permalink
diskstats_linux: always scale reads and writes by 512 bytes, not by d…
Browse files Browse the repository at this point in the history
…evice units.

Signed-off-by: W. Andrew Denton <git@flying-snail.net>
  • Loading branch information
W. Andrew Denton authored and discordianfish committed Mar 22, 2022
1 parent e9feae9 commit 84ce3a0
Showing 1 changed file with 5 additions and 10 deletions.
15 changes: 5 additions & 10 deletions collector/diskstats_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ import (

const (
secondsPerTick = 1.0 / 1000.0

// Read sectors and write sectors are the "standard UNIX 512-byte sectors, not any device- or filesystem-specific block size.
unixSectorSize = 512.0
)

var (
Expand Down Expand Up @@ -195,26 +198,18 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error {
continue
}

diskSectorSize := 512.0
blockQueue, err := c.fs.SysBlockDeviceQueueStats(dev)
if err != nil {
level.Debug(c.logger).Log("msg", "Error getting queue stats", "device", dev, "err", err)
} else {
diskSectorSize = float64(blockQueue.LogicalBlockSize)
}

ch <- c.infoDesc.mustNewConstMetric(1.0, dev, fmt.Sprint(stats.MajorNumber), fmt.Sprint(stats.MinorNumber))

statCount := stats.IoStatsCount - 3 // Total diskstats record count, less MajorNumber, MinorNumber and DeviceName

for i, val := range []float64{
float64(stats.ReadIOs),
float64(stats.ReadMerges),
float64(stats.ReadSectors) * diskSectorSize,
float64(stats.ReadSectors) * unixSectorSize,
float64(stats.ReadTicks) * secondsPerTick,
float64(stats.WriteIOs),
float64(stats.WriteMerges),
float64(stats.WriteSectors) * diskSectorSize,
float64(stats.WriteSectors) * unixSectorSize,
float64(stats.WriteTicks) * secondsPerTick,
float64(stats.IOsInProgress),
float64(stats.IOsTotalTicks) * secondsPerTick,
Expand Down

0 comments on commit 84ce3a0

Please sign in to comment.