Skip to content

Commit 367fae9

Browse files
authored
mscluster: restore support for Windows Server 2016-2019 (#1882)
Signed-off-by: Jan-Otto Kröpke <[email protected]>
1 parent 96ffc3b commit 367fae9

File tree

8 files changed

+68
-52
lines changed

8 files changed

+68
-52
lines changed

internal/collector/hyperv/hyperv.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,10 @@ import (
2323
"strings"
2424
"sync"
2525

26+
"github.com/Microsoft/hcsshim/osversion"
2627
"github.com/alecthomas/kingpin/v2"
2728
"github.com/prometheus-community/windows_exporter/internal/mi"
28-
"github.com/prometheus-community/windows_exporter/internal/types"
2929
"github.com/prometheus/client_golang/prometheus"
30-
"golang.org/x/sys/windows"
3130
)
3231

3332
const (
@@ -157,19 +156,17 @@ func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
157156
return nil
158157
}
159158

160-
version := windows.RtlGetVersion()
161-
162159
subCollectors := map[string]struct {
163160
build func() error
164161
collect func(ch chan<- prometheus.Metric) error
165162
close func()
166-
minBuildNumber uint32
163+
minBuildNumber uint16
167164
}{
168165
subCollectorDataStore: {
169166
build: c.buildDataStore,
170167
collect: c.collectDataStore,
171168
close: c.perfDataCollectorDataStore.Close,
172-
minBuildNumber: types.BuildNumberWindowsServer2022,
169+
minBuildNumber: osversion.LTSC2022,
173170
},
174171
subCollectorDynamicMemoryBalancer: {
175172
build: c.buildDynamicMemoryBalancer,
@@ -243,6 +240,8 @@ func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
243240
},
244241
}
245242

243+
buildNumber := osversion.Build()
244+
246245
// Result must order, to prevent test failures.
247246
sort.Strings(c.config.CollectorsEnabled)
248247

@@ -253,7 +252,7 @@ func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
253252
return fmt.Errorf("unknown collector: %s", name)
254253
}
255254

256-
if version.BuildNumber < subCollectors[name].minBuildNumber {
255+
if buildNumber < subCollectors[name].minBuildNumber {
257256
errs = append(errs, fmt.Errorf("collector %s requires Windows Server 2022 or newer", name))
258257

259258
continue

internal/collector/mscluster/mscluster_cluster.go

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package mscluster
1818
import (
1919
"fmt"
2020

21+
"github.com/Microsoft/hcsshim/osversion"
2122
"github.com/prometheus-community/windows_exporter/internal/mi"
2223
"github.com/prometheus-community/windows_exporter/internal/types"
2324
"github.com/prometheus/client_golang/prometheus"
@@ -192,7 +193,14 @@ type msClusterCluster struct {
192193
}
193194

194195
func (c *Collector) buildCluster() error {
195-
clusterMIQuery, err := mi.NewQuery("SELECT * FROM MSCluster_Cluster")
196+
buildNumber := osversion.Build()
197+
198+
wmiSelect := "AddEvictDelay,AdminAccessPoint,AutoAssignNodeSite,AutoBalancerLevel,AutoBalancerMode,BackupInProgress,BlockCacheSize,ClusSvcHangTimeout,ClusSvcRegroupOpeningTimeout,ClusSvcRegroupPruningTimeout,ClusSvcRegroupStageTimeout,ClusSvcRegroupTickInMilliseconds,ClusterEnforcedAntiAffinity,ClusterFunctionalLevel,ClusterGroupWaitDelay,ClusterLogLevel,ClusterLogSize,ClusterUpgradeVersion,CrossSiteDelay,CrossSiteThreshold,CrossSubnetDelay,CrossSubnetThreshold,CsvBalancer,DatabaseReadWriteMode,DefaultNetworkRole,DisableGroupPreferredOwnerRandomization,DrainOnShutdown,DynamicQuorumEnabled,EnableSharedVolumes,FixQuorum,GracePeriodEnabled,GracePeriodTimeout,GroupDependencyTimeout,HangRecoveryAction,IgnorePersistentStateOnStartup,LogResourceControls,LowerQuorumPriorityNodeId,MessageBufferLength,MinimumNeverPreemptPriority,MinimumPreemptorPriority,NetftIPSecEnabled,PlacementOptions,PlumbAllCrossSubnetRoutes,PreventQuorum,QuarantineDuration,QuarantineThreshold,QuorumArbitrationTimeMax,QuorumArbitrationTimeMin,QuorumLogFileSize,QuorumTypeValue,RequestReplyTimeout,ResiliencyDefaultPeriod,ResiliencyLevel,ResourceDllDeadlockPeriod,RootMemoryReserved,RouteHistoryLength,S2DBusTypes,S2DCacheDesiredState,S2DCacheFlashReservePercent,S2DCachePageSizeKBytes,S2DEnabled,S2DIOLatencyThreshold,S2DOptimizations,SameSubnetDelay,SameSubnetThreshold,SecurityLevel,SharedVolumeVssWriterOperationTimeout,ShutdownTimeoutInMinutes,UseClientAccessNetworksForSharedVolumes,WitnessDatabaseWriteTimeout,WitnessDynamicWeight,WitnessRestartInterval"
199+
if buildNumber >= osversion.LTSC2022 {
200+
wmiSelect += ",DetectManagedEvents,SecurityLevelForStorage,MaxNumberOfNodes,DetectManagedEventsThreshold,DetectedCloudPlatform"
201+
}
202+
203+
clusterMIQuery, err := mi.NewQuery(fmt.Sprintf("SELECT %s FROM MSCluster_Cluster", wmiSelect))
196204
if err != nil {
197205
return fmt.Errorf("failed to create WMI query: %w", err)
198206
}
@@ -852,27 +860,6 @@ func (c *Collector) collectCluster(ch chan<- prometheus.Metric) error {
852860
v.Name,
853861
)
854862

855-
ch <- prometheus.MustNewConstMetric(
856-
c.clusterDetectedCloudPlatform,
857-
prometheus.GaugeValue,
858-
float64(v.DetectedCloudPlatform),
859-
v.Name,
860-
)
861-
862-
ch <- prometheus.MustNewConstMetric(
863-
c.clusterDetectManagedEvents,
864-
prometheus.GaugeValue,
865-
float64(v.DetectManagedEvents),
866-
v.Name,
867-
)
868-
869-
ch <- prometheus.MustNewConstMetric(
870-
c.clusterDetectManagedEventsThreshold,
871-
prometheus.GaugeValue,
872-
float64(v.DetectManagedEventsThreshold),
873-
v.Name,
874-
)
875-
876863
ch <- prometheus.MustNewConstMetric(
877864
c.clusterDisableGroupPreferredOwnerRandomization,
878865
prometheus.GaugeValue,
@@ -957,13 +944,6 @@ func (c *Collector) collectCluster(ch chan<- prometheus.Metric) error {
957944
v.Name,
958945
)
959946

960-
ch <- prometheus.MustNewConstMetric(
961-
c.clusterMaxNumberOfNodes,
962-
prometheus.GaugeValue,
963-
float64(v.MaxNumberOfNodes),
964-
v.Name,
965-
)
966-
967947
ch <- prometheus.MustNewConstMetric(
968948
c.clusterMessageBufferLength,
969949
prometheus.GaugeValue,
@@ -1167,13 +1147,6 @@ func (c *Collector) collectCluster(ch chan<- prometheus.Metric) error {
11671147
v.Name,
11681148
)
11691149

1170-
ch <- prometheus.MustNewConstMetric(
1171-
c.clusterSecurityLevelForStorage,
1172-
prometheus.GaugeValue,
1173-
float64(v.SecurityLevelForStorage),
1174-
v.Name,
1175-
)
1176-
11771150
ch <- prometheus.MustNewConstMetric(
11781151
c.clusterSharedVolumeVssWriterOperationTimeout,
11791152
prometheus.GaugeValue,
@@ -1215,6 +1188,43 @@ func (c *Collector) collectCluster(ch chan<- prometheus.Metric) error {
12151188
float64(v.WitnessRestartInterval),
12161189
v.Name,
12171190
)
1191+
1192+
if osversion.Build() >= osversion.LTSC2022 {
1193+
ch <- prometheus.MustNewConstMetric(
1194+
c.clusterDetectManagedEvents,
1195+
prometheus.GaugeValue,
1196+
float64(v.DetectManagedEvents),
1197+
v.Name,
1198+
)
1199+
1200+
ch <- prometheus.MustNewConstMetric(
1201+
c.clusterDetectManagedEventsThreshold,
1202+
prometheus.GaugeValue,
1203+
float64(v.DetectManagedEventsThreshold),
1204+
v.Name,
1205+
)
1206+
1207+
ch <- prometheus.MustNewConstMetric(
1208+
c.clusterSecurityLevelForStorage,
1209+
prometheus.GaugeValue,
1210+
float64(v.SecurityLevelForStorage),
1211+
v.Name,
1212+
)
1213+
1214+
ch <- prometheus.MustNewConstMetric(
1215+
c.clusterMaxNumberOfNodes,
1216+
prometheus.GaugeValue,
1217+
float64(v.MaxNumberOfNodes),
1218+
v.Name,
1219+
)
1220+
1221+
ch <- prometheus.MustNewConstMetric(
1222+
c.clusterDetectedCloudPlatform,
1223+
prometheus.GaugeValue,
1224+
float64(v.DetectedCloudPlatform),
1225+
v.Name,
1226+
)
1227+
}
12181228
}
12191229

12201230
return nil

internal/collector/mscluster/mscluster_network.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ type msClusterNetwork struct {
4848
}
4949

5050
func (c *Collector) buildNetwork() error {
51-
networkMIQuery, err := mi.NewQuery("SELECT * FROM MSCluster_Network")
51+
networkMIQuery, err := mi.NewQuery("SELECT Characteristics,Flags,Metric,Role,State FROM MSCluster_Network")
5252
if err != nil {
5353
return fmt.Errorf("failed to create WMI query: %w", err)
5454
}

internal/collector/mscluster/mscluster_node.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package mscluster
1818
import (
1919
"fmt"
2020

21+
"github.com/Microsoft/hcsshim/osversion"
2122
"github.com/prometheus-community/windows_exporter/internal/mi"
2223
"github.com/prometheus-community/windows_exporter/internal/types"
2324
"github.com/prometheus/client_golang/prometheus"
@@ -66,7 +67,14 @@ type msClusterNode struct {
6667
}
6768

6869
func (c *Collector) buildNode() error {
69-
nodeMIQuery, err := mi.NewQuery("SELECT * FROM MSCluster_Node")
70+
buildNumber := osversion.Build()
71+
72+
wmiSelect := "BuildNumber,Characteristics,DynamicWeight,Flags,MajorVersion,MinorVersion,NeedsPreventQuorum,NodeDrainStatus,NodeHighestVersion,NodeLowestVersion,NodeWeight,State,StatusInformation"
73+
if buildNumber >= osversion.LTSC2022 {
74+
wmiSelect += ",DetectedCloudPlatform"
75+
}
76+
77+
nodeMIQuery, err := mi.NewQuery(fmt.Sprintf("SELECT %s FROM MSCluster_Node", wmiSelect))
7078
if err != nil {
7179
return fmt.Errorf("failed to create WMI query: %w", err)
7280
}

internal/collector/mscluster/mscluster_resource.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ type msClusterResource struct {
7474
}
7575

7676
func (c *Collector) buildResource() error {
77-
resourceMIQuery, err := mi.NewQuery("SELECT * FROM MSCluster_Resource")
77+
resourceMIQuery, err := mi.NewQuery("SELECT Name,Type,OwnerGroup,OwnerNode,Characteristics,DeadlockTimeout,EmbeddedFailureAction,Flags,IsAlivePollInterval,LooksAlivePollInterval,MonitorProcessId,PendingTimeout,ResourceClass,RestartAction,RestartDelay,RestartPeriod,RestartThreshold,RetryPeriodOnFailure,State,Subclass FROM MSCluster_Resource")
7878
if err != nil {
7979
return fmt.Errorf("failed to create WMI query: %w", err)
8080
}

internal/collector/mscluster/mscluster_resourcegroup.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ type msClusterResourceGroup struct {
6666
}
6767

6868
func (c *Collector) buildResourceGroup() error {
69-
resourceGroupMIQuery, err := mi.NewQuery("SELECT * FROM MSCluster_ResourceGroup")
69+
resourceGroupMIQuery, err := mi.NewQuery("SELECT AutoFailbackType,Characteristics,ColdStartSetting,DefaultOwner,FailbackWindowEnd,FailbackWindowStart,FailoverPeriod,FailoverThreshold,Flags,GroupType,OwnerNode,Priority,ResiliencyPeriod,State FROM MSCluster_ResourceGroup")
7070
if err != nil {
7171
return fmt.Errorf("failed to create WMI query: %w", err)
7272
}

internal/mi/callbacks.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,10 @@ func (o *OperationUnmarshalCallbacks) InstanceResult(
138138

139139
element, err := instance.GetElement(miTag)
140140
if err != nil {
141+
if errors.Is(err, MI_RESULT_NO_SUCH_PROPERTY) {
142+
continue
143+
}
144+
141145
o.errCh <- fmt.Errorf("failed to get element %s: %w", miTag, err)
142146

143147
return 0

internal/types/const.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,5 @@
1616
package types
1717

1818
const (
19-
BuildNumberWindowsServer2025 uint32 = 26100
20-
BuildNumberWindowsServer2022 uint32 = 20348
21-
BuildNumberWindowsServer2019 uint32 = 17763
22-
BuildNumberWindowsServer2016 uint32 = 14393
23-
2419
Namespace = "windows"
2520
)

0 commit comments

Comments
 (0)