hyperv: add virtual_hard_disk sub-collector (#2693)

Signed-off-by: EisenbergD <dominik.eisenberg@beiersdorf.com>
Co-authored-by: EisenbergD <dominik.eisenberg@beiersdorf.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dominik Eisenberg
2026-10-12 20:23:46 +02:00
committed by GitHub
co-authored by EisenbergD Claude Opus 5.5
parent 89c5df9d8b
commit ec7dcdc259
15 changed files with 1990 additions and 11 deletions
+28 -1
View File
@@ -47,6 +47,7 @@ const (
subCollectorHypervisorVirtualProcessor = "hypervisor_virtual_processor"
subCollectorLegacyNetworkAdapter = "legacy_network_adapter"
subCollectorReplicaVM = "replica_vm"
subCollectorVirtualHardDisk = "virtual_hard_disk"
subCollectorVirtualMachineHealthSummary = "virtual_machine_health_summary"
subCollectorVirtualMachineVidPartition = "virtual_machine_vid_partition"
subCollectorVirtualNetworkAdapter = "virtual_network_adapter"
@@ -58,7 +59,14 @@ const (
)
type Config struct {
CollectorsEnabled []string `yaml:"enabled"`
CollectorsEnabled []string `yaml:"enabled"`
VirtualHardDisk VirtualHardDiskConfig `yaml:"virtual-hard-disk"`
}
// VirtualHardDiskConfig configures the virtual_hard_disk sub-collector.
type VirtualHardDiskConfig struct {
// RefreshInterval is the interval at which the disks are read in the background.
RefreshInterval time.Duration `yaml:"refresh-interval"`
}
//nolint:gochecknoglobals
@@ -74,6 +82,7 @@ var ConfigDefaults = Config{
subCollectorHypervisorVirtualProcessor,
subCollectorLegacyNetworkAdapter,
subCollectorReplicaVM,
subCollectorVirtualHardDisk,
subCollectorVirtualMachineHealthSummary,
subCollectorVirtualMachineVidPartition,
subCollectorVirtualNetworkAdapter,
@@ -83,6 +92,9 @@ var ConfigDefaults = Config{
subCollectorVirtualSwitch,
subCollectorWMIHealth,
},
VirtualHardDisk: VirtualHardDiskConfig{
RefreshInterval: 5 * time.Minute,
},
}
// Collector is a Prometheus Collector for hyper-v.
@@ -97,6 +109,7 @@ type Collector struct {
collectorHypervisorVirtualProcessor
collectorLegacyNetworkAdapter
collectorReplicaVM
collectorVirtualHardDisk
collectorVirtualMachineHealthSummary
collectorVirtualMachineVidPartition
collectorVirtualNetworkAdapter
@@ -129,6 +142,10 @@ func New(config *Config) *Collector {
config.CollectorsEnabled = ConfigDefaults.CollectorsEnabled
}
if config.VirtualHardDisk.RefreshInterval == 0 {
config.VirtualHardDisk.RefreshInterval = ConfigDefaults.VirtualHardDisk.RefreshInterval
}
c := &Collector{
config: *config,
}
@@ -149,6 +166,11 @@ func NewWithFlags(app *kingpin.Application) *Collector {
"Comma-separated list of collectors to use.",
).Default(strings.Join(ConfigDefaults.CollectorsEnabled, ",")).StringVar(&collectorsEnabled)
app.Flag(
"collector.hyperv.virtual-hard-disk.refresh-interval",
"Interval at which the virtual_hard_disk sub-collector reads the disks in the background. Scrapes publish the values of the last refresh.",
).Default(ConfigDefaults.VirtualHardDisk.RefreshInterval.String()).DurationVar(&c.config.VirtualHardDisk.RefreshInterval)
app.Action(func(*kingpin.ParseContext) error {
c.config.CollectorsEnabled = strings.Split(collectorsEnabled, ",")
@@ -245,6 +267,11 @@ func (c *Collector) Build(logger *slog.Logger, miSession *mi.Session) error {
// Close the collector created by build, not the nil one bound at this point.
close: func() { c.perfDataCollectorReplicaVM.Close() },
},
subCollectorVirtualHardDisk: {
build: c.buildVirtualHardDisk,
collect: c.collectVirtualHardDisk,
close: c.closeVirtualHardDisk,
},
subCollectorVirtualMachineHealthSummary: {
build: c.buildVirtualMachineHealthSummary,
collect: c.collectVirtualMachineHealthSummary,