process: Use registry collector for V1 data (#1814)

Signed-off-by: Jan-Otto Kröpke <mail@jkroepke.de>
This commit is contained in:
Jan-Otto Kröpke
2024-12-21 22:58:47 +01:00
committed by GitHub
parent 39c929eefe
commit a9f8b3b722
158 changed files with 7793 additions and 7748 deletions

View File

@@ -21,26 +21,26 @@ import (
"log/slog"
"os"
"strings"
"sync"
"github.com/alecthomas/kingpin/v2"
"github.com/prometheus-community/windows_exporter/internal/mi"
"github.com/prometheus-community/windows_exporter/internal/perfdata"
"github.com/prometheus/client_golang/prometheus"
)
const Name = "exchange"
const (
adAccessProcesses = "ADAccessProcesses"
transportQueues = "TransportQueues"
httpProxy = "HttpProxy"
activeSync = "ActiveSync"
availabilityService = "AvailabilityService"
outlookWebAccess = "OutlookWebAccess"
autoDiscover = "Autodiscover"
workloadManagement = "WorkloadManagement"
rpcClientAccess = "RpcClientAccess"
mapiHttpEmsmdb = "MapiHttpEmsmdb"
subCollectorADAccessProcesses = "ADAccessProcesses"
subCollectorTransportQueues = "TransportQueues"
subCollectorHttpProxy = "HttpProxy"
subCollectorActiveSync = "ActiveSync"
subCollectorAvailabilityService = "AvailabilityService"
subCollectorOutlookWebAccess = "OutlookWebAccess"
subCollectorAutoDiscover = "Autodiscover"
subCollectorWorkloadManagement = "WorkloadManagement"
subCollectorRpcClientAccess = "RpcClientAccess"
subCollectorMapiHttpEmsmdb = "MapiHttpEmsmdb"
)
type Config struct {
@@ -50,82 +50,35 @@ type Config struct {
//nolint:gochecknoglobals
var ConfigDefaults = Config{
CollectorsEnabled: []string{
adAccessProcesses,
transportQueues,
httpProxy,
activeSync,
availabilityService,
outlookWebAccess,
autoDiscover,
workloadManagement,
rpcClientAccess,
mapiHttpEmsmdb,
subCollectorADAccessProcesses,
subCollectorTransportQueues,
subCollectorHttpProxy,
subCollectorActiveSync,
subCollectorAvailabilityService,
subCollectorOutlookWebAccess,
subCollectorAutoDiscover,
subCollectorWorkloadManagement,
subCollectorRpcClientAccess,
subCollectorMapiHttpEmsmdb,
},
}
type Collector struct {
config Config
perfDataCollectorADAccessProcesses *perfdata.Collector
perfDataCollectorTransportQueues *perfdata.Collector
perfDataCollectorHttpProxy *perfdata.Collector
perfDataCollectorActiveSync *perfdata.Collector
perfDataCollectorAvailabilityService *perfdata.Collector
perfDataCollectorOWA *perfdata.Collector
perfDataCollectorAutoDiscover *perfdata.Collector
perfDataCollectorWorkloadManagementWorkloads *perfdata.Collector
perfDataCollectorRpcClientAccess *perfdata.Collector
perfDataCollectorMapiHttpEmsmdb *perfdata.Collector
collectorFns []func(ch chan<- prometheus.Metric) error
closeFns []func()
activeMailboxDeliveryQueueLength *prometheus.Desc
activeSyncRequestsPerSec *prometheus.Desc
activeTasks *prometheus.Desc
activeUserCount *prometheus.Desc
activeUserCountMapiHttpEmsMDB *prometheus.Desc
autoDiscoverRequestsPerSec *prometheus.Desc
availabilityRequestsSec *prometheus.Desc
averageAuthenticationLatency *prometheus.Desc
averageCASProcessingLatency *prometheus.Desc
completedTasks *prometheus.Desc
connectionCount *prometheus.Desc
currentUniqueUsers *prometheus.Desc
externalActiveRemoteDeliveryQueueLength *prometheus.Desc
externalLargestDeliveryQueueLength *prometheus.Desc
internalActiveRemoteDeliveryQueueLength *prometheus.Desc
internalLargestDeliveryQueueLength *prometheus.Desc
isActive *prometheus.Desc
ldapReadTime *prometheus.Desc
ldapSearchTime *prometheus.Desc
ldapTimeoutErrorsPerSec *prometheus.Desc
ldapWriteTime *prometheus.Desc
longRunningLDAPOperationsPerMin *prometheus.Desc
mailboxServerLocatorAverageLatency *prometheus.Desc
mailboxServerProxyFailureRate *prometheus.Desc
outstandingProxyRequests *prometheus.Desc
owaRequestsPerSec *prometheus.Desc
pingCommandsPending *prometheus.Desc
poisonQueueLength *prometheus.Desc
proxyRequestsPerSec *prometheus.Desc
queuedTasks *prometheus.Desc
retryMailboxDeliveryQueueLength *prometheus.Desc
rpcAveragedLatency *prometheus.Desc
rpcOperationsPerSec *prometheus.Desc
rpcRequests *prometheus.Desc
syncCommandsPerSec *prometheus.Desc
unreachableQueueLength *prometheus.Desc
userCount *prometheus.Desc
yieldedTasks *prometheus.Desc
messagesQueuedForDeliveryTotal *prometheus.Desc
messagesSubmittedTotal *prometheus.Desc
messagesDelayedTotal *prometheus.Desc
messagesCompletedDeliveryTotal *prometheus.Desc
shadowQueueLength *prometheus.Desc
submissionQueueLength *prometheus.Desc
delayQueueLength *prometheus.Desc
itemsCompletedDeliveryTotal *prometheus.Desc
itemsQueuedForDeliveryExpiredTotal *prometheus.Desc
itemsQueuedForDeliveryTotal *prometheus.Desc
itemsResubmittedTotal *prometheus.Desc
collectorADAccessProcesses
collectorActiveSync
collectorAutoDiscover
collectorAvailabilityService
collectorHTTPProxy
collectorMapiHttpEmsmdb
collectorOWA
collectorRpcClientAccess
collectorTransportQueues
collectorWorkloadManagementWorkloads
}
func New(config *Config) *Collector {
@@ -167,16 +120,16 @@ func NewWithFlags(app *kingpin.Application) *Collector {
app.PreAction(func(*kingpin.ParseContext) error {
if listAllCollectors {
collectorDesc := map[string]string{
adAccessProcesses: "[19108] MSExchange ADAccess Processes",
transportQueues: "[20524] MSExchangeTransport Queues",
httpProxy: "[36934] MSExchange HttpProxy",
activeSync: "[25138] MSExchange ActiveSync",
availabilityService: "[24914] MSExchange Availability Service",
outlookWebAccess: "[24618] MSExchange OWA",
autoDiscover: "[29240] MSExchange Autodiscover",
workloadManagement: "[19430] MSExchange WorkloadManagement Workloads",
rpcClientAccess: "[29336] MSExchange RpcClientAccess",
mapiHttpEmsmdb: "[26463] MSExchange MapiHttp Emsmdb",
subCollectorADAccessProcesses: "[19108] MSExchange ADAccess Processes",
subCollectorTransportQueues: "[20524] MSExchangeTransport Queues",
subCollectorHttpProxy: "[36934] MSExchange HttpProxy",
subCollectorActiveSync: "[25138] MSExchange ActiveSync",
subCollectorAvailabilityService: "[24914] MSExchange Availability Service",
subCollectorOutlookWebAccess: "[24618] MSExchange OWA",
subCollectorAutoDiscover: "[29240] MSExchange Autodiscover",
subCollectorWorkloadManagement: "[19430] MSExchange WorkloadManagement Workloads",
subCollectorRpcClientAccess: "[29336] MSExchange RpcClientAccess",
subCollectorMapiHttpEmsmdb: "[26463] MSExchange MapiHttp Emsmdb",
}
sb := strings.Builder{}
@@ -208,51 +161,116 @@ func (c *Collector) GetName() string {
}
func (c *Collector) Close() error {
for _, fn := range c.closeFns {
fn()
}
return nil
}
func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
collectorFuncs := map[string]func() error{
adAccessProcesses: c.buildADAccessProcesses,
transportQueues: c.buildTransportQueues,
httpProxy: c.buildHTTPProxy,
activeSync: c.buildActiveSync,
availabilityService: c.buildAvailabilityService,
outlookWebAccess: c.buildOWA,
autoDiscover: c.buildAutoDiscover,
workloadManagement: c.buildWorkloadManagementWorkloads,
rpcClientAccess: c.buildRPC,
mapiHttpEmsmdb: c.buildMapiHttpEmsmdb,
subCollectors := map[string]struct {
build func() error
collect func(ch chan<- prometheus.Metric) error
close func()
}{
subCollectorADAccessProcesses: {
build: c.buildADAccessProcesses,
collect: c.collectADAccessProcesses,
close: c.perfDataCollectorADAccessProcesses.Close,
},
subCollectorTransportQueues: {
build: c.buildTransportQueues,
collect: c.collectTransportQueues,
close: c.perfDataCollectorTransportQueues.Close,
},
subCollectorHttpProxy: {
build: c.buildHTTPProxy,
collect: c.collectHTTPProxy,
close: c.perfDataCollectorHTTPProxy.Close,
},
subCollectorActiveSync: {
build: c.buildActiveSync,
collect: c.collectActiveSync,
close: c.perfDataCollectorActiveSync.Close,
},
subCollectorAvailabilityService: {
build: c.buildAvailabilityService,
collect: c.collectAvailabilityService,
close: c.perfDataCollectorAvailabilityService.Close,
},
subCollectorOutlookWebAccess: {
build: c.buildOWA,
collect: c.collectOWA,
close: c.perfDataCollectorOWA.Close,
},
subCollectorAutoDiscover: {
build: c.buildAutoDiscover,
collect: c.collectAutoDiscover,
close: c.perfDataCollectorAutoDiscover.Close,
},
subCollectorWorkloadManagement: {
build: c.buildWorkloadManagementWorkloads,
collect: c.collectWorkloadManagementWorkloads,
close: c.perfDataCollectorWorkloadManagementWorkloads.Close,
},
subCollectorRpcClientAccess: {
build: c.buildRpcClientAccess,
collect: c.collectRpcClientAccess,
close: c.perfDataCollectorRpcClientAccess.Close,
},
subCollectorMapiHttpEmsmdb: {
build: c.buildMapiHttpEmsmdb,
collect: c.collectMapiHttpEmsmdb,
close: c.perfDataCollectorMapiHttpEmsmdb.Close,
},
}
for _, collectorName := range c.config.CollectorsEnabled {
if err := collectorFuncs[collectorName](); err != nil {
return err
errs := make([]error, 0, len(c.config.CollectorsEnabled))
for _, name := range c.config.CollectorsEnabled {
if _, ok := subCollectors[name]; !ok {
return fmt.Errorf("unknown collector: %s", name)
}
if err := subCollectors[name].build(); err != nil {
errs = append(errs, fmt.Errorf("failed to build %s collector: %w", name, err))
continue
}
c.collectorFns = append(c.collectorFns, subCollectors[name].collect)
c.closeFns = append(c.closeFns, subCollectors[name].close)
}
return nil
return errors.Join(errs...)
}
// Collect collects exchange metrics and sends them to prometheus.
func (c *Collector) Collect(ch chan<- prometheus.Metric) error {
collectorFuncs := map[string]func(ch chan<- prometheus.Metric) error{
adAccessProcesses: c.collectADAccessProcesses,
transportQueues: c.collectTransportQueues,
httpProxy: c.collectHTTPProxy,
activeSync: c.collectActiveSync,
availabilityService: c.collectAvailabilityService,
outlookWebAccess: c.collectOWA,
autoDiscover: c.collectAutoDiscover,
workloadManagement: c.collectWorkloadManagementWorkloads,
rpcClientAccess: c.collectRPC,
mapiHttpEmsmdb: c.collectMapiHttpEmsmdb,
errCh := make(chan error, len(c.collectorFns))
errs := make([]error, 0, len(c.collectorFns))
wg := sync.WaitGroup{}
for _, fn := range c.collectorFns {
wg.Add(1)
go func(fn func(ch chan<- prometheus.Metric) error) {
defer wg.Done()
if err := fn(ch); err != nil {
errCh <- err
}
}(fn)
}
errs := make([]error, len(c.config.CollectorsEnabled))
wg.Wait()
for i, collectorName := range c.config.CollectorsEnabled {
errs[i] = collectorFuncs[collectorName](ch)
close(errCh)
for err := range errCh {
errs = append(errs, err)
}
return errors.Join(errs...)
@@ -265,8 +283,3 @@ func (c *Collector) toLabelName(name string) string {
return s
}
// msToSec converts from ms to seconds.
func (c *Collector) msToSec(t float64) float64 {
return t / 1000
}