1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
|
// SPDX-License-Identifier: GPL-3.0-or-later
package windows
import (
"strings"
"github.com/netdata/netdata/go/go.d.plugin/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)
}
}
}
|