hyperv: fix Windows Server 2016 compatibility (#1925)

Signed-off-by: Jan-Otto Kröpke <mail@jkroepke.de>
This commit is contained in:
Jan-Otto Kröpke
2025-03-14 19:28:48 +01:00
committed by GitHub
parent d58f8c59c6
commit bc1b40c679
4 changed files with 34 additions and 24 deletions

View File

@@ -148,7 +148,7 @@ func (c *Collector) Close() error {
return nil return nil
} }
func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error { func (c *Collector) Build(logger *slog.Logger, _ *mi.Session) error {
c.collectorFns = make([]func(ch chan<- prometheus.Metric) error, 0, len(c.config.CollectorsEnabled)) c.collectorFns = make([]func(ch chan<- prometheus.Metric) error, 0, len(c.config.CollectorsEnabled))
c.closeFns = make([]func(), 0, len(c.config.CollectorsEnabled)) c.closeFns = make([]func(), 0, len(c.config.CollectorsEnabled))
@@ -224,9 +224,10 @@ func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
close: c.perfDataCollectorVirtualNetworkAdapterDropReasons.Close, close: c.perfDataCollectorVirtualNetworkAdapterDropReasons.Close,
}, },
subCollectorVirtualSMB: { subCollectorVirtualSMB: {
build: c.buildVirtualSMB, build: c.buildVirtualSMB,
collect: c.collectVirtualSMB, collect: c.collectVirtualSMB,
close: c.perfDataCollectorVirtualSMB.Close, close: c.perfDataCollectorVirtualSMB.Close,
minBuildNumber: osversion.LTSC2022,
}, },
subCollectorVirtualStorageDevice: { subCollectorVirtualStorageDevice: {
build: c.buildVirtualStorageDevice, build: c.buildVirtualStorageDevice,
@@ -253,7 +254,10 @@ func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
} }
if buildNumber < subCollectors[name].minBuildNumber { if buildNumber < subCollectors[name].minBuildNumber {
errs = append(errs, fmt.Errorf("collector %s requires Windows Server 2022 or newer", name)) logger.Warn(fmt.Sprintf(
"collector %s requires windows build version %d. Current build version: %d",
name, subCollectors[name].minBuildNumber, buildNumber,
), slog.String("collector", name))
continue continue
} }

View File

@@ -18,6 +18,7 @@ package hyperv
import ( import (
"fmt" "fmt"
"github.com/Microsoft/hcsshim/osversion"
"github.com/prometheus-community/windows_exporter/internal/pdh" "github.com/prometheus-community/windows_exporter/internal/pdh"
"github.com/prometheus-community/windows_exporter/internal/types" "github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus-community/windows_exporter/internal/utils" "github.com/prometheus-community/windows_exporter/internal/utils"
@@ -40,7 +41,7 @@ type perfDataCounterValuesDynamicMemoryBalancer struct {
// Hyper-V Dynamic Memory Balancer metrics // Hyper-V Dynamic Memory Balancer metrics
VmDynamicMemoryBalancerAvailableMemory float64 `perfdata:"Available Memory"` VmDynamicMemoryBalancerAvailableMemory float64 `perfdata:"Available Memory"`
VmDynamicMemoryBalancerAvailableMemoryForBalancing float64 `perfdata:"Available Memory For Balancing"` VmDynamicMemoryBalancerAvailableMemoryForBalancing float64 `perfdata:"Available Memory For Balancing" perfdata_min_build:"17763"`
VmDynamicMemoryBalancerAveragePressure float64 `perfdata:"Average Pressure"` VmDynamicMemoryBalancerAveragePressure float64 `perfdata:"Average Pressure"`
VmDynamicMemoryBalancerSystemCurrentPressure float64 `perfdata:"System Current Pressure"` VmDynamicMemoryBalancerSystemCurrentPressure float64 `perfdata:"System Current Pressure"`
} }
@@ -96,12 +97,14 @@ func (c *Collector) collectDynamicMemoryBalancer(ch chan<- prometheus.Metric) er
data.Name, data.Name,
) )
ch <- prometheus.MustNewConstMetric( if osversion.Build() >= osversion.LTSC2019 {
c.vmDynamicMemoryBalancerAvailableMemoryForBalancing, ch <- prometheus.MustNewConstMetric(
prometheus.GaugeValue, c.vmDynamicMemoryBalancerAvailableMemoryForBalancing,
utils.MBToBytes(data.VmDynamicMemoryBalancerAvailableMemoryForBalancing), prometheus.GaugeValue,
data.Name, utils.MBToBytes(data.VmDynamicMemoryBalancerAvailableMemoryForBalancing),
) data.Name,
)
}
ch <- prometheus.MustNewConstMetric( ch <- prometheus.MustNewConstMetric(
c.vmDynamicMemoryBalancerAveragePressure, c.vmDynamicMemoryBalancerAveragePressure,

View File

@@ -18,6 +18,7 @@ package hyperv
import ( import (
"fmt" "fmt"
"github.com/Microsoft/hcsshim/osversion"
"github.com/prometheus-community/windows_exporter/internal/pdh" "github.com/prometheus-community/windows_exporter/internal/pdh"
"github.com/prometheus-community/windows_exporter/internal/types" "github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus-community/windows_exporter/internal/utils" "github.com/prometheus-community/windows_exporter/internal/utils"
@@ -47,7 +48,7 @@ type perfDataCounterValuesDynamicMemoryVM struct {
// Hyper-V Dynamic Memory VM metrics // Hyper-V Dynamic Memory VM metrics
VmMemoryAddedMemory float64 `perfdata:"Added Memory"` VmMemoryAddedMemory float64 `perfdata:"Added Memory"`
VmMemoryCurrentPressure float64 `perfdata:"Current Pressure"` VmMemoryCurrentPressure float64 `perfdata:"Current Pressure"`
VmMemoryGuestAvailableMemory float64 `perfdata:"Guest Available Memory"` VmMemoryGuestAvailableMemory float64 `perfdata:"Guest Available Memory" perfdata_min_build:"17763"`
VmMemoryGuestVisiblePhysicalMemory float64 `perfdata:"Guest Visible Physical Memory"` VmMemoryGuestVisiblePhysicalMemory float64 `perfdata:"Guest Visible Physical Memory"`
VmMemoryMaximumPressure float64 `perfdata:"Maximum Pressure"` VmMemoryMaximumPressure float64 `perfdata:"Maximum Pressure"`
VmMemoryMemoryAddOperations float64 `perfdata:"Memory Add Operations"` VmMemoryMemoryAddOperations float64 `perfdata:"Memory Add Operations"`
@@ -150,12 +151,14 @@ func (c *Collector) collectDynamicMemoryVM(ch chan<- prometheus.Metric) error {
data.Name, data.Name,
) )
ch <- prometheus.MustNewConstMetric( if osversion.Build() >= osversion.LTSC2019 {
c.vmMemoryGuestAvailableMemory, ch <- prometheus.MustNewConstMetric(
prometheus.GaugeValue, c.vmMemoryGuestAvailableMemory,
utils.MBToBytes(data.VmMemoryGuestAvailableMemory), prometheus.GaugeValue,
data.Name, utils.MBToBytes(data.VmMemoryGuestAvailableMemory),
) data.Name,
)
}
ch <- prometheus.MustNewConstMetric( ch <- prometheus.MustNewConstMetric(
c.vmMemoryGuestVisiblePhysicalMemory, c.vmMemoryGuestVisiblePhysicalMemory,

View File

@@ -40,7 +40,7 @@ type collectorHypervisorVirtualProcessor struct {
type perfDataCounterValuesHypervisorVirtualProcessor struct { type perfDataCounterValuesHypervisorVirtualProcessor struct {
Name string Name string
HypervisorVirtualProcessorGuestIdleTimePercent float64 `perfdata:"% Guest Idle Time"` HypervisorVirtualProcessorGuestRunTimePercent float64 `perfdata:"% Guest Run Time"`
HypervisorVirtualProcessorHypervisorRunTimePercent float64 `perfdata:"% Hypervisor Run Time"` HypervisorVirtualProcessorHypervisorRunTimePercent float64 `perfdata:"% Hypervisor Run Time"`
HypervisorVirtualProcessorTotalRunTimePercent float64 `perfdata:"% Total Run Time"` HypervisorVirtualProcessorTotalRunTimePercent float64 `perfdata:"% Total Run Time"`
HypervisorVirtualProcessorRemoteRunTimePercent float64 `perfdata:"% Remote Run Time"` HypervisorVirtualProcessorRemoteRunTimePercent float64 `perfdata:"% Remote Run Time"`
@@ -108,15 +108,15 @@ func (c *Collector) collectHypervisorVirtualProcessor(ch chan<- prometheus.Metri
ch <- prometheus.MustNewConstMetric( ch <- prometheus.MustNewConstMetric(
c.hypervisorVirtualProcessorTimeTotal, c.hypervisorVirtualProcessorTimeTotal,
prometheus.CounterValue, prometheus.CounterValue,
data.HypervisorVirtualProcessorGuestIdleTimePercent, data.HypervisorVirtualProcessorGuestRunTimePercent,
vmName, coreID, "guest_idle", vmName, coreID, "guest",
) )
ch <- prometheus.MustNewConstMetric( ch <- prometheus.MustNewConstMetric(
c.hypervisorVirtualProcessorTimeTotal, c.hypervisorVirtualProcessorTimeTotal,
prometheus.CounterValue, prometheus.CounterValue,
data.HypervisorVirtualProcessorGuestIdleTimePercent, data.HypervisorVirtualProcessorRemoteRunTimePercent,
vmName, coreID, "guest_idle", vmName, coreID, "remote",
) )
ch <- prometheus.MustNewConstMetric( ch <- prometheus.MustNewConstMetric(