mi: replace all WMI calls with MI calls (#1700)

This commit is contained in:
Jan-Otto Kröpke
2024-11-03 01:03:34 +01:00
committed by GitHub
parent 582d8dd29c
commit c4f5d58a3e
82 changed files with 2767 additions and 738 deletions

View File

@@ -8,9 +8,9 @@ import (
"strings"
"github.com/alecthomas/kingpin/v2"
"github.com/prometheus-community/windows_exporter/internal/mi"
"github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus/client_golang/prometheus"
"github.com/yusufpapurcu/wmi"
)
const Name = "mscluster"
@@ -32,7 +32,7 @@ var ConfigDefaults = Config{
// A Collector is a Prometheus Collector for WMI MSCluster_Cluster metrics.
type Collector struct {
config Config
wmiClient *wmi.Client
miSession *mi.Session
// cluster
clusterAddEvictDelay *prometheus.Desc
@@ -221,16 +221,16 @@ func (c *Collector) Close(_ *slog.Logger) error {
return nil
}
func (c *Collector) Build(_ *slog.Logger, wmiClient *wmi.Client) error {
func (c *Collector) Build(_ *slog.Logger, miSession *mi.Session) error {
if len(c.config.CollectorsEnabled) == 0 {
return nil
}
if wmiClient == nil || wmiClient.SWbemServicesClient == nil {
return errors.New("wmiClient or SWbemServicesClient is nil")
if miSession == nil {
return errors.New("miSession is nil")
}
c.wmiClient = wmiClient
c.miSession = miSession
if slices.Contains(c.config.CollectorsEnabled, "cluster") {
c.buildCluster()

View File

@@ -1,7 +1,11 @@
package mscluster
import (
"fmt"
"github.com/prometheus-community/windows_exporter/internal/mi"
"github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus-community/windows_exporter/internal/utils"
"github.com/prometheus/client_golang/prometheus"
)
@@ -10,85 +14,85 @@ const nameCluster = Name + "_cluster"
// msClusterCluster represents the MSCluster_Cluster WMI class
// - https://docs.microsoft.com/en-us/previous-versions/windows/desktop/cluswmi/mscluster-cluster
type msClusterCluster struct {
Name string
Name string `mi:"Name"`
AddEvictDelay uint
AdminAccessPoint uint
AutoAssignNodeSite uint
AutoBalancerLevel uint
AutoBalancerMode uint
BackupInProgress uint
BlockCacheSize uint
ClusSvcHangTimeout uint
ClusSvcRegroupOpeningTimeout uint
ClusSvcRegroupPruningTimeout uint
ClusSvcRegroupStageTimeout uint
ClusSvcRegroupTickInMilliseconds uint
ClusterEnforcedAntiAffinity uint
ClusterFunctionalLevel uint
ClusterGroupWaitDelay uint
ClusterLogLevel uint
ClusterLogSize uint
ClusterUpgradeVersion uint
CrossSiteDelay uint
CrossSiteThreshold uint
CrossSubnetDelay uint
CrossSubnetThreshold uint
CsvBalancer uint
DatabaseReadWriteMode uint
DefaultNetworkRole uint
DetectedCloudPlatform uint
DetectManagedEvents uint
DetectManagedEventsThreshold uint
DisableGroupPreferredOwnerRandomization uint
DrainOnShutdown uint
DynamicQuorumEnabled uint
EnableSharedVolumes uint
FixQuorum uint
GracePeriodEnabled uint
GracePeriodTimeout uint
GroupDependencyTimeout uint
HangRecoveryAction uint
IgnorePersistentStateOnStartup uint
LogResourceControls uint
LowerQuorumPriorityNodeId uint
MaxNumberOfNodes uint
MessageBufferLength uint
MinimumNeverPreemptPriority uint
MinimumPreemptorPriority uint
NetftIPSecEnabled uint
PlacementOptions uint
PlumbAllCrossSubnetRoutes uint
PreventQuorum uint
QuarantineDuration uint
QuarantineThreshold uint
QuorumArbitrationTimeMax uint
QuorumArbitrationTimeMin uint
QuorumLogFileSize uint
QuorumTypeValue uint
RequestReplyTimeout uint
ResiliencyDefaultPeriod uint
ResiliencyLevel uint
ResourceDllDeadlockPeriod uint
RootMemoryReserved uint
RouteHistoryLength uint
S2DBusTypes uint
S2DCacheDesiredState uint
S2DCacheFlashReservePercent uint
S2DCachePageSizeKBytes uint
S2DEnabled uint
S2DIOLatencyThreshold uint
S2DOptimizations uint
SameSubnetDelay uint
SameSubnetThreshold uint
SecurityLevel uint
SecurityLevelForStorage uint
SharedVolumeVssWriterOperationTimeout uint
ShutdownTimeoutInMinutes uint
UseClientAccessNetworksForSharedVolumes uint
WitnessDatabaseWriteTimeout uint
WitnessDynamicWeight uint
WitnessRestartInterval uint
AddEvictDelay uint `mi:"AddEvictDelay"`
AdminAccessPoint uint `mi:"AdminAccessPoint"`
AutoAssignNodeSite uint `mi:"AutoAssignNodeSite"`
AutoBalancerLevel uint `mi:"AutoBalancerLevel"`
AutoBalancerMode uint `mi:"AutoBalancerMode"`
BackupInProgress uint `mi:"BackupInProgress"`
BlockCacheSize uint `mi:"BlockCacheSize"`
ClusSvcHangTimeout uint `mi:"ClusSvcHangTimeout"`
ClusSvcRegroupOpeningTimeout uint `mi:"ClusSvcRegroupOpeningTimeout"`
ClusSvcRegroupPruningTimeout uint `mi:"ClusSvcRegroupPruningTimeout"`
ClusSvcRegroupStageTimeout uint `mi:"ClusSvcRegroupStageTimeout"`
ClusSvcRegroupTickInMilliseconds uint `mi:"ClusSvcRegroupTickInMilliseconds"`
ClusterEnforcedAntiAffinity uint `mi:"ClusterEnforcedAntiAffinity"`
ClusterFunctionalLevel uint `mi:"ClusterFunctionalLevel"`
ClusterGroupWaitDelay uint `mi:"ClusterGroupWaitDelay"`
ClusterLogLevel uint `mi:"ClusterLogLevel"`
ClusterLogSize uint `mi:"ClusterLogSize"`
ClusterUpgradeVersion uint `mi:"ClusterUpgradeVersion"`
CrossSiteDelay uint `mi:"CrossSiteDelay"`
CrossSiteThreshold uint `mi:"CrossSiteThreshold"`
CrossSubnetDelay uint `mi:"CrossSubnetDelay"`
CrossSubnetThreshold uint `mi:"CrossSubnetThreshold"`
CsvBalancer uint `mi:"CsvBalancer"`
DatabaseReadWriteMode uint `mi:"DatabaseReadWriteMode"`
DefaultNetworkRole uint `mi:"DefaultNetworkRole"`
DetectedCloudPlatform uint `mi:"DetectedCloudPlatform"`
DetectManagedEvents uint `mi:"DetectManagedEvents"`
DetectManagedEventsThreshold uint `mi:"DetectManagedEventsThreshold"`
DisableGroupPreferredOwnerRandomization uint `mi:"DisableGroupPreferredOwnerRandomization"`
DrainOnShutdown uint `mi:"DrainOnShutdown"`
DynamicQuorumEnabled uint `mi:"DynamicQuorumEnabled"`
EnableSharedVolumes uint `mi:"EnableSharedVolumes"`
FixQuorum uint `mi:"FixQuorum"`
GracePeriodEnabled uint `mi:"GracePeriodEnabled"`
GracePeriodTimeout uint `mi:"GracePeriodTimeout"`
GroupDependencyTimeout uint `mi:"GroupDependencyTimeout"`
HangRecoveryAction uint `mi:"HangRecoveryAction"`
IgnorePersistentStateOnStartup uint `mi:"IgnorePersistentStateOnStartup"`
LogResourceControls uint `mi:"LogResourceControls"`
LowerQuorumPriorityNodeId uint `mi:"LowerQuorumPriorityNodeId"`
MaxNumberOfNodes uint `mi:"MaxNumberOfNodes"`
MessageBufferLength uint `mi:"MessageBufferLength"`
MinimumNeverPreemptPriority uint `mi:"MinimumNeverPreemptPriority"`
MinimumPreemptorPriority uint `mi:"MinimumPreemptorPriority"`
NetftIPSecEnabled uint `mi:"NetftIPSecEnabled"`
PlacementOptions uint `mi:"PlacementOptions"`
PlumbAllCrossSubnetRoutes uint `mi:"PlumbAllCrossSubnetRoutes"`
PreventQuorum uint `mi:"PreventQuorum"`
QuarantineDuration uint `mi:"QuarantineDuration"`
QuarantineThreshold uint `mi:"QuarantineThreshold"`
QuorumArbitrationTimeMax uint `mi:"QuorumArbitrationTimeMax"`
QuorumArbitrationTimeMin uint `mi:"QuorumArbitrationTimeMin"`
QuorumLogFileSize uint `mi:"QuorumLogFileSize"`
QuorumTypeValue uint `mi:"QuorumTypeValue"`
RequestReplyTimeout uint `mi:"RequestReplyTimeout"`
ResiliencyDefaultPeriod uint `mi:"ResiliencyDefaultPeriod"`
ResiliencyLevel uint `mi:"ResiliencyLevel"`
ResourceDllDeadlockPeriod uint `mi:"ResourceDllDeadlockPeriod"`
RootMemoryReserved uint `mi:"RootMemoryReserved"`
RouteHistoryLength uint `mi:"RouteHistoryLength"`
S2DBusTypes uint `mi:"S2DBusTypes"`
S2DCacheDesiredState uint `mi:"S2DCacheDesiredState"`
S2DCacheFlashReservePercent uint `mi:"S2DCacheFlashReservePercent"`
S2DCachePageSizeKBytes uint `mi:"S2DCachePageSizeKBytes"`
S2DEnabled uint `mi:"S2DEnabled"`
S2DIOLatencyThreshold uint `mi:"S2DIOLatencyThreshold"`
S2DOptimizations uint `mi:"S2DOptimizations"`
SameSubnetDelay uint `mi:"SameSubnetDelay"`
SameSubnetThreshold uint `mi:"SameSubnetThreshold"`
SecurityLevel uint `mi:"SecurityLevel"`
SecurityLevelForStorage uint `mi:"SecurityLevelForStorage"`
SharedVolumeVssWriterOperationTimeout uint `mi:"SharedVolumeVssWriterOperationTimeout"`
ShutdownTimeoutInMinutes uint `mi:"ShutdownTimeoutInMinutes"`
UseClientAccessNetworksForSharedVolumes uint `mi:"UseClientAccessNetworksForSharedVolumes"`
WitnessDatabaseWriteTimeout uint `mi:"WitnessDatabaseWriteTimeout"`
WitnessDynamicWeight uint `mi:"WitnessDynamicWeight"`
WitnessRestartInterval uint `mi:"WitnessRestartInterval"`
}
func (c *Collector) buildCluster() {
@@ -558,8 +562,8 @@ func (c *Collector) buildCluster() {
func (c *Collector) collectCluster(ch chan<- prometheus.Metric) error {
var dst []msClusterCluster
if err := c.wmiClient.Query("SELECT * FROM MSCluster_Cluster", &dst, nil, "root/MSCluster"); err != nil {
return err
if err := c.miSession.Query(&dst, mi.NamespaceRootMSCluster, utils.Must(mi.NewQuery("SELECT * MSCluster_Cluster"))); err != nil {
return fmt.Errorf("WMI query failed: %w", err)
}
for _, v := range dst {

View File

@@ -1,7 +1,11 @@
package mscluster
import (
"fmt"
"github.com/prometheus-community/windows_exporter/internal/mi"
"github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus-community/windows_exporter/internal/utils"
"github.com/prometheus/client_golang/prometheus"
)
@@ -10,13 +14,13 @@ const nameNetwork = Name + "_network"
// msClusterNetwork represents the MSCluster_Network WMI class
// - https://docs.microsoft.com/en-us/previous-versions/windows/desktop/cluswmi/mscluster-network
type msClusterNetwork struct {
Name string
Name string `mi:"Name"`
Characteristics uint
Flags uint
Metric uint
Role uint
State uint
Characteristics uint `mi:"Characteristics"`
Flags uint `mi:"Flags"`
Metric uint `mi:"Metric"`
Role uint `mi:"Role"`
State uint `mi:"State"`
}
func (c *Collector) buildNetwork() {
@@ -57,8 +61,8 @@ func (c *Collector) buildNetwork() {
func (c *Collector) collectNetwork(ch chan<- prometheus.Metric) error {
var dst []msClusterNetwork
if err := c.wmiClient.Query("SELECT * FROM MSCluster_Network", &dst, nil, "root/MSCluster"); err != nil {
return err
if err := c.miSession.Query(&dst, mi.NamespaceRootMSCluster, utils.Must(mi.NewQuery("SELECT * MSCluster_Node"))); err != nil {
return fmt.Errorf("WMI query failed: %w", err)
}
for _, v := range dst {

View File

@@ -1,7 +1,11 @@
package mscluster
import (
"fmt"
"github.com/prometheus-community/windows_exporter/internal/mi"
"github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus-community/windows_exporter/internal/utils"
"github.com/prometheus/client_golang/prometheus"
)
@@ -10,22 +14,22 @@ const nameNode = Name + "_node"
// msClusterNode represents the MSCluster_Node WMI class
// - https://docs.microsoft.com/en-us/previous-versions/windows/desktop/cluswmi/mscluster-node
type msClusterNode struct {
Name string
Name string `mi:"Name"`
BuildNumber uint
Characteristics uint
DetectedCloudPlatform uint
DynamicWeight uint
Flags uint
MajorVersion uint
MinorVersion uint
NeedsPreventQuorum uint
NodeDrainStatus uint
NodeHighestVersion uint
NodeLowestVersion uint
NodeWeight uint
State uint
StatusInformation uint
BuildNumber uint `mi:"BuildNumber"`
Characteristics uint `mi:"Characteristics"`
DetectedCloudPlatform uint `mi:"DetectedCloudPlatform"`
DynamicWeight uint `mi:"DynamicWeight"`
Flags uint `mi:"Flags"`
MajorVersion uint `mi:"MajorVersion"`
MinorVersion uint `mi:"MinorVersion"`
NeedsPreventQuorum uint `mi:"NeedsPreventQuorum"`
NodeDrainStatus uint `mi:"NodeDrainStatus"`
NodeHighestVersion uint `mi:"NodeHighestVersion"`
NodeLowestVersion uint `mi:"NodeLowestVersion"`
NodeWeight uint `mi:"NodeWeight"`
State uint `mi:"State"`
StatusInformation uint `mi:"StatusInformation"`
}
func (c *Collector) buildNode() {
@@ -120,8 +124,8 @@ func (c *Collector) buildNode() {
func (c *Collector) collectNode(ch chan<- prometheus.Metric) ([]string, error) {
var dst []msClusterNode
if err := c.wmiClient.Query("SELECT * FROM MSCluster_Node", &dst, nil, "root/MSCluster"); err != nil {
return nil, err
if err := c.miSession.Query(&dst, mi.NamespaceRootMSCluster, utils.Must(mi.NewQuery("SELECT * FROM MSCluster_Node"))); err != nil {
return nil, fmt.Errorf("WMI query failed: %w", err)
}
nodeNames := make([]string, 0, len(dst))

View File

@@ -1,7 +1,11 @@
package mscluster
import (
"fmt"
"github.com/prometheus-community/windows_exporter/internal/mi"
"github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus-community/windows_exporter/internal/utils"
"github.com/prometheus/client_golang/prometheus"
)
@@ -10,27 +14,27 @@ const nameResource = Name + "_resource"
// msClusterResource represents the MSCluster_Resource WMI class
// - https://docs.microsoft.com/en-us/previous-versions/windows/desktop/cluswmi/mscluster-resource
type msClusterResource struct {
Name string
Type string
OwnerGroup string
OwnerNode string
Name string `mi:"Name"`
Type string `mi:"Type"`
OwnerGroup string `mi:"OwnerGroup"`
OwnerNode string `mi:"OwnerNode"`
Characteristics uint
DeadlockTimeout uint
EmbeddedFailureAction uint
Flags uint
IsAlivePollInterval uint
LooksAlivePollInterval uint
MonitorProcessId uint
PendingTimeout uint
ResourceClass uint
RestartAction uint
RestartDelay uint
RestartPeriod uint
RestartThreshold uint
RetryPeriodOnFailure uint
State uint
Subclass uint
Characteristics uint `mi:"Characteristics"`
DeadlockTimeout uint `mi:"DeadlockTimeout"`
EmbeddedFailureAction uint `mi:"EmbeddedFailureAction"`
Flags uint `mi:"Flags"`
IsAlivePollInterval uint `mi:"IsAlivePollInterval"`
LooksAlivePollInterval uint `mi:"LooksAlivePollInterval"`
MonitorProcessId uint `mi:"MonitorProcessId"`
PendingTimeout uint `mi:"PendingTimeout"`
ResourceClass uint `mi:"ResourceClass"`
RestartAction uint `mi:"RestartAction"`
RestartDelay uint `mi:"RestartDelay"`
RestartPeriod uint `mi:"RestartPeriod"`
RestartThreshold uint `mi:"RestartThreshold"`
RetryPeriodOnFailure uint `mi:"RetryPeriodOnFailure"`
State uint `mi:"State"`
Subclass uint `mi:"Subclass"`
}
func (c *Collector) buildResource() {
@@ -149,8 +153,8 @@ func (c *Collector) buildResource() {
func (c *Collector) collectResource(ch chan<- prometheus.Metric, nodeNames []string) error {
var dst []msClusterResource
if err := c.wmiClient.Query("SELECT * FROM MSCluster_Resource", &dst, nil, "root/MSCluster"); err != nil {
return err
if err := c.miSession.Query(&dst, mi.NamespaceRootMSCluster, utils.Must(mi.NewQuery("SELECT * FROM MSCluster_Resource"))); err != nil {
return fmt.Errorf("WMI query failed: %w", err)
}
for _, v := range dst {

View File

@@ -1,7 +1,11 @@
package mscluster
import (
"fmt"
"github.com/prometheus-community/windows_exporter/internal/mi"
"github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus-community/windows_exporter/internal/utils"
"github.com/prometheus/client_golang/prometheus"
)
@@ -10,22 +14,22 @@ const nameResourceGroup = Name + "_resourcegroup"
// msClusterResourceGroup represents the MSCluster_ResourceGroup WMI class
// - https://docs.microsoft.com/en-us/previous-versions/windows/desktop/cluswmi/mscluster-resourcegroup
type msClusterResourceGroup struct {
Name string
Name string `mi:"Name"`
AutoFailbackType uint
Characteristics uint
ColdStartSetting uint
DefaultOwner uint
FailbackWindowEnd int
FailbackWindowStart int
FailoverPeriod uint
FailoverThreshold uint
Flags uint
GroupType uint
OwnerNode string
Priority uint
ResiliencyPeriod uint
State uint
AutoFailbackType uint `mi:"AutoFailbackType"`
Characteristics uint `mi:"Characteristics"`
ColdStartSetting uint `mi:"ColdStartSetting"`
DefaultOwner uint `mi:"DefaultOwner"`
FailbackWindowEnd int `mi:"FailbackWindowEnd"`
FailbackWindowStart int `mi:"FailbackWindowStart"`
FailoverPeriod uint `mi:"FailoverPeriod"`
FailoverThreshold uint `mi:"FailoverThreshold"`
Flags uint `mi:"Flags"`
GroupType uint `mi:"GroupType"`
OwnerNode string `mi:"OwnerNode"`
Priority uint `mi:"Priority"`
ResiliencyPeriod uint `mi:"ResiliencyPeriod"`
State uint `mi:"State"`
}
func (c *Collector) buildResourceGroup() {
@@ -126,8 +130,8 @@ func (c *Collector) buildResourceGroup() {
func (c *Collector) collectResourceGroup(ch chan<- prometheus.Metric, nodeNames []string) error {
var dst []msClusterResourceGroup
if err := c.wmiClient.Query("SELECT * FROM MSCluster_ResourceGroup", &dst, nil, "root/MSCluster"); err != nil {
return err
if err := c.miSession.Query(&dst, mi.NamespaceRootMSCluster, utils.Must(mi.NewQuery("SELECT * FROM MSCluster_ResourceGroup"))); err != nil {
return fmt.Errorf("WMI query failed: %w", err)
}
for _, v := range dst {