Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions collector/diskstats_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,11 @@ package collector

import (
"bufio"
"errors"
"fmt"
"log/slog"
"os"
"sort"
"strconv"
"strings"

Expand Down Expand Up @@ -74,6 +76,7 @@ type diskstatsCollector struct {
descs []typedDesc
filesystemInfoDesc typedDesc
deviceMapperInfoDesc typedDesc
deviceMapperBackingDesc typedDesc
ataDescs map[string]typedDesc
logger *slog.Logger
getUdevDeviceProperties func(uint32, uint32) (udevInfo, error)
Expand Down Expand Up @@ -224,6 +227,13 @@ func NewDiskstatsCollector(logger *slog.Logger) (Collector, error) {
nil,
), valueType: prometheus.GaugeValue,
},
deviceMapperBackingDesc: typedDesc{
desc: prometheus.NewDesc(prometheus.BuildFQName(namespace, diskSubsystem, "device_mapper_backing_device_info"),
"Info about the underlying block devices of a device mapper device.",
[]string{"device", "backing_device"},
nil,
), valueType: prometheus.GaugeValue,
},
ataDescs: map[string]typedDesc{
udevIDATAWriteCache: {
desc: prometheus.NewDesc(prometheus.BuildFQName(namespace, diskSubsystem, "ata_write_cache"),
Expand Down Expand Up @@ -351,6 +361,7 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error {
info[udevDMLVName],
info[udevDMLVLayer],
)
c.updateDeviceMapperBackingDevices(ch, dev)
}

if ata := info[udevIDATA]; ata != "" {
Expand Down Expand Up @@ -397,6 +408,23 @@ func rotationalLabel(fs blockdevice.FS, dev string) string {
return "0"
}

func (c *diskstatsCollector) updateDeviceMapperBackingDevices(ch chan<- prometheus.Metric, dev string) {
underlying, err := c.fs.SysBlockDeviceUnderlyingDevices(dev)
if err != nil {
if errors.Is(err, os.ErrNotExist) {
c.logger.Debug("Failed to get device mapper backing devices", "device", dev, "err", err)
}
return
}

sort.Strings(underlying.DeviceNames)
for _, backingDevice := range underlying.DeviceNames {
ch <- c.deviceMapperBackingDesc.mustNewConstMetric(1.0, dev,
backingDevice,
)
}
}

func getUdevDeviceProperties(major, minor uint32) (udevInfo, error) {
filename := udevDataFilePath(fmt.Sprintf("b%d:%d", major, minor))

Expand Down
8 changes: 8 additions & 0 deletions collector/diskstats_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,14 @@ node_disk_ata_write_cache{device="sdc"} 1
node_disk_ata_write_cache_enabled{device="sda"} 0
node_disk_ata_write_cache_enabled{device="sdb"} 1
node_disk_ata_write_cache_enabled{device="sdc"} 0
# HELP node_disk_device_mapper_backing_device_info Info about the underlying block devices of a device mapper device.
# TYPE node_disk_device_mapper_backing_device_info gauge
node_disk_device_mapper_backing_device_info{backing_device="nvme0n1p3",device="dm-0"} 1
node_disk_device_mapper_backing_device_info{backing_device="dm-0",device="dm-1"} 1
node_disk_device_mapper_backing_device_info{backing_device="dm-0",device="dm-2"} 1
node_disk_device_mapper_backing_device_info{backing_device="dm-0",device="dm-3"} 1
node_disk_device_mapper_backing_device_info{backing_device="dm-0",device="dm-4"} 1
node_disk_device_mapper_backing_device_info{backing_device="dm-0",device="dm-5"} 1
# HELP node_disk_device_mapper_info Info about disk device mapper.
# TYPE node_disk_device_mapper_info gauge
node_disk_device_mapper_info{device="dm-0",lv_layer="",lv_name="",name="nvme0n1_crypt",uuid="CRYPT-LUKS2-jolaulot80fy9zsiobkxyxo7y2dqeho2-nvme0n1_crypt",vg_name=""} 1
Expand Down
8 changes: 8 additions & 0 deletions collector/fixtures/e2e-64k-page-output.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1035,6 +1035,14 @@ node_disk_ata_write_cache{device="sdc"} 1
node_disk_ata_write_cache_enabled{device="sda"} 0
node_disk_ata_write_cache_enabled{device="sdb"} 1
node_disk_ata_write_cache_enabled{device="sdc"} 0
# HELP node_disk_device_mapper_backing_device_info Info about the underlying block devices of a device mapper device.
# TYPE node_disk_device_mapper_backing_device_info gauge
node_disk_device_mapper_backing_device_info{backing_device="dm-0",device="dm-1"} 1
node_disk_device_mapper_backing_device_info{backing_device="dm-0",device="dm-2"} 1
node_disk_device_mapper_backing_device_info{backing_device="dm-0",device="dm-3"} 1
node_disk_device_mapper_backing_device_info{backing_device="dm-0",device="dm-4"} 1
node_disk_device_mapper_backing_device_info{backing_device="dm-0",device="dm-5"} 1
node_disk_device_mapper_backing_device_info{backing_device="nvme0n1p3",device="dm-0"} 1
Comment on lines +1038 to +1045

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting case here, if I understand it correctly, dm-1/2/3/4/5 are all created from the backing_device dm-0, and dm-0 is backed by nvme0n1p3. So operations in the disk dm-1/2/3/4/5 are all handled by nvme0n1p3 in reality, right?

How would a query to find the real backing device look like in a scenario like this that requires moving the layer twice, or maybe even more in other scenarios?

# HELP node_disk_device_mapper_info Info about disk device mapper.
# TYPE node_disk_device_mapper_info gauge
node_disk_device_mapper_info{device="dm-0",lv_layer="",lv_name="",name="nvme0n1_crypt",uuid="CRYPT-LUKS2-jolaulot80fy9zsiobkxyxo7y2dqeho2-nvme0n1_crypt",vg_name=""} 1
Expand Down
8 changes: 8 additions & 0 deletions collector/fixtures/e2e-output.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1067,6 +1067,14 @@ node_disk_ata_write_cache{device="sdc"} 1
node_disk_ata_write_cache_enabled{device="sda"} 0
node_disk_ata_write_cache_enabled{device="sdb"} 1
node_disk_ata_write_cache_enabled{device="sdc"} 0
# HELP node_disk_device_mapper_backing_device_info Info about the underlying block devices of a device mapper device.
# TYPE node_disk_device_mapper_backing_device_info gauge
node_disk_device_mapper_backing_device_info{backing_device="dm-0",device="dm-1"} 1
node_disk_device_mapper_backing_device_info{backing_device="dm-0",device="dm-2"} 1
node_disk_device_mapper_backing_device_info{backing_device="dm-0",device="dm-3"} 1
node_disk_device_mapper_backing_device_info{backing_device="dm-0",device="dm-4"} 1
node_disk_device_mapper_backing_device_info{backing_device="dm-0",device="dm-5"} 1
node_disk_device_mapper_backing_device_info{backing_device="nvme0n1p3",device="dm-0"} 1
# HELP node_disk_device_mapper_info Info about disk device mapper.
# TYPE node_disk_device_mapper_info gauge
node_disk_device_mapper_info{device="dm-0",lv_layer="",lv_name="",name="nvme0n1_crypt",uuid="CRYPT-LUKS2-jolaulot80fy9zsiobkxyxo7y2dqeho2-nvme0n1_crypt",vg_name=""} 1
Expand Down
54 changes: 54 additions & 0 deletions collector/fixtures/sys.ttar
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,60 @@ Mode: 755
Directory: sys/block
Mode: 755
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Directory: sys/block/dm-0
Mode: 755
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Directory: sys/block/dm-0/slaves
Mode: 755
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Path: sys/block/dm-0/slaves/nvme0n1p3
SymlinkTo: ../nvme0n1p3
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Directory: sys/block/dm-1
Mode: 755
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Directory: sys/block/dm-1/slaves
Mode: 755
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Path: sys/block/dm-1/slaves/dm-0
SymlinkTo: ../dm-0
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Directory: sys/block/dm-2
Mode: 755
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Directory: sys/block/dm-2/slaves
Mode: 755
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Path: sys/block/dm-2/slaves/dm-0
SymlinkTo: ../dm-0
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Directory: sys/block/dm-3
Mode: 755
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Directory: sys/block/dm-3/slaves
Mode: 755
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Path: sys/block/dm-3/slaves/dm-0
SymlinkTo: ../dm-0
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Directory: sys/block/dm-4
Mode: 755
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Directory: sys/block/dm-4/slaves
Mode: 755
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Path: sys/block/dm-4/slaves/dm-0
SymlinkTo: ../dm-0
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Directory: sys/block/dm-5
Mode: 755
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Directory: sys/block/dm-5/slaves
Mode: 755
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Path: sys/block/dm-5/slaves/dm-0
SymlinkTo: ../dm-0
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Directory: sys/block/md0
Mode: 755
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Expand Down
Loading