diff options
Diffstat (limited to '')
-rw-r--r-- | src/go/plugin/go.d/modules/windows/collect_exchange.go | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/src/go/plugin/go.d/modules/windows/collect_exchange.go b/src/go/plugin/go.d/modules/windows/collect_exchange.go new file mode 100644 index 000000000..bbbbfd533 --- /dev/null +++ b/src/go/plugin/go.d/modules/windows/collect_exchange.go @@ -0,0 +1,244 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package windows + +import ( + "strings" + + "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/prometheus" +) + +const ( + metricExchangeActiveSyncPingCmdsPending = "windows_exchange_activesync_ping_cmds_pending" + metricExchangeActiveSyncRequestsTotal = "windows_exchange_activesync_requests_total" + metricExchangeActiveSyncCMDsTotal = "windows_exchange_activesync_sync_cmds_total" + metricExchangeAutoDiscoverRequestsTotal = "windows_exchange_autodiscover_requests_total" + metricExchangeAvailServiceRequestsPerSec = "windows_exchange_avail_service_requests_per_sec" + metricExchangeOWACurrentUniqueUsers = "windows_exchange_owa_current_unique_users" + metricExchangeOWARequestsTotal = "windows_exchange_owa_requests_total" + metricExchangeRPCActiveUserCount = "windows_exchange_rpc_active_user_count" + metricExchangeRPCAvgLatencySec = "windows_exchange_rpc_avg_latency_sec" + metricExchangeRPCConnectionCount = "windows_exchange_rpc_connection_count" + metricExchangeRPCOperationsTotal = "windows_exchange_rpc_operations_total" + metricExchangeRPCRequests = "windows_exchange_rpc_requests" + metricExchangeRPCUserCount = "windows_exchange_rpc_user_count" + + metricExchangeTransportQueuesActiveMailboxDelivery = "windows_exchange_transport_queues_active_mailbox_delivery" + metricExchangeTransportQueuesExternalActiveRemoteDelivery = "windows_exchange_transport_queues_external_active_remote_delivery" + metricExchangeTransportQueuesExternalLargestDelivery = "windows_exchange_transport_queues_external_largest_delivery" + metricExchangeTransportQueuesInternalActiveRemoteDelivery = "windows_exchange_transport_queues_internal_active_remote_delivery" + metricExchangeTransportQueuesInternalLargestDelivery = "windows_exchange_transport_queues_internal_largest_delivery" + metricExchangeTransportQueuesPoison = "windows_exchange_transport_queues_poison" + metricExchangeTransportQueuesRetryMailboxDelivery = "windows_exchange_transport_queues_retry_mailbox_delivery" + metricExchangeTransportQueuesUnreachable = "windows_exchange_transport_queues_unreachable" + + metricExchangeWorkloadActiveTasks = "windows_exchange_workload_active_tasks" + metricExchangeWorkloadCompletedTasks = "windows_exchange_workload_completed_tasks" + metricExchangeWorkloadQueuedTasks = "windows_exchange_workload_queued_tasks" + metricExchangeWorkloadYieldedTasks = "windows_exchange_workload_yielded_tasks" + metricExchangeWorkloadIsActive = "windows_exchange_workload_is_active" + + metricExchangeLDAPLongRunningOPSPerSec = "windows_exchange_ldap_long_running_ops_per_sec" + metricExchangeLDAPReadTimeSec = "windows_exchange_ldap_read_time_sec" + metricExchangeLDAPSearchTmeSec = "windows_exchange_ldap_search_time_sec" + metricExchangeLDAPWriteTimeSec = "windows_exchange_ldap_write_time_sec" + metricExchangeLDAPTimeoutErrorsTotal = "windows_exchange_ldap_timeout_errors_total" + + metricExchangeHTTPProxyAvgAuthLatency = "windows_exchange_http_proxy_avg_auth_latency" + metricExchangeHTTPProxyAvgCASProcessingLatencySec = "windows_exchange_http_proxy_avg_cas_proccessing_latency_sec" + metricExchangeHTTPProxyMailboxProxyFailureRate = "windows_exchange_http_proxy_mailbox_proxy_failure_rate" + metricExchangeHTTPProxyMailboxServerLocatorAvgLatencySec = "windows_exchange_http_proxy_mailbox_server_locator_avg_latency_sec" + metricExchangeHTTPProxyOutstandingProxyRequests = "windows_exchange_http_proxy_outstanding_proxy_requests" + metricExchangeHTTPProxyRequestsTotal = "windows_exchange_http_proxy_requests_total" +) + +func (w *Windows) collectExchange(mx map[string]int64, pms prometheus.Series) { + if !w.cache.collection[collectorExchange] { + w.cache.collection[collectorExchange] = true + w.addExchangeCharts() + } + + if pm := pms.FindByName(metricExchangeActiveSyncPingCmdsPending); pm.Len() > 0 { + mx["exchange_activesync_ping_cmds_pending"] = int64(pm.Max()) + } + if pm := pms.FindByName(metricExchangeActiveSyncRequestsTotal); pm.Len() > 0 { + mx["exchange_activesync_requests_total"] = int64(pm.Max()) + } + if pm := pms.FindByName(metricExchangeActiveSyncCMDsTotal); pm.Len() > 0 { + mx["exchange_activesync_sync_cmds_total"] = int64(pm.Max()) + } + if pm := pms.FindByName(metricExchangeAutoDiscoverRequestsTotal); pm.Len() > 0 { + mx["exchange_autodiscover_requests_total"] = int64(pm.Max()) + } + if pm := pms.FindByName(metricExchangeAvailServiceRequestsPerSec); pm.Len() > 0 { + mx["exchange_avail_service_requests_per_sec"] = int64(pm.Max()) + } + if pm := pms.FindByName(metricExchangeOWACurrentUniqueUsers); pm.Len() > 0 { + mx["exchange_owa_current_unique_users"] = int64(pm.Max()) + } + if pm := pms.FindByName(metricExchangeOWARequestsTotal); pm.Len() > 0 { + mx["exchange_owa_requests_total"] = int64(pm.Max()) + } + if pm := pms.FindByName(metricExchangeRPCActiveUserCount); pm.Len() > 0 { + mx["exchange_rpc_active_user_count"] = int64(pm.Max()) + } + if pm := pms.FindByName(metricExchangeRPCAvgLatencySec); pm.Len() > 0 { + mx["exchange_rpc_avg_latency_sec"] = int64(pm.Max() * precision) + } + if pm := pms.FindByName(metricExchangeRPCConnectionCount); pm.Len() > 0 { + mx["exchange_rpc_connection_count"] = int64(pm.Max()) + } + if pm := pms.FindByName(metricExchangeRPCOperationsTotal); pm.Len() > 0 { + mx["exchange_rpc_operations_total"] = int64(pm.Max()) + } + if pm := pms.FindByName(metricExchangeRPCRequests); pm.Len() > 0 { + mx["exchange_rpc_requests"] = int64(pm.Max()) + } + if pm := pms.FindByName(metricExchangeRPCUserCount); pm.Len() > 0 { + mx["exchange_rpc_user_count"] = int64(pm.Max()) + } + + w.collectExchangeAddTransportQueueMetric(mx, pms) + w.collectExchangeAddWorkloadMetric(mx, pms) + w.collectExchangeAddLDAPMetric(mx, pms) + w.collectExchangeAddHTTPProxyMetric(mx, pms) +} + +func (w *Windows) collectExchangeAddTransportQueueMetric(mx map[string]int64, pms prometheus.Series) { + pms = pms.FindByNames( + metricExchangeTransportQueuesActiveMailboxDelivery, + metricExchangeTransportQueuesExternalActiveRemoteDelivery, + metricExchangeTransportQueuesExternalLargestDelivery, + metricExchangeTransportQueuesInternalActiveRemoteDelivery, + metricExchangeTransportQueuesInternalLargestDelivery, + metricExchangeTransportQueuesPoison, + metricExchangeTransportQueuesRetryMailboxDelivery, + metricExchangeTransportQueuesUnreachable, + ) + + for _, pm := range pms { + if name := pm.Labels.Get("name"); name != "" && name != "total_excluding_priority_none" { + metric := strings.TrimPrefix(pm.Name(), "windows_") + mx[metric+"_"+name] += int64(pm.Value) + } + } +} + +func (w *Windows) collectExchangeAddWorkloadMetric(mx map[string]int64, pms prometheus.Series) { + seen := make(map[string]bool) + + for _, pm := range pms.FindByNames( + metricExchangeWorkloadActiveTasks, + metricExchangeWorkloadCompletedTasks, + metricExchangeWorkloadQueuedTasks, + metricExchangeWorkloadYieldedTasks, + ) { + if name := pm.Labels.Get("name"); name != "" { + seen[name] = true + metric := strings.TrimPrefix(pm.Name(), "windows_exchange_workload_") + mx["exchange_workload_"+name+"_"+metric] += int64(pm.Value) + } + } + + for _, pm := range pms.FindByName(metricExchangeWorkloadIsActive) { + if name := pm.Labels.Get("name"); name != "" { + seen[name] = true + mx["exchange_workload_"+name+"_is_active"] += boolToInt(pm.Value == 1) + mx["exchange_workload_"+name+"_is_paused"] += boolToInt(pm.Value == 0) + } + } + + for name := range seen { + if !w.cache.exchangeWorkload[name] { + w.cache.exchangeWorkload[name] = true + w.addExchangeWorkloadCharts(name) + } + } + for name := range w.cache.exchangeWorkload { + if !seen[name] { + delete(w.cache.exchangeWorkload, name) + w.removeExchangeWorkloadCharts(name) + } + } +} + +func (w *Windows) collectExchangeAddLDAPMetric(mx map[string]int64, pms prometheus.Series) { + seen := make(map[string]bool) + + for _, pm := range pms.FindByNames( + metricExchangeLDAPLongRunningOPSPerSec, + metricExchangeLDAPTimeoutErrorsTotal, + ) { + if name := pm.Labels.Get("name"); name != "" { + seen[name] = true + metric := strings.TrimPrefix(pm.Name(), "windows_exchange_ldap_") + mx["exchange_ldap_"+name+"_"+metric] += int64(pm.Value) + } + } + + for _, pm := range pms.FindByNames( + metricExchangeLDAPReadTimeSec, + metricExchangeLDAPSearchTmeSec, + metricExchangeLDAPWriteTimeSec, + ) { + if name := pm.Labels.Get("name"); name != "" { + seen[name] = true + metric := strings.TrimPrefix(pm.Name(), "windows_exchange_ldap_") + mx["exchange_ldap_"+name+"_"+metric] += int64(pm.Value * precision) + } + } + + for name := range seen { + if !w.cache.exchangeLDAP[name] { + w.cache.exchangeLDAP[name] = true + w.addExchangeLDAPCharts(name) + } + } + for name := range w.cache.exchangeLDAP { + if !seen[name] { + delete(w.cache.exchangeLDAP, name) + w.removeExchangeLDAPCharts(name) + } + } +} + +func (w *Windows) collectExchangeAddHTTPProxyMetric(mx map[string]int64, pms prometheus.Series) { + seen := make(map[string]bool) + + for _, pm := range pms.FindByNames( + metricExchangeHTTPProxyAvgAuthLatency, + metricExchangeHTTPProxyOutstandingProxyRequests, + metricExchangeHTTPProxyRequestsTotal, + ) { + if name := pm.Labels.Get("name"); name != "" { + seen[name] = true + metric := strings.TrimPrefix(pm.Name(), "windows_exchange_http_proxy_") + mx["exchange_http_proxy_"+name+"_"+metric] += int64(pm.Value) + } + } + + for _, pm := range pms.FindByNames( + metricExchangeHTTPProxyAvgCASProcessingLatencySec, + metricExchangeHTTPProxyMailboxProxyFailureRate, + metricExchangeHTTPProxyMailboxServerLocatorAvgLatencySec, + ) { + if name := pm.Labels.Get("name"); name != "" { + seen[name] = true + metric := strings.TrimPrefix(pm.Name(), "windows_exchange_http_proxy_") + mx["exchange_http_proxy_"+name+"_"+metric] += int64(pm.Value * precision) + } + } + + for name := range seen { + if !w.cache.exchangeHTTPProxy[name] { + w.cache.exchangeHTTPProxy[name] = true + w.addExchangeHTTPProxyCharts(name) + } + } + for name := range w.cache.exchangeHTTPProxy { + if !seen[name] { + delete(w.cache.exchangeHTTPProxy, name) + w.removeExchangeHTTPProxyCharts(name) + } + } +} |