Files
windows_exporter/pkg/collector/ad/ad.go
2024-10-03 11:59:10 +02:00

2090 lines
58 KiB
Go

//go:build windows
package ad
import (
"errors"
"fmt"
"log/slog"
"github.com/alecthomas/kingpin/v2"
"github.com/prometheus-community/windows_exporter/pkg/perfdata"
"github.com/prometheus-community/windows_exporter/pkg/types"
"github.com/prometheus-community/windows_exporter/pkg/utils"
"github.com/prometheus/client_golang/prometheus"
"github.com/yusufpapurcu/wmi"
)
const Name = "ad"
type Config struct{}
var ConfigDefaults = Config{}
// A Collector is a Prometheus Collector for WMI Win32_PerfRawData_DirectoryServices_DirectoryServices metrics.
type Collector struct {
config Config
wmiClient *wmi.Client
perfDataCollector *perfdata.Collector
addressBookClientSessions *prometheus.Desc
addressBookOperationsTotal *prometheus.Desc
approximateHighestDistinguishedNameTag *prometheus.Desc
atqAverageRequestLatency *prometheus.Desc
atqCurrentThreads *prometheus.Desc
atqEstimatedDelaySeconds *prometheus.Desc
atqOutstandingRequests *prometheus.Desc
bindsTotal *prometheus.Desc
changeMonitorUpdatesPending *prometheus.Desc
changeMonitorsRegistered *prometheus.Desc
databaseOperationsTotal *prometheus.Desc
directoryOperationsTotal *prometheus.Desc
directorySearchSubOperationsTotal *prometheus.Desc
directoryServiceThreads *prometheus.Desc
interSiteReplicationDataBytesTotal *prometheus.Desc
intraSiteReplicationDataBytesTotal *prometheus.Desc
ldapActiveThreads *prometheus.Desc
ldapClientSessions *prometheus.Desc
ldapClosedConnectionsTotal *prometheus.Desc
ldapLastBindTimeSeconds *prometheus.Desc
ldapOpenedConnectionsTotal *prometheus.Desc
ldapSearchesTotal *prometheus.Desc
ldapUdpOperationsTotal *prometheus.Desc
ldapWritesTotal *prometheus.Desc
linkValuesCleanedTotal *prometheus.Desc
nameCacheHitsTotal *prometheus.Desc
nameCacheLookupsTotal *prometheus.Desc
nameTranslationsTotal *prometheus.Desc
phantomObjectsCleanedTotal *prometheus.Desc
phantomObjectsVisitedTotal *prometheus.Desc
replicationHighestUsn *prometheus.Desc
replicationInboundLinkValueUpdatesRemaining *prometheus.Desc
replicationInboundObjectsFilteredTotal *prometheus.Desc
replicationInboundObjectsUpdatedTotal *prometheus.Desc
replicationInboundPropertiesFilteredTotal *prometheus.Desc
replicationInboundPropertiesUpdatedTotal *prometheus.Desc
replicationInboundSyncObjectsRemaining *prometheus.Desc
replicationPendingOperations *prometheus.Desc
replicationPendingSynchronizations *prometheus.Desc
replicationSyncRequestsSchemaMismatchFailureTotal *prometheus.Desc
replicationSyncRequestsSuccessTotal *prometheus.Desc
replicationSyncRequestsTotal *prometheus.Desc
samComputerCreationRequestsTotal *prometheus.Desc
samComputerCreationSuccessfulRequestsTotal *prometheus.Desc
samEnumerationsTotal *prometheus.Desc
samGroupEvaluationLatency *prometheus.Desc
samGroupMembershipEvaluationsNonTransitiveTotal *prometheus.Desc
samGroupMembershipEvaluationsTotal *prometheus.Desc
samGroupMembershipEvaluationsTransitiveTotal *prometheus.Desc
samGroupMembershipGlobalCatalogEvaluationsTotal *prometheus.Desc
samMembershipChangesTotal *prometheus.Desc
samPasswordChangesTotal *prometheus.Desc
samQueryDisplayRequestsTotal *prometheus.Desc
samUserCreationRequestsTotal *prometheus.Desc
samUserCreationSuccessfulRequestsTotal *prometheus.Desc
searchesTotal *prometheus.Desc
securityDescriptorPropagationAccessWaitTotalSeconds *prometheus.Desc
securityDescriptorPropagationEventsQueued *prometheus.Desc
securityDescriptorPropagationEventsTotal *prometheus.Desc
securityDescriptorPropagationItemsQueuedTotal *prometheus.Desc
tombstonesObjectsCollectedTotal *prometheus.Desc
tombstonesObjectsVisitedTotal *prometheus.Desc
}
func New(config *Config) *Collector {
if config == nil {
config = &ConfigDefaults
}
c := &Collector{
config: *config,
}
return c
}
func NewWithFlags(_ *kingpin.Application) *Collector {
return &Collector{}
}
func (c *Collector) GetName() string {
return Name
}
func (c *Collector) GetPerfCounter(_ *slog.Logger) ([]string, error) {
return []string{}, nil
}
func (c *Collector) Close(_ *slog.Logger) error {
return nil
}
func (c *Collector) Build(_ *slog.Logger, wmiClient *wmi.Client) error {
if wmiClient == nil || wmiClient.SWbemServicesClient == nil {
return errors.New("wmiClient or SWbemServicesClient is nil")
}
if utils.PDHEnabled() {
counters := []string{
abANRPerSec,
abBrowsesPerSec,
abClientSessions,
abMatchesPerSec,
abPropertyReadsPerSec,
abProxyLookupsPerSec,
abSearchesPerSec,
approximateHighestDNT,
atqEstimatedQueueDelay,
atqOutstandingQueuedRequests,
atqRequestLatency,
atqThreadsLDAP,
atqThreadsOther,
atqThreadsTotal,
baseSearchesPerSec,
databaseAddsPerSec,
databaseDeletesPerSec,
databaseModifiesPerSec,
databaseRecyclesPerSec,
digestBindsPerSec,
draHighestUSNCommittedHighPart,
draHighestUSNCommittedLowPart,
draHighestUSNIssuedHighPart,
draHighestUSNIssuedLowPart,
draInboundBytesCompressedBetweenSitesAfterCompressionSinceBoot,
draInboundBytesCompressedBetweenSitesAfterCompressionPerSec,
draInboundBytesCompressedBetweenSitesBeforeCompressionSinceBoot,
draInboundBytesCompressedBetweenSitesBeforeCompressionPerSec,
draInboundBytesNotCompressedWithinSiteSinceBoot,
draInboundBytesNotCompressedWithinSitePerSec,
draInboundBytesTotalSinceBoot,
draInboundBytesTotalPerSec,
draInboundFullSyncObjectsRemaining,
draInboundLinkValueUpdatesRemainingInPacket,
draInboundObjectUpdatesRemainingInPacket,
draInboundObjectsAppliedPerSec,
draInboundObjectsFilteredPerSec,
draInboundObjectsPerSec,
draInboundPropertiesAppliedPerSec,
draInboundPropertiesFilteredPerSec,
draInboundPropertiesTotalPerSec,
draInboundTotalUpdatesRemainingInPacket,
draInboundValuesDNsOnlyPerSec,
draInboundValuesTotalPerSec,
draOutboundBytesCompressedBetweenSitesAfterCompressionSinceBoot,
draOutboundBytesCompressedBetweenSitesAfterCompressionPerSec,
draOutboundBytesCompressedBetweenSitesBeforeCompressionSinceBoot,
draOutboundBytesCompressedBetweenSitesBeforeCompressionPerSec,
draOutboundBytesNotCompressedWithinSiteSinceBoot,
draOutboundBytesNotCompressedWithinSitePerSec,
draOutboundBytesTotalSinceBoot,
draOutboundBytesTotalPerSec,
draOutboundObjectsFilteredPerSec,
draOutboundObjectsPerSec,
draOutboundPropertiesPerSec,
draOutboundValuesDNsOnlyPerSec,
draOutboundValuesTotalPerSec,
draPendingReplicationOperations,
draPendingReplicationSynchronizations,
draSyncFailuresOnSchemaMismatch,
draSyncRequestsMade,
draSyncRequestsSuccessful,
draThreadsGettingNCChanges,
draThreadsGettingNCChangesHoldingSemaphore,
dsPercentReadsFromDRA,
dsPercentReadsFromKCC,
dsPercentReadsFromLSA,
dsPercentReadsFromNSPI,
dsPercentReadsFromNTDSAPI,
dsPercentReadsFromSAM,
dsPercentReadsOther,
dsPercentSearchesFromDRA,
dsPercentSearchesFromKCC,
dsPercentSearchesFromLDAP,
dsPercentSearchesFromLSA,
dsPercentSearchesFromNSPI,
dsPercentSearchesFromNTDSAPI,
dsPercentSearchesFromSAM,
dsPercentSearchesOther,
dsPercentWritesFromDRA,
dsPercentWritesFromKCC,
dsPercentWritesFromLDAP,
dsPercentWritesFromLSA,
dsPercentWritesFromNSPI,
dsPercentWritesFromNTDSAPI,
dsPercentWritesFromSAM,
dsPercentWritesOther,
dsClientBindsPerSec,
dsClientNameTranslationsPerSec,
dsDirectoryReadsPerSec,
dsDirectorySearchesPerSec,
dsDirectoryWritesPerSec,
dsMonitorListSize,
dsNameCacheHitRate,
dsNotifyQueueSize,
dsSearchSubOperationsPerSec,
dsSecurityDescriptorPropagationsEvents,
dsSecurityDescriptorPropagatorAverageExclusionTime,
dsSecurityDescriptorPropagatorRuntimeQueue,
dsSecurityDescriptorSubOperationsPerSec,
dsServerBindsPerSec,
dsServerNameTranslationsPerSec,
dsThreadsInUse,
externalBindsPerSec,
fastBindsPerSec,
ldapActiveThreads,
ldapBindTime,
ldapClientSessions,
ldapClosedConnectionsPerSec,
ldapNewConnectionsPerSec,
ldapNewSSLConnectionsPerSec,
ldapSearchesPerSec,
ldapSuccessfulBindsPerSec,
ldapUDPOperationsPerSec,
ldapWritesPerSec,
linkValuesCleanedPerSec,
negotiatedBindsPerSec,
ntlmBindsPerSec,
oneLevelSearchesPerSec,
phantomsCleanedPerSec,
phantomsVisitedPerSec,
samAccountGroupEvaluationLatency,
samDisplayInformationQueriesPerSec,
samDomainLocalGroupMembershipEvaluationsPerSec,
samEnumerationsPerSec,
samGCEvaluationsPerSec,
samGlobalGroupMembershipEvaluationsPerSec,
samMachineCreationAttemptsPerSec,
samMembershipChangesPerSec,
samNonTransitiveMembershipEvaluationsPerSec,
samPasswordChangesPerSec,
samResourceGroupEvaluationLatency,
samSuccessfulComputerCreationsPerSecIncludesAllRequests,
samSuccessfulUserCreationsPerSec,
samTransitiveMembershipEvaluationsPerSec,
samUniversalGroupMembershipEvaluationsPerSec,
samUserCreationAttemptsPerSec,
simpleBindsPerSec,
subtreeSearchesPerSec,
tombstonesGarbageCollectedPerSec,
tombstonesVisitedPerSec,
transitiveOperationsMillisecondsRun,
transitiveOperationsPerSec,
transitiveSubOperationsPerSec,
}
var err error
c.perfDataCollector, err = perfdata.NewCollector("DirectoryServices", []string{"*"}, counters)
if err != nil {
return fmt.Errorf("failed to create DirectoryServices collector: %w", err)
}
}
c.wmiClient = wmiClient
c.addressBookOperationsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "address_book_operations_total"),
"",
[]string{"operation"},
nil,
)
c.addressBookClientSessions = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "address_book_client_sessions"),
"",
nil,
nil,
)
c.approximateHighestDistinguishedNameTag = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "approximate_highest_distinguished_name_tag"),
"",
nil,
nil,
)
c.atqEstimatedDelaySeconds = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "atq_estimated_delay_seconds"),
"",
nil,
nil,
)
c.atqOutstandingRequests = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "atq_outstanding_requests"),
"",
nil,
nil,
)
c.atqAverageRequestLatency = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "atq_average_request_latency"),
"",
nil,
nil,
)
c.atqCurrentThreads = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "atq_current_threads"),
"",
[]string{"service"},
nil,
)
c.searchesTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "searches_total"),
"",
[]string{"scope"},
nil,
)
c.databaseOperationsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "database_operations_total"),
"",
[]string{"operation"},
nil,
)
c.bindsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "binds_total"),
"",
[]string{"bind_method"},
nil,
)
c.replicationHighestUsn = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "replication_highest_usn"),
"",
[]string{"state"},
nil,
)
c.intraSiteReplicationDataBytesTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "replication_data_intrasite_bytes_total"),
"",
[]string{"direction"},
nil,
)
c.interSiteReplicationDataBytesTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "replication_data_intersite_bytes_total"),
"",
[]string{"direction"},
nil,
)
c.replicationInboundSyncObjectsRemaining = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "replication_inbound_sync_objects_remaining"),
"",
nil,
nil,
)
c.replicationInboundLinkValueUpdatesRemaining = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "replication_inbound_link_value_updates_remaining"),
"",
nil,
nil,
)
c.replicationInboundObjectsUpdatedTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "replication_inbound_objects_updated_total"),
"",
nil,
nil,
)
c.replicationInboundObjectsFilteredTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "replication_inbound_objects_filtered_total"),
"",
nil,
nil,
)
c.replicationInboundPropertiesUpdatedTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "replication_inbound_properties_updated_total"),
"",
nil,
nil,
)
c.replicationInboundPropertiesFilteredTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "replication_inbound_properties_filtered_total"),
"",
nil,
nil,
)
c.replicationPendingOperations = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "replication_pending_operations"),
"",
nil,
nil,
)
c.replicationPendingSynchronizations = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "replication_pending_synchronizations"),
"",
nil,
nil,
)
c.replicationSyncRequestsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "replication_sync_requests_total"),
"",
nil,
nil,
)
c.replicationSyncRequestsSuccessTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "replication_sync_requests_success_total"),
"",
nil,
nil,
)
c.replicationSyncRequestsSchemaMismatchFailureTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "replication_sync_requests_schema_mismatch_failure_total"),
"",
nil,
nil,
)
c.nameTranslationsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "name_translations_total"),
"",
[]string{"target_name"},
nil,
)
c.changeMonitorsRegistered = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "change_monitors_registered"),
"",
nil,
nil,
)
c.changeMonitorUpdatesPending = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "change_monitor_updates_pending"),
"",
nil,
nil,
)
c.nameCacheHitsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "name_cache_hits_total"),
"",
nil,
nil,
)
c.nameCacheLookupsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "name_cache_lookups_total"),
"",
nil,
nil,
)
c.directoryOperationsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "directory_operations_total"),
"",
[]string{"operation", "origin"},
nil,
)
c.directorySearchSubOperationsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "directory_search_suboperations_total"),
"",
nil,
nil,
)
c.securityDescriptorPropagationEventsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "security_descriptor_propagation_events_total"),
"",
nil,
nil,
)
c.securityDescriptorPropagationEventsQueued = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "security_descriptor_propagation_events_queued"),
"",
nil,
nil,
)
c.securityDescriptorPropagationAccessWaitTotalSeconds = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "security_descriptor_propagation_access_wait_total_seconds"),
"",
nil,
nil,
)
c.securityDescriptorPropagationItemsQueuedTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "security_descriptor_propagation_items_queued_total"),
"",
nil,
nil,
)
c.directoryServiceThreads = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "directory_service_threads"),
"",
nil,
nil,
)
c.ldapClosedConnectionsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "ldap_closed_connections_total"),
"",
nil,
nil,
)
c.ldapOpenedConnectionsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "ldap_opened_connections_total"),
"",
[]string{"type"},
nil,
)
c.ldapActiveThreads = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "ldap_active_threads"),
"",
nil,
nil,
)
c.ldapLastBindTimeSeconds = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "ldap_last_bind_time_seconds"),
"",
nil,
nil,
)
c.ldapSearchesTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "ldap_searches_total"),
"",
nil,
nil,
)
c.ldapUdpOperationsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "ldap_udp_operations_total"),
"",
nil,
nil,
)
c.ldapWritesTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "ldap_writes_total"),
"",
nil,
nil,
)
c.ldapClientSessions = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "ldap_client_sessions"),
"This is the number of sessions opened by LDAP clients at the time the data is taken. This is helpful in determining LDAP client activity and if the DC is able to handle the load. Of course, spikes during normal periods of authentication — such as first thing in the morning — are not necessarily a problem, but long sustained periods of high values indicate an overworked DC.",
nil,
nil,
)
c.linkValuesCleanedTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "link_values_cleaned_total"),
"",
nil,
nil,
)
c.phantomObjectsCleanedTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "phantom_objects_cleaned_total"),
"",
nil,
nil,
)
c.phantomObjectsVisitedTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "phantom_objects_visited_total"),
"",
nil,
nil,
)
c.samGroupMembershipEvaluationsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sam_group_membership_evaluations_total"),
"",
[]string{"group_type"},
nil,
)
c.samGroupMembershipGlobalCatalogEvaluationsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sam_group_membership_global_catalog_evaluations_total"),
"",
nil,
nil,
)
c.samGroupMembershipEvaluationsNonTransitiveTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sam_group_membership_evaluations_nontransitive_total"),
"",
nil,
nil,
)
c.samGroupMembershipEvaluationsTransitiveTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sam_group_membership_evaluations_transitive_total"),
"",
nil,
nil,
)
c.samGroupEvaluationLatency = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sam_group_evaluation_latency"),
"The mean latency of the last 100 group evaluations performed for authentication",
[]string{"evaluation_type"},
nil,
)
c.samComputerCreationRequestsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sam_computer_creation_requests_total"),
"",
nil,
nil,
)
c.samComputerCreationSuccessfulRequestsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sam_computer_creation_successful_requests_total"),
"",
nil,
nil,
)
c.samUserCreationRequestsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sam_user_creation_requests_total"),
"",
nil,
nil,
)
c.samUserCreationSuccessfulRequestsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sam_user_creation_successful_requests_total"),
"",
nil,
nil,
)
c.samQueryDisplayRequestsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sam_query_display_requests_total"),
"",
nil,
nil,
)
c.samEnumerationsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sam_enumerations_total"),
"",
nil,
nil,
)
c.samMembershipChangesTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sam_membership_changes_total"),
"",
nil,
nil,
)
c.samPasswordChangesTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sam_password_changes_total"),
"",
nil,
nil,
)
c.tombstonesObjectsCollectedTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "tombstoned_objects_collected_total"),
"",
nil,
nil,
)
c.tombstonesObjectsVisitedTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "tombstoned_objects_visited_total"),
"",
nil,
nil,
)
return nil
}
// Collect sends the metric values for each metric
// to the provided prometheus Metric channel.
func (c *Collector) Collect(_ *types.ScrapeContext, logger *slog.Logger, ch chan<- prometheus.Metric) error {
if utils.PDHEnabled() {
return c.collectPDH(ch)
}
logger = logger.With(slog.String("collector", Name))
if err := c.collect(ch); err != nil {
logger.Error("failed collecting ad metrics",
slog.Any("err", err),
)
return err
}
return nil
}
func (c *Collector) collect(ch chan<- prometheus.Metric) error {
var dst []Win32_PerfRawData_DirectoryServices_DirectoryServices
if err := c.wmiClient.Query("SELECT * FROM Win32_PerfRawData_DirectoryServices_DirectoryServices", &dst); err != nil {
return err
}
if len(dst) == 0 {
return errors.New("WMI query returned empty result set")
}
ch <- prometheus.MustNewConstMetric(
c.addressBookOperationsTotal,
prometheus.CounterValue,
float64(dst[0].ABANRPersec),
"ambiguous_name_resolution",
)
ch <- prometheus.MustNewConstMetric(
c.addressBookOperationsTotal,
prometheus.CounterValue,
float64(dst[0].ABBrowsesPersec),
"browse",
)
ch <- prometheus.MustNewConstMetric(
c.addressBookOperationsTotal,
prometheus.CounterValue,
float64(dst[0].ABMatchesPersec),
"find",
)
ch <- prometheus.MustNewConstMetric(
c.addressBookOperationsTotal,
prometheus.CounterValue,
float64(dst[0].ABPropertyReadsPersec),
"property_read",
)
ch <- prometheus.MustNewConstMetric(
c.addressBookOperationsTotal,
prometheus.CounterValue,
float64(dst[0].ABSearchesPersec),
"search",
)
ch <- prometheus.MustNewConstMetric(
c.addressBookOperationsTotal,
prometheus.CounterValue,
float64(dst[0].ABProxyLookupsPersec),
"proxy_search",
)
ch <- prometheus.MustNewConstMetric(
c.addressBookClientSessions,
prometheus.GaugeValue,
float64(dst[0].ABClientSessions),
)
ch <- prometheus.MustNewConstMetric(
c.approximateHighestDistinguishedNameTag,
prometheus.GaugeValue,
float64(dst[0].ApproximatehighestDNT),
)
ch <- prometheus.MustNewConstMetric(
c.atqEstimatedDelaySeconds,
prometheus.GaugeValue,
float64(dst[0].ATQEstimatedQueueDelay)/1000,
)
ch <- prometheus.MustNewConstMetric(
c.atqOutstandingRequests,
prometheus.GaugeValue,
float64(dst[0].ATQOutstandingQueuedRequests),
)
ch <- prometheus.MustNewConstMetric(
c.atqAverageRequestLatency,
prometheus.GaugeValue,
float64(dst[0].ATQRequestLatency),
)
ch <- prometheus.MustNewConstMetric(
c.atqCurrentThreads,
prometheus.GaugeValue,
float64(dst[0].ATQThreadsLDAP),
"ldap",
)
ch <- prometheus.MustNewConstMetric(
c.atqCurrentThreads,
prometheus.GaugeValue,
float64(dst[0].ATQThreadsOther),
"other",
)
ch <- prometheus.MustNewConstMetric(
c.searchesTotal,
prometheus.CounterValue,
float64(dst[0].BasesearchesPersec),
"base",
)
ch <- prometheus.MustNewConstMetric(
c.searchesTotal,
prometheus.CounterValue,
float64(dst[0].SubtreesearchesPersec),
"subtree",
)
ch <- prometheus.MustNewConstMetric(
c.searchesTotal,
prometheus.CounterValue,
float64(dst[0].OnelevelsearchesPersec),
"one_level",
)
ch <- prometheus.MustNewConstMetric(
c.databaseOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DatabaseaddsPersec),
"add",
)
ch <- prometheus.MustNewConstMetric(
c.databaseOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DatabasedeletesPersec),
"delete",
)
ch <- prometheus.MustNewConstMetric(
c.databaseOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DatabasemodifysPersec),
"modify",
)
ch <- prometheus.MustNewConstMetric(
c.databaseOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DatabaserecyclesPersec),
"recycle",
)
ch <- prometheus.MustNewConstMetric(
c.bindsTotal,
prometheus.CounterValue,
float64(dst[0].DigestBindsPersec),
"digest",
)
ch <- prometheus.MustNewConstMetric(
c.bindsTotal,
prometheus.CounterValue,
float64(dst[0].DSClientBindsPersec),
"ds_client",
)
ch <- prometheus.MustNewConstMetric(
c.bindsTotal,
prometheus.CounterValue,
float64(dst[0].DSServerBindsPersec),
"ds_server",
)
ch <- prometheus.MustNewConstMetric(
c.bindsTotal,
prometheus.CounterValue,
float64(dst[0].ExternalBindsPersec),
"external",
)
ch <- prometheus.MustNewConstMetric(
c.bindsTotal,
prometheus.CounterValue,
float64(dst[0].FastBindsPersec),
"fast",
)
ch <- prometheus.MustNewConstMetric(
c.bindsTotal,
prometheus.CounterValue,
float64(dst[0].NegotiatedBindsPersec),
"negotiate",
)
ch <- prometheus.MustNewConstMetric(
c.bindsTotal,
prometheus.CounterValue,
float64(dst[0].NTLMBindsPersec),
"ntlm",
)
ch <- prometheus.MustNewConstMetric(
c.bindsTotal,
prometheus.CounterValue,
float64(dst[0].SimpleBindsPersec),
"simple",
)
ch <- prometheus.MustNewConstMetric(
c.bindsTotal,
prometheus.CounterValue,
float64(dst[0].LDAPSuccessfulBindsPersec),
"ldap",
)
ch <- prometheus.MustNewConstMetric(
c.replicationHighestUsn,
prometheus.CounterValue,
float64(dst[0].DRAHighestUSNCommittedHighpart<<32)+float64(dst[0].DRAHighestUSNCommittedLowpart),
"committed",
)
ch <- prometheus.MustNewConstMetric(
c.replicationHighestUsn,
prometheus.CounterValue,
float64(dst[0].DRAHighestUSNIssuedHighpart<<32)+float64(dst[0].DRAHighestUSNIssuedLowpart),
"issued",
)
ch <- prometheus.MustNewConstMetric(
c.interSiteReplicationDataBytesTotal,
prometheus.CounterValue,
float64(dst[0].DRAInboundBytesCompressedBetweenSitesAfterCompressionPersec),
"inbound",
)
// The pre-compression data size seems to have little value? Skipping for now
// ch <- prometheus.MustNewConstMetric(
// c.interSiteReplicationDataBytesTotal,
// prometheus.CounterValue,
// float64(dst[0].DRAInboundBytesCompressedBetweenSitesBeforeCompressionPersec),
// "inbound",
// )
ch <- prometheus.MustNewConstMetric(
c.interSiteReplicationDataBytesTotal,
prometheus.CounterValue,
float64(dst[0].DRAOutboundBytesCompressedBetweenSitesAfterCompressionPersec),
"outbound",
)
// ch <- prometheus.MustNewConstMetric(
// c.interSiteReplicationDataBytesTotal,
// prometheus.CounterValue,
// float64(dst[0].DRAOutboundBytesCompressedBetweenSitesBeforeCompressionPersec),
// "outbound",
// )
ch <- prometheus.MustNewConstMetric(
c.intraSiteReplicationDataBytesTotal,
prometheus.CounterValue,
float64(dst[0].DRAInboundBytesNotCompressedWithinSitePersec),
"inbound",
)
ch <- prometheus.MustNewConstMetric(
c.intraSiteReplicationDataBytesTotal,
prometheus.CounterValue,
float64(dst[0].DRAOutboundBytesNotCompressedWithinSitePersec),
"outbound",
)
ch <- prometheus.MustNewConstMetric(
c.replicationInboundSyncObjectsRemaining,
prometheus.GaugeValue,
float64(dst[0].DRAInboundFullSyncObjectsRemaining),
)
ch <- prometheus.MustNewConstMetric(
c.replicationInboundLinkValueUpdatesRemaining,
prometheus.GaugeValue,
float64(dst[0].DRAInboundLinkValueUpdatesRemaininginPacket),
)
ch <- prometheus.MustNewConstMetric(
c.replicationInboundObjectsUpdatedTotal,
prometheus.CounterValue,
float64(dst[0].DRAInboundObjectsAppliedPersec),
)
ch <- prometheus.MustNewConstMetric(
c.replicationInboundObjectsFilteredTotal,
prometheus.CounterValue,
float64(dst[0].DRAInboundObjectsFilteredPersec),
)
ch <- prometheus.MustNewConstMetric(
c.replicationInboundPropertiesUpdatedTotal,
prometheus.CounterValue,
float64(dst[0].DRAInboundPropertiesAppliedPersec),
)
ch <- prometheus.MustNewConstMetric(
c.replicationInboundPropertiesFilteredTotal,
prometheus.CounterValue,
float64(dst[0].DRAInboundPropertiesFilteredPersec),
)
ch <- prometheus.MustNewConstMetric(
c.replicationPendingOperations,
prometheus.GaugeValue,
float64(dst[0].DRAPendingReplicationOperations),
)
ch <- prometheus.MustNewConstMetric(
c.replicationPendingSynchronizations,
prometheus.GaugeValue,
float64(dst[0].DRAPendingReplicationSynchronizations),
)
ch <- prometheus.MustNewConstMetric(
c.replicationSyncRequestsTotal,
prometheus.CounterValue,
float64(dst[0].DRASyncRequestsMade),
)
ch <- prometheus.MustNewConstMetric(
c.replicationSyncRequestsSuccessTotal,
prometheus.CounterValue,
float64(dst[0].DRASyncRequestsSuccessful),
)
ch <- prometheus.MustNewConstMetric(
c.replicationSyncRequestsSchemaMismatchFailureTotal,
prometheus.CounterValue,
float64(dst[0].DRASyncFailuresonSchemaMismatch),
)
ch <- prometheus.MustNewConstMetric(
c.nameTranslationsTotal,
prometheus.CounterValue,
float64(dst[0].DSClientNameTranslationsPersec),
"client",
)
ch <- prometheus.MustNewConstMetric(
c.nameTranslationsTotal,
prometheus.CounterValue,
float64(dst[0].DSServerNameTranslationsPersec),
"server",
)
ch <- prometheus.MustNewConstMetric(
c.changeMonitorsRegistered,
prometheus.GaugeValue,
float64(dst[0].DSMonitorListSize),
)
ch <- prometheus.MustNewConstMetric(
c.changeMonitorUpdatesPending,
prometheus.GaugeValue,
float64(dst[0].DSNotifyQueueSize),
)
ch <- prometheus.MustNewConstMetric(
c.nameCacheHitsTotal,
prometheus.CounterValue,
float64(dst[0].DSNameCachehitrate),
)
ch <- prometheus.MustNewConstMetric(
c.nameCacheLookupsTotal,
prometheus.CounterValue,
float64(dst[0].DSNameCachehitrate_Base),
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentReadsfromDRA),
"read",
"replication_agent",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentReadsfromKCC),
"read",
"knowledge_consistency_checker",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentReadsfromLSA),
"read",
"local_security_authority",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentReadsfromNSPI),
"read",
"name_service_provider_interface",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentReadsfromNTDSAPI),
"read",
"directory_service_api",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentReadsfromSAM),
"read",
"security_account_manager",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentReadsOther),
"read",
"other",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentSearchesfromDRA),
"search",
"replication_agent",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentSearchesfromKCC),
"search",
"knowledge_consistency_checker",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentSearchesfromLDAP),
"search",
"ldap",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentSearchesfromLSA),
"search",
"local_security_authority",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentSearchesfromNSPI),
"search",
"name_service_provider_interface",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentSearchesfromNTDSAPI),
"search",
"directory_service_api",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentSearchesfromSAM),
"search",
"security_account_manager",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentSearchesOther),
"search",
"other",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentWritesfromDRA),
"write",
"replication_agent",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentWritesfromKCC),
"write",
"knowledge_consistency_checker",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentWritesfromLDAP),
"write",
"ldap",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentWritesfromLSA),
"write",
"local_security_authority",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentWritesfromNSPI),
"write",
"name_service_provider_interface",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentWritesfromNTDSAPI),
"write",
"directory_service_api",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentWritesfromSAM),
"write",
"security_account_manager",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSPercentWritesOther),
"write",
"other",
)
ch <- prometheus.MustNewConstMetric(
c.directorySearchSubOperationsTotal,
prometheus.CounterValue,
float64(dst[0].DSSearchsuboperationsPersec),
)
ch <- prometheus.MustNewConstMetric(
c.securityDescriptorPropagationEventsTotal,
prometheus.CounterValue,
float64(dst[0].DSSecurityDescriptorsuboperationsPersec),
)
ch <- prometheus.MustNewConstMetric(
c.securityDescriptorPropagationEventsQueued,
prometheus.GaugeValue,
float64(dst[0].DSSecurityDescriptorPropagationsEvents),
)
ch <- prometheus.MustNewConstMetric(
c.securityDescriptorPropagationAccessWaitTotalSeconds,
prometheus.GaugeValue,
float64(dst[0].DSSecurityDescriptorPropagatorAverageExclusionTime),
)
ch <- prometheus.MustNewConstMetric(
c.securityDescriptorPropagationItemsQueuedTotal,
prometheus.CounterValue,
float64(dst[0].DSSecurityDescriptorPropagatorRuntimeQueue),
)
ch <- prometheus.MustNewConstMetric(
c.directoryServiceThreads,
prometheus.GaugeValue,
float64(dst[0].DSThreadsinUse),
)
ch <- prometheus.MustNewConstMetric(
c.ldapClosedConnectionsTotal,
prometheus.CounterValue,
float64(dst[0].LDAPClosedConnectionsPersec),
)
ch <- prometheus.MustNewConstMetric(
c.ldapOpenedConnectionsTotal,
prometheus.CounterValue,
float64(dst[0].LDAPNewConnectionsPersec),
"ldap",
)
ch <- prometheus.MustNewConstMetric(
c.ldapOpenedConnectionsTotal,
prometheus.CounterValue,
float64(dst[0].LDAPNewSSLConnectionsPersec),
"ldaps",
)
ch <- prometheus.MustNewConstMetric(
c.ldapActiveThreads,
prometheus.GaugeValue,
float64(dst[0].LDAPActiveThreads),
)
ch <- prometheus.MustNewConstMetric(
c.ldapLastBindTimeSeconds,
prometheus.GaugeValue,
float64(dst[0].LDAPBindTime)/1000,
)
ch <- prometheus.MustNewConstMetric(
c.ldapSearchesTotal,
prometheus.CounterValue,
float64(dst[0].LDAPSearchesPersec),
)
ch <- prometheus.MustNewConstMetric(
c.ldapUdpOperationsTotal,
prometheus.CounterValue,
float64(dst[0].LDAPUDPoperationsPersec),
)
ch <- prometheus.MustNewConstMetric(
c.ldapWritesTotal,
prometheus.CounterValue,
float64(dst[0].LDAPWritesPersec),
)
ch <- prometheus.MustNewConstMetric(
c.ldapClientSessions,
prometheus.GaugeValue,
float64(dst[0].LDAPClientSessions),
)
ch <- prometheus.MustNewConstMetric(
c.linkValuesCleanedTotal,
prometheus.CounterValue,
float64(dst[0].LinkValuesCleanedPersec),
)
ch <- prometheus.MustNewConstMetric(
c.phantomObjectsCleanedTotal,
prometheus.CounterValue,
float64(dst[0].PhantomsCleanedPersec),
)
ch <- prometheus.MustNewConstMetric(
c.phantomObjectsVisitedTotal,
prometheus.CounterValue,
float64(dst[0].PhantomsVisitedPersec),
)
ch <- prometheus.MustNewConstMetric(
c.samGroupMembershipEvaluationsTotal,
prometheus.CounterValue,
float64(dst[0].SAMGlobalGroupMembershipEvaluationsPersec),
"global",
)
ch <- prometheus.MustNewConstMetric(
c.samGroupMembershipEvaluationsTotal,
prometheus.CounterValue,
float64(dst[0].SAMDomainLocalGroupMembershipEvaluationsPersec),
"domain_local",
)
ch <- prometheus.MustNewConstMetric(
c.samGroupMembershipEvaluationsTotal,
prometheus.CounterValue,
float64(dst[0].SAMUniversalGroupMembershipEvaluationsPersec),
"universal",
)
ch <- prometheus.MustNewConstMetric(
c.samGroupMembershipGlobalCatalogEvaluationsTotal,
prometheus.CounterValue,
float64(dst[0].SAMGCEvaluationsPersec),
)
ch <- prometheus.MustNewConstMetric(
c.samGroupMembershipEvaluationsNonTransitiveTotal,
prometheus.CounterValue,
float64(dst[0].SAMNonTransitiveMembershipEvaluationsPersec),
)
ch <- prometheus.MustNewConstMetric(
c.samGroupMembershipEvaluationsTransitiveTotal,
prometheus.CounterValue,
float64(dst[0].SAMTransitiveMembershipEvaluationsPersec),
)
ch <- prometheus.MustNewConstMetric(
c.samGroupEvaluationLatency,
prometheus.GaugeValue,
float64(dst[0].SAMAccountGroupEvaluationLatency),
"account_group",
)
ch <- prometheus.MustNewConstMetric(
c.samGroupEvaluationLatency,
prometheus.GaugeValue,
float64(dst[0].SAMResourceGroupEvaluationLatency),
"resource_group",
)
ch <- prometheus.MustNewConstMetric(
c.samComputerCreationRequestsTotal,
prometheus.CounterValue,
float64(dst[0].SAMSuccessfulComputerCreationsPersecIncludesallrequests),
)
ch <- prometheus.MustNewConstMetric(
c.samComputerCreationSuccessfulRequestsTotal,
prometheus.CounterValue,
float64(dst[0].SAMMachineCreationAttemptsPersec),
)
ch <- prometheus.MustNewConstMetric(
c.samUserCreationRequestsTotal,
prometheus.CounterValue,
float64(dst[0].SAMUserCreationAttemptsPersec),
)
ch <- prometheus.MustNewConstMetric(
c.samUserCreationSuccessfulRequestsTotal,
prometheus.CounterValue,
float64(dst[0].SAMSuccessfulUserCreationsPersec),
)
ch <- prometheus.MustNewConstMetric(
c.samQueryDisplayRequestsTotal,
prometheus.CounterValue,
float64(dst[0].SAMDisplayInformationQueriesPersec),
)
ch <- prometheus.MustNewConstMetric(
c.samEnumerationsTotal,
prometheus.CounterValue,
float64(dst[0].SAMEnumerationsPersec),
)
ch <- prometheus.MustNewConstMetric(
c.samMembershipChangesTotal,
prometheus.CounterValue,
float64(dst[0].SAMMembershipChangesPersec),
)
ch <- prometheus.MustNewConstMetric(
c.samPasswordChangesTotal,
prometheus.CounterValue,
float64(dst[0].SAMPasswordChangesPersec),
)
ch <- prometheus.MustNewConstMetric(
c.tombstonesObjectsCollectedTotal,
prometheus.CounterValue,
float64(dst[0].TombstonesGarbageCollectedPersec),
)
ch <- prometheus.MustNewConstMetric(
c.tombstonesObjectsVisitedTotal,
prometheus.CounterValue,
float64(dst[0].TombstonesVisitedPersec),
)
return nil
}
func (c *Collector) collectPDH(ch chan<- prometheus.Metric) error {
data, err := c.perfDataCollector.Collect()
if err != nil {
return fmt.Errorf("failed to collect DirectoryServices (AD) metrics: %w", err)
}
adData, ok := data[perfdata.EmptyInstance]
if !ok {
return errors.New("perflib query for DirectoryServices (AD) returned empty result set")
}
ch <- prometheus.MustNewConstMetric(
c.addressBookOperationsTotal,
prometheus.CounterValue,
adData[abANRPerSec].FirstValue,
"ambiguous_name_resolution",
)
ch <- prometheus.MustNewConstMetric(
c.addressBookOperationsTotal,
prometheus.CounterValue,
adData[abBrowsesPerSec].FirstValue,
"browse",
)
ch <- prometheus.MustNewConstMetric(
c.addressBookOperationsTotal,
prometheus.CounterValue,
adData[abMatchesPerSec].FirstValue,
"find",
)
ch <- prometheus.MustNewConstMetric(
c.addressBookOperationsTotal,
prometheus.CounterValue,
adData[abPropertyReadsPerSec].FirstValue,
"property_read",
)
ch <- prometheus.MustNewConstMetric(
c.addressBookOperationsTotal,
prometheus.CounterValue,
adData[abSearchesPerSec].FirstValue,
"search",
)
ch <- prometheus.MustNewConstMetric(
c.addressBookOperationsTotal,
prometheus.CounterValue,
adData[abProxyLookupsPerSec].FirstValue,
"proxy_search",
)
ch <- prometheus.MustNewConstMetric(
c.addressBookClientSessions,
prometheus.GaugeValue,
adData[abClientSessions].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.approximateHighestDistinguishedNameTag,
prometheus.GaugeValue,
adData[approximateHighestDNT].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.atqEstimatedDelaySeconds,
prometheus.GaugeValue,
adData[atqEstimatedQueueDelay].FirstValue/1000,
)
ch <- prometheus.MustNewConstMetric(
c.atqOutstandingRequests,
prometheus.GaugeValue,
adData[atqOutstandingQueuedRequests].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.atqAverageRequestLatency,
prometheus.GaugeValue,
adData[atqRequestLatency].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.atqCurrentThreads,
prometheus.GaugeValue,
adData[atqThreadsLDAP].FirstValue,
"ldap",
)
ch <- prometheus.MustNewConstMetric(
c.atqCurrentThreads,
prometheus.GaugeValue,
adData[atqThreadsOther].FirstValue,
"other",
)
ch <- prometheus.MustNewConstMetric(
c.searchesTotal,
prometheus.CounterValue,
adData[baseSearchesPerSec].FirstValue,
"base",
)
ch <- prometheus.MustNewConstMetric(
c.searchesTotal,
prometheus.CounterValue,
adData[subtreeSearchesPerSec].FirstValue,
"subtree",
)
ch <- prometheus.MustNewConstMetric(
c.searchesTotal,
prometheus.CounterValue,
adData[oneLevelSearchesPerSec].FirstValue,
"one_level",
)
ch <- prometheus.MustNewConstMetric(
c.databaseOperationsTotal,
prometheus.CounterValue,
adData[databaseAddsPerSec].FirstValue,
"add",
)
ch <- prometheus.MustNewConstMetric(
c.databaseOperationsTotal,
prometheus.CounterValue,
adData[databaseDeletesPerSec].FirstValue,
"delete",
)
ch <- prometheus.MustNewConstMetric(
c.databaseOperationsTotal,
prometheus.CounterValue,
adData[databaseModifiesPerSec].FirstValue,
"modify",
)
ch <- prometheus.MustNewConstMetric(
c.databaseOperationsTotal,
prometheus.CounterValue,
adData[databaseRecyclesPerSec].FirstValue,
"recycle",
)
ch <- prometheus.MustNewConstMetric(
c.bindsTotal,
prometheus.CounterValue,
adData[digestBindsPerSec].FirstValue,
"digest",
)
ch <- prometheus.MustNewConstMetric(
c.bindsTotal,
prometheus.CounterValue,
adData[dsClientBindsPerSec].FirstValue,
"ds_client",
)
ch <- prometheus.MustNewConstMetric(
c.bindsTotal,
prometheus.CounterValue,
adData[dsServerBindsPerSec].FirstValue,
"ds_server",
)
ch <- prometheus.MustNewConstMetric(
c.bindsTotal,
prometheus.CounterValue,
adData[externalBindsPerSec].FirstValue,
"external",
)
ch <- prometheus.MustNewConstMetric(
c.bindsTotal,
prometheus.CounterValue,
adData[fastBindsPerSec].FirstValue,
"fast",
)
ch <- prometheus.MustNewConstMetric(
c.bindsTotal,
prometheus.CounterValue,
adData[negotiatedBindsPerSec].FirstValue,
"negotiate",
)
ch <- prometheus.MustNewConstMetric(
c.bindsTotal,
prometheus.CounterValue,
adData[ntlmBindsPerSec].FirstValue,
"ntlm",
)
ch <- prometheus.MustNewConstMetric(
c.bindsTotal,
prometheus.CounterValue,
adData[simpleBindsPerSec].FirstValue,
"simple",
)
ch <- prometheus.MustNewConstMetric(
c.bindsTotal,
prometheus.CounterValue,
adData[ldapSuccessfulBindsPerSec].FirstValue,
"ldap",
)
ch <- prometheus.MustNewConstMetric(
c.replicationHighestUsn,
prometheus.CounterValue,
float64(uint64(adData[draHighestUSNCommittedHighPart].FirstValue)<<32)+adData[draHighestUSNCommittedLowPart].FirstValue,
"committed",
)
ch <- prometheus.MustNewConstMetric(
c.replicationHighestUsn,
prometheus.CounterValue,
float64(uint64(adData[draHighestUSNIssuedHighPart].FirstValue)<<32)+adData[draHighestUSNIssuedLowPart].FirstValue,
"issued",
)
ch <- prometheus.MustNewConstMetric(
c.interSiteReplicationDataBytesTotal,
prometheus.CounterValue,
adData[draInboundBytesCompressedBetweenSitesAfterCompressionPerSec].FirstValue,
"inbound",
)
// The pre-compression data size seems to have little value? Skipping for now
// ch <- prometheus.MustNewConstMetric(
// c.interSiteReplicationDataBytesTotal,
// prometheus.CounterValue,
// float64(dst[0].DRAInboundBytesCompressedBetweenSitesBeforeCompressionPersec),
// "inbound",
// )
ch <- prometheus.MustNewConstMetric(
c.interSiteReplicationDataBytesTotal,
prometheus.CounterValue,
adData[draOutboundBytesCompressedBetweenSitesAfterCompressionPerSec].FirstValue,
"outbound",
)
// ch <- prometheus.MustNewConstMetric(
// c.interSiteReplicationDataBytesTotal,
// prometheus.CounterValue,
// float64(dst[0].DRAOutboundBytesCompressedBetweenSitesBeforeCompressionPersec),
// "outbound",
// )
ch <- prometheus.MustNewConstMetric(
c.intraSiteReplicationDataBytesTotal,
prometheus.CounterValue,
adData[draInboundBytesNotCompressedWithinSitePerSec].FirstValue,
"inbound",
)
ch <- prometheus.MustNewConstMetric(
c.intraSiteReplicationDataBytesTotal,
prometheus.CounterValue,
adData[draOutboundBytesNotCompressedWithinSitePerSec].FirstValue,
"outbound",
)
ch <- prometheus.MustNewConstMetric(
c.replicationInboundSyncObjectsRemaining,
prometheus.GaugeValue,
adData[draInboundFullSyncObjectsRemaining].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.replicationInboundLinkValueUpdatesRemaining,
prometheus.GaugeValue,
adData[draInboundLinkValueUpdatesRemainingInPacket].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.replicationInboundObjectsUpdatedTotal,
prometheus.CounterValue,
adData[draInboundObjectsAppliedPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.replicationInboundObjectsFilteredTotal,
prometheus.CounterValue,
adData[draInboundObjectsFilteredPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.replicationInboundPropertiesUpdatedTotal,
prometheus.CounterValue,
adData[draInboundPropertiesAppliedPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.replicationInboundPropertiesFilteredTotal,
prometheus.CounterValue,
adData[draInboundPropertiesFilteredPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.replicationPendingOperations,
prometheus.GaugeValue,
adData[draPendingReplicationOperations].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.replicationPendingSynchronizations,
prometheus.GaugeValue,
adData[draPendingReplicationSynchronizations].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.replicationSyncRequestsTotal,
prometheus.CounterValue,
adData[draSyncRequestsMade].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.replicationSyncRequestsSuccessTotal,
prometheus.CounterValue,
adData[draSyncRequestsSuccessful].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.replicationSyncRequestsSchemaMismatchFailureTotal,
prometheus.CounterValue,
adData[draSyncFailuresOnSchemaMismatch].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.nameTranslationsTotal,
prometheus.CounterValue,
adData[dsClientNameTranslationsPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.nameTranslationsTotal,
prometheus.CounterValue,
adData[dsServerNameTranslationsPerSec].FirstValue,
"server",
)
ch <- prometheus.MustNewConstMetric(
c.changeMonitorsRegistered,
prometheus.GaugeValue,
adData[dsMonitorListSize].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.changeMonitorUpdatesPending,
prometheus.GaugeValue,
adData[dsNotifyQueueSize].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.nameCacheHitsTotal,
prometheus.CounterValue,
adData[dsNameCacheHitRate].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.nameCacheLookupsTotal,
prometheus.CounterValue,
adData[dsNameCacheHitRate].SecondValue,
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentReadsFromDRA].FirstValue,
"read",
"replication_agent",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentReadsFromKCC].FirstValue,
"read",
"knowledge_consistency_checker",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentReadsFromLSA].FirstValue,
"read",
"local_security_authority",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentReadsFromNSPI].FirstValue,
"read",
"name_service_provider_interface",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentReadsFromNTDSAPI].FirstValue,
"read",
"directory_service_api",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentReadsFromSAM].FirstValue,
"read",
"security_account_manager",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentReadsOther].FirstValue,
"read",
"other",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentSearchesFromDRA].FirstValue,
"search",
"replication_agent",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentSearchesFromKCC].FirstValue,
"search",
"knowledge_consistency_checker",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentSearchesFromLDAP].FirstValue,
"search",
"ldap",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentSearchesFromLSA].FirstValue,
"search",
"local_security_authority",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentSearchesFromNSPI].FirstValue,
"search",
"name_service_provider_interface",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentSearchesFromNTDSAPI].FirstValue,
"search",
"directory_service_api",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentSearchesFromSAM].FirstValue,
"search",
"security_account_manager",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentSearchesOther].FirstValue,
"search",
"other",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentWritesFromDRA].FirstValue,
"write",
"replication_agent",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentWritesFromKCC].FirstValue,
"write",
"knowledge_consistency_checker",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentWritesFromLDAP].FirstValue,
"write",
"ldap",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentSearchesFromLSA].FirstValue,
"write",
"local_security_authority",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentWritesFromNSPI].FirstValue,
"write",
"name_service_provider_interface",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentWritesFromNTDSAPI].FirstValue,
"write",
"directory_service_api",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentWritesFromSAM].FirstValue,
"write",
"security_account_manager",
)
ch <- prometheus.MustNewConstMetric(
c.directoryOperationsTotal,
prometheus.CounterValue,
adData[dsPercentWritesOther].FirstValue,
"write",
"other",
)
ch <- prometheus.MustNewConstMetric(
c.directorySearchSubOperationsTotal,
prometheus.CounterValue,
adData[dsSearchSubOperationsPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.securityDescriptorPropagationEventsTotal,
prometheus.CounterValue,
adData[dsSecurityDescriptorSubOperationsPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.securityDescriptorPropagationEventsQueued,
prometheus.GaugeValue,
adData[dsSecurityDescriptorPropagationsEvents].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.securityDescriptorPropagationAccessWaitTotalSeconds,
prometheus.GaugeValue,
adData[dsSecurityDescriptorPropagatorAverageExclusionTime].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.securityDescriptorPropagationItemsQueuedTotal,
prometheus.CounterValue,
adData[dsSecurityDescriptorPropagatorRuntimeQueue].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.directoryServiceThreads,
prometheus.GaugeValue,
adData[dsThreadsInUse].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.ldapClosedConnectionsTotal,
prometheus.CounterValue,
adData[ldapClosedConnectionsPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.ldapOpenedConnectionsTotal,
prometheus.CounterValue,
adData[ldapNewConnectionsPerSec].FirstValue,
"ldap",
)
ch <- prometheus.MustNewConstMetric(
c.ldapOpenedConnectionsTotal,
prometheus.CounterValue,
adData[ldapNewSSLConnectionsPerSec].FirstValue,
"ldaps",
)
ch <- prometheus.MustNewConstMetric(
c.ldapActiveThreads,
prometheus.GaugeValue,
adData[ldapActiveThreads].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.ldapLastBindTimeSeconds,
prometheus.GaugeValue,
adData[ldapBindTime].FirstValue/1000,
)
ch <- prometheus.MustNewConstMetric(
c.ldapSearchesTotal,
prometheus.CounterValue,
adData[ldapSearchesPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.ldapUdpOperationsTotal,
prometheus.CounterValue,
adData[ldapUDPOperationsPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.ldapWritesTotal,
prometheus.CounterValue,
adData[ldapWritesPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.ldapClientSessions,
prometheus.GaugeValue,
adData[ldapClientSessions].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.linkValuesCleanedTotal,
prometheus.CounterValue,
adData[linkValuesCleanedPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.phantomObjectsCleanedTotal,
prometheus.CounterValue,
adData[phantomsCleanedPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.phantomObjectsVisitedTotal,
prometheus.CounterValue,
adData[phantomsVisitedPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.samGroupMembershipEvaluationsTotal,
prometheus.CounterValue,
adData[samGlobalGroupMembershipEvaluationsPerSec].FirstValue,
"global",
)
ch <- prometheus.MustNewConstMetric(
c.samGroupMembershipEvaluationsTotal,
prometheus.CounterValue,
adData[samDomainLocalGroupMembershipEvaluationsPerSec].FirstValue,
"domain_local",
)
ch <- prometheus.MustNewConstMetric(
c.samGroupMembershipEvaluationsTotal,
prometheus.CounterValue,
adData[samUniversalGroupMembershipEvaluationsPerSec].FirstValue,
"universal",
)
ch <- prometheus.MustNewConstMetric(
c.samGroupMembershipGlobalCatalogEvaluationsTotal,
prometheus.CounterValue,
adData[samGCEvaluationsPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.samGroupMembershipEvaluationsNonTransitiveTotal,
prometheus.CounterValue,
adData[samNonTransitiveMembershipEvaluationsPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.samGroupMembershipEvaluationsTransitiveTotal,
prometheus.CounterValue,
adData[samTransitiveMembershipEvaluationsPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.samGroupEvaluationLatency,
prometheus.GaugeValue,
adData[samAccountGroupEvaluationLatency].FirstValue,
"account_group",
)
ch <- prometheus.MustNewConstMetric(
c.samGroupEvaluationLatency,
prometheus.GaugeValue,
adData[samResourceGroupEvaluationLatency].FirstValue,
"resource_group",
)
ch <- prometheus.MustNewConstMetric(
c.samComputerCreationRequestsTotal,
prometheus.CounterValue,
adData[samSuccessfulComputerCreationsPerSecIncludesAllRequests].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.samComputerCreationSuccessfulRequestsTotal,
prometheus.CounterValue,
adData[samMachineCreationAttemptsPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.samUserCreationRequestsTotal,
prometheus.CounterValue,
adData[samUserCreationAttemptsPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.samUserCreationSuccessfulRequestsTotal,
prometheus.CounterValue,
adData[samSuccessfulUserCreationsPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.samQueryDisplayRequestsTotal,
prometheus.CounterValue,
adData[samDisplayInformationQueriesPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.samEnumerationsTotal,
prometheus.CounterValue,
adData[samEnumerationsPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.samMembershipChangesTotal,
prometheus.CounterValue,
adData[samMembershipChangesPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.samPasswordChangesTotal,
prometheus.CounterValue,
adData[samPasswordChangesPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.tombstonesObjectsCollectedTotal,
prometheus.CounterValue,
adData[tombstonesGarbageCollectedPerSec].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.tombstonesObjectsVisitedTotal,
prometheus.CounterValue,
adData[tombstonesVisitedPerSec].FirstValue,
)
return nil
}