Remove CR (windows.plugin) (#18737)
remove_cr: Remove CR from files edited on Win
thiagoftsm committed
Oct 10, 2024 at 18:06 UTC
861bf3150f8cb30d5e3b330e41b753e194e7aaac
1 file changed
+576
-576
src/collectors/windows.plugin/perflib-web-service.c
+576
-576
@@ -1,576 +1,576 @@
1
-// SPDX-License-Identifier: GPL-3.0-or-later
2
-
3
-#include "windows_plugin.h"
4
-#include "windows-internals.h"
5
-
6
-struct web_service {
7
- RRDSET *st_traffic;
8
- RRDDIM *rd_traffic_received;
9
- RRDDIM *rd_traffic_sent;
10
-
11
- RRDSET *st_file_transfer;
12
- RRDDIM *rd_files_received;
13
- RRDDIM *rd_files_sent;
14
-
15
- RRDSET *st_curr_connections;
16
- RRDDIM *rd_curr_connections;
17
-
18
- RRDSET *st_connections_attemps;
19
- RRDDIM *rd_connections_attemps;
20
-
21
- RRDSET *st_user_count;
22
- RRDDIM *rd_user_anonymous;
23
- RRDDIM *rd_user_nonanonymous;
24
-
25
- RRDSET *st_isapi_extension_request_count;
26
- RRDDIM *rd_isapi_extension_request_count;
27
-
28
- RRDSET *st_isapi_extension_request_rate;
29
- RRDDIM *rd_isapi_extension_request_rate;
30
-
31
- RRDSET *st_error_rate;
32
- RRDDIM *rd_error_rate_locked;
33
- RRDDIM *rd_error_rate_not_found;
34
-
35
- RRDSET *st_logon_attemps;
36
- RRDDIM *rd_logon_attemps;
37
-
38
- RRDSET *st_service_uptime;
39
- RRDDIM *rd_service_uptime;
40
-
41
- RRDSET *st_request_rate;
42
- RRDDIM *rd_request_rate;
43
-
44
- COUNTER_DATA IISCurrentAnonymousUser;
45
- COUNTER_DATA IISCurrentNonAnonymousUsers;
46
- COUNTER_DATA IISCurrentConnections;
47
- COUNTER_DATA IISCurrentISAPIExtRequests;
48
- COUNTER_DATA IISUptime;
49
-
50
- COUNTER_DATA IISReceivedBytesTotal;
51
- COUNTER_DATA IISSentBytesTotal;
52
- COUNTER_DATA IISIPAPIExtRequestsTotal;
53
- COUNTER_DATA IISConnAttemptsAllInstancesTotal;
54
- COUNTER_DATA IISFilesReceivedTotal;
55
- COUNTER_DATA IISFilesSentTotal;
56
- COUNTER_DATA IISLogonAttemptsTotal;
57
- COUNTER_DATA IISLockedErrorsTotal;
58
- COUNTER_DATA IISNotFoundErrorsTotal;
59
-
60
- COUNTER_DATA IISRequestsOptions;
61
- COUNTER_DATA IISRequestsGet;
62
- COUNTER_DATA IISRequestsPost;
63
- COUNTER_DATA IISRequestsHead;
64
- COUNTER_DATA IISRequestsPut;
65
- COUNTER_DATA IISRequestsDelete;
66
- COUNTER_DATA IISRequestsTrace;
67
- COUNTER_DATA IISRequestsMove;
68
- COUNTER_DATA IISRequestsCopy;
69
- COUNTER_DATA IISRequestsMkcol;
70
- COUNTER_DATA IISRequestsPropfind;
71
- COUNTER_DATA IISRequestsProppatch;
72
- COUNTER_DATA IISRequestsSearch;
73
- COUNTER_DATA IISRequestsLock;
74
- COUNTER_DATA IISRequestsUnlock;
75
- COUNTER_DATA IISRequestsOther;
76
-};
77
-
78
-static inline void initialize_web_service_keys(struct web_service *p) {
79
- p->IISCurrentAnonymousUser.key = "Current Anonymous Users";
80
- p->IISCurrentNonAnonymousUsers.key = "Current NonAnonymous Users";
81
- p->IISCurrentConnections.key = "Current Connections";
82
- p->IISCurrentISAPIExtRequests.key = "Current ISAPI Extension Requests";
83
- p->IISUptime.key = "Service Uptime";
84
-
85
- p->IISReceivedBytesTotal.key = "Total Bytes Received";
86
- p->IISSentBytesTotal.key = "Total Bytes Sent";
87
- p->IISIPAPIExtRequestsTotal.key = "Total ISAPI Extension Requests";
88
- p->IISConnAttemptsAllInstancesTotal.key = "Total Connection Attempts (all instances)";
89
- p->IISFilesReceivedTotal.key = "Total Files Received";
90
- p->IISFilesSentTotal.key = "Total Files Sent";
91
- p->IISLogonAttemptsTotal.key = "Total Logon Attempts";
92
- p->IISLockedErrorsTotal.key = "Total Locked Errors";
93
- p->IISNotFoundErrorsTotal.key = "Total Not Found Errors";
94
-
95
- p->IISRequestsOptions.key = "Options Requests/sec";
96
- p->IISRequestsGet.key = "Get Requests/sec";
97
- p->IISRequestsPost.key = "Post Requests/sec";
98
- p->IISRequestsHead.key = "Head Requests/sec";
99
- p->IISRequestsPut.key = "Put Requests/sec";
100
- p->IISRequestsDelete.key = "Delete Requests/sec";
101
- p->IISRequestsTrace.key = "Trace Requests/sec";
102
- p->IISRequestsMove.key = "Move Requests/sec";
103
- p->IISRequestsCopy.key = "Copy Requests/sec";
104
- p->IISRequestsMkcol.key = "Mkcol Requests/sec";
105
- p->IISRequestsPropfind.key = "Propfind Requests/sec";
106
- p->IISRequestsProppatch.key = "Proppatch Requests/sec";
107
- p->IISRequestsSearch.key = "Search Requests/sec";
108
- p->IISRequestsLock.key = "Lock Requests/sec";
109
- p->IISRequestsUnlock.key = "Unlock Requests/sec";
110
- p->IISRequestsOther.key = "Other Request Methods/sec";
111
-}
112
-
113
-void dict_web_service_insert_cb(const DICTIONARY_ITEM *item __maybe_unused, void *value, void *data __maybe_unused) {
114
- struct web_service *p = value;
115
- initialize_web_service_keys(p);
116
-}
117
-
118
-static DICTIONARY *web_services = NULL;
119
-
120
-static void initialize(void) {
121
- web_services = dictionary_create_advanced(DICT_OPTION_DONT_OVERWRITE_VALUE |
122
- DICT_OPTION_FIXED_SIZE, NULL, sizeof(struct web_service));
123
-
124
- dictionary_register_insert_callback(web_services, dict_web_service_insert_cb, NULL);
125
-}
126
-
127
-static bool do_web_services(PERF_DATA_BLOCK *pDataBlock, int update_every) {
128
- char id[RRD_ID_LENGTH_MAX + 1];
129
- PERF_OBJECT_TYPE *pObjectType = perflibFindObjectTypeByName(pDataBlock, "Web Service");
130
- if(!pObjectType) return false;
131
-
132
- PERF_INSTANCE_DEFINITION *pi = NULL;
133
- for(LONG i = 0; i < pObjectType->NumInstances ; i++) {
134
- pi = perflibForEachInstance(pDataBlock, pObjectType, pi);
135
- if(!pi) break;
136
-
137
- if(!getInstanceName(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer)))
138
- strncpyz(windows_shared_buffer, "[unknown]", sizeof(windows_shared_buffer) - 1);
139
-
140
- // We are not ploting _Total here, because cloud will group the sites
141
- if(strcasecmp(windows_shared_buffer, "_Total") == 0) {
142
- continue;
143
- }
144
-
145
- netdata_fix_chart_name(windows_shared_buffer);
146
- struct web_service *p = dictionary_set(web_services, windows_shared_buffer, NULL, sizeof(*p));
147
-
148
- if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISReceivedBytesTotal) &&
149
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISSentBytesTotal)) {
150
- if (!p->st_traffic) {
151
- snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_traffic", windows_shared_buffer);
152
- p->st_traffic = rrdset_create_localhost("iis"
153
- , id, NULL
154
- , "traffic"
155
- , "iis.website_traffic"
156
- , "Website traffic"
157
- , "bytes/s"
158
- , PLUGIN_WINDOWS_NAME
159
- , "PerflibWebService"
160
- , PRIO_WEBSITE_IIS_TRAFFIC
161
- , update_every
162
- , RRDSET_TYPE_AREA
163
- );
164
-
165
- snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_received_bytes_total", windows_shared_buffer);
166
- p->rd_traffic_received = rrddim_add(p->st_traffic,
167
- id,
168
- "received",
169
- 1,
170
- 1,
171
- RRD_ALGORITHM_INCREMENTAL);
172
-
173
- snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_sent_bytes_total", windows_shared_buffer);
174
- p->rd_traffic_sent = rrddim_add(p->st_traffic,
175
- id,
176
- "sent",
177
- -1,
178
- 1,
179
- RRD_ALGORITHM_INCREMENTAL);
180
-
181
- rrdlabels_add(p->st_traffic->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
182
- }
183
-
184
- rrddim_set_by_pointer(p->st_traffic,
185
- p->rd_traffic_received,
186
- (collected_number)p->IISReceivedBytesTotal.current.Data);
187
-
188
- rrddim_set_by_pointer(p->st_traffic,
189
- p->rd_traffic_sent,
190
- (collected_number)p->IISSentBytesTotal.current.Data);
191
-
192
- rrdset_done(p->st_traffic);
193
- }
194
-
195
- if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISFilesReceivedTotal) &&
196
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISFilesSentTotal)) {
197
- if (!p->st_file_transfer) {
198
- snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_ftp_file_transfer_rate", windows_shared_buffer);
199
- p->st_file_transfer = rrdset_create_localhost("iis"
200
- , id, NULL
201
- , "traffic"
202
- , "iis.website_ftp_file_transfer_rate"
203
- , "Website FTP file transfer rate"
204
- , "files/s"
205
- , PLUGIN_WINDOWS_NAME
206
- , "PerflibWebService"
207
- , PRIO_WEBSITE_IIS_FTP_FILE_TRANSFER_RATE
208
- , update_every
209
- , RRDSET_TYPE_LINE
210
- );
211
-
212
- snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_files_received_total", windows_shared_buffer);
213
- p->rd_files_received = rrddim_add(p->st_file_transfer, id, "received",
214
- 1, 1, RRD_ALGORITHM_INCREMENTAL);
215
-
216
- snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_files_sent_total", windows_shared_buffer);
217
- p->rd_files_sent = rrddim_add(p->st_file_transfer, id, "sent",
218
- 1, 1, RRD_ALGORITHM_INCREMENTAL);
219
-
220
- rrdlabels_add(p->st_file_transfer->rrdlabels, "website",
221
- windows_shared_buffer, RRDLABEL_SRC_AUTO);
222
- }
223
-
224
- rrddim_set_by_pointer(p->st_file_transfer,
225
- p->rd_files_received,
226
- (collected_number)p->IISFilesReceivedTotal.current.Data);
227
-
228
- rrddim_set_by_pointer(p->st_file_transfer,
229
- p->rd_files_sent,
230
- (collected_number)p->IISFilesSentTotal.current.Data);
231
-
232
- rrdset_done(p->st_file_transfer);
233
- }
234
-
235
- if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISCurrentConnections)) {
236
- if (!p->st_curr_connections) {
237
- snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_active_connections_count", windows_shared_buffer);
238
- p->st_curr_connections = rrdset_create_localhost("iis"
239
- , id, NULL
240
- , "connections"
241
- , "iis.website_active_connections_count"
242
- , "Website active connections"
243
- , "connections"
244
- , PLUGIN_WINDOWS_NAME
245
- , "PerflibWebService1"
246
- , PRIO_WEBSITE_IIS_ACTIVE_CONNECTIONS_COUNT
247
- , update_every
248
- , RRDSET_TYPE_LINE
249
- );
250
-
251
- snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_current_connections", windows_shared_buffer);
252
- p->rd_curr_connections = rrddim_add(p->st_curr_connections, id, "active",
253
- 1, 1, RRD_ALGORITHM_ABSOLUTE);
254
-
255
- rrdlabels_add(p->st_curr_connections->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
256
- }
257
-
258
- rrddim_set_by_pointer(p->st_curr_connections,
259
- p->rd_curr_connections,
260
- (collected_number)p->IISCurrentConnections.current.Data);
261
-
262
- rrdset_done(p->st_curr_connections);
263
- }
264
-
265
- if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISConnAttemptsAllInstancesTotal)) {
266
- if (!p->st_connections_attemps) {
267
- snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_connection_attempts_rate", windows_shared_buffer);
268
- netdata_fix_chart_name(id);
269
- p->st_connections_attemps = rrdset_create_localhost("iis"
270
- , id, NULL
271
- , "connections"
272
- , "iis.website_connection_attempts_rate"
273
- , "Website connections attempts"
274
- , "attempts/s"
275
- , PLUGIN_WINDOWS_NAME
276
- , "PerflibWebService"
277
- , PRIO_WEBSITE_IIS_CONNECTIONS_ATTEMP
278
- , update_every
279
- , RRDSET_TYPE_LINE
280
- );
281
-
282
- snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_connection_attempts_all_instances_total", windows_shared_buffer);
283
- p->rd_connections_attemps = rrddim_add(p->st_connections_attemps, id, "connection",
284
- 1, 1, RRD_ALGORITHM_INCREMENTAL);
285
-
286
- rrdlabels_add(p->st_connections_attemps->rrdlabels, "website",
287
- windows_shared_buffer, RRDLABEL_SRC_AUTO);
288
- }
289
-
290
- rrddim_set_by_pointer(p->st_connections_attemps,
291
- p->rd_connections_attemps,
292
- (collected_number)p->IISCurrentConnections.current.Data);
293
-
294
- rrdset_done(p->st_connections_attemps);
295
- }
296
-
297
- if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISCurrentAnonymousUser) &&
298
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISCurrentNonAnonymousUsers)) {
299
- if (!p->st_user_count) {
300
- snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_users_count", windows_shared_buffer);
301
- p->st_user_count = rrdset_create_localhost("iis",
302
- id, NULL
303
- ,"requests"
304
- , "iis.website_users_count"
305
- , "Website users with pending requests"
306
- , "users"
307
- , PLUGIN_WINDOWS_NAME
308
- , "PerflibWebService"
309
- , PRIO_WEBSITE_IIS_USERS
310
- , update_every
311
- , RRDSET_TYPE_STACKED
312
- );
313
-
314
- snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_current_anonymous_users", windows_shared_buffer);
315
- p->rd_user_anonymous = rrddim_add(p->st_user_count, id, "anonymous",
316
- 1, 1, RRD_ALGORITHM_INCREMENTAL);
317
-
318
- snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_current_non_anonymous_users", windows_shared_buffer);
319
- p->rd_user_nonanonymous = rrddim_add(p->st_user_count, id, "non_anonymous",
320
- 1, 1, RRD_ALGORITHM_INCREMENTAL);
321
-
322
- rrdlabels_add(p->st_user_count->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
323
- }
324
-
325
- rrddim_set_by_pointer(p->st_user_count,
326
- p->rd_user_anonymous,
327
- (collected_number)p->IISCurrentAnonymousUser.current.Data);
328
-
329
- rrddim_set_by_pointer(p->st_user_count,
330
- p->rd_user_nonanonymous,
331
- (collected_number)p->IISCurrentNonAnonymousUsers.current.Data);
332
-
333
- rrdset_done(p->st_user_count);
334
- }
335
-
336
- if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISCurrentISAPIExtRequests)) {
337
- if (!p->st_isapi_extension_request_count) {
338
- snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_isapi_extension_requests_count", windows_shared_buffer);
339
- p->st_isapi_extension_request_count = rrdset_create_localhost("iis"
340
- , id, NULL
341
- , "requests"
342
- , "iis.website_isapi_extension_requests_count"
343
- , "ISAPI extension requests"
344
- , "requests"
345
- , PLUGIN_WINDOWS_NAME
346
- , "PerflibWebService"
347
- , PRIO_WEBSITE_IIS_ISAPI_EXT_REQUEST_COUNT
348
- , update_every
349
- , RRDSET_TYPE_LINE
350
- );
351
-
352
- snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_current_isapi_extension_requests", windows_shared_buffer);
353
- p->rd_isapi_extension_request_count = rrddim_add(p->st_isapi_extension_request_count, id, "isapi",
354
- 1, 1, RRD_ALGORITHM_ABSOLUTE);
355
-
356
- rrdlabels_add(p->st_isapi_extension_request_count->rrdlabels, "website",
357
- windows_shared_buffer, RRDLABEL_SRC_AUTO);
358
- }
359
-
360
- rrddim_set_by_pointer(p->st_isapi_extension_request_count,
361
- p->rd_isapi_extension_request_count,
362
- (collected_number)p->IISCurrentISAPIExtRequests.current.Data);
363
-
364
- rrdset_done(p->st_isapi_extension_request_count);
365
- }
366
-
367
- if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISIPAPIExtRequestsTotal)) {
368
- if (!p->st_isapi_extension_request_rate) {
369
- snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_isapi_extension_requests_rate", windows_shared_buffer);
370
- p->st_isapi_extension_request_rate = rrdset_create_localhost("iis"
371
- , id, NULL
372
- , "requests"
373
- , "iis.website_isapi_extension_requests_rate"
374
- , "Website extensions request"
375
- , "requests/s"
376
- , PLUGIN_WINDOWS_NAME
377
- , "PerflibWebService"
378
- , PRIO_WEBSITE_IIS_ISAPI_EXT_REQUEST_RATE
379
- , update_every
380
- , RRDSET_TYPE_LINE
381
- );
382
-
383
- snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_isapi_extension_requests_total", windows_shared_buffer);
384
- p->rd_isapi_extension_request_rate = rrddim_add(p->st_isapi_extension_request_rate, id, "isapi",
385
- 1, 1, RRD_ALGORITHM_INCREMENTAL);
386
-
387
- rrdlabels_add(p->st_isapi_extension_request_rate->rrdlabels, "website",
388
- windows_shared_buffer, RRDLABEL_SRC_AUTO);
389
- }
390
-
391
- rrddim_set_by_pointer(p->st_isapi_extension_request_rate,
392
- p->rd_isapi_extension_request_rate,
393
- (collected_number)p->IISIPAPIExtRequestsTotal.current.Data);
394
-
395
- rrdset_done(p->st_isapi_extension_request_rate);
396
- }
397
-
398
- if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISLockedErrorsTotal) &&
399
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISNotFoundErrorsTotal)) {
400
- if (!p->st_error_rate) {
401
- snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_errors_rate", windows_shared_buffer);
402
- p->st_error_rate = rrdset_create_localhost("iis",
403
- id, NULL
404
- ,"requests"
405
- , "iis.website_errors_rate"
406
- , "Website errors"
407
- , "errors/s"
408
- , PLUGIN_WINDOWS_NAME
409
- , "PerflibWebService"
410
- , PRIO_WEBSITE_IIS_USERS
411
- , update_every
412
- , RRDSET_TYPE_STACKED
413
- );
414
-
415
- snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_locked_errors_total", windows_shared_buffer);
416
- p->rd_error_rate_locked = rrddim_add(p->st_error_rate, id, "document_locked",
417
- 1, 1, RRD_ALGORITHM_INCREMENTAL);
418
-
419
- snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_not_found_errors_total", windows_shared_buffer);
420
- p->rd_error_rate_not_found = rrddim_add(p->st_error_rate, id, "document_not_found",
421
- 1, 1, RRD_ALGORITHM_INCREMENTAL);
422
-
423
- rrdlabels_add(p->st_error_rate->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
424
- }
425
-
426
- rrddim_set_by_pointer(p->st_error_rate,
427
- p->rd_error_rate_locked,
428
- (collected_number)p->IISLockedErrorsTotal.current.Data);
429
-
430
- rrddim_set_by_pointer(p->st_error_rate,
431
- p->rd_error_rate_not_found,
432
- (collected_number)p->IISNotFoundErrorsTotal.current.Data);
433
-
434
- rrdset_done(p->st_error_rate);
435
- }
436
-
437
- if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISLogonAttemptsTotal)) {
438
- if (!p->st_logon_attemps) {
439
- snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_logon_attempts_rate", windows_shared_buffer);
440
- p->st_logon_attemps = rrdset_create_localhost("iis"
441
- , id, NULL
442
- , "logon"
443
- , "iis.website_logon_attempts_rate"
444
- , "Website logon attempts"
445
- , "attempts/s"
446
- , PLUGIN_WINDOWS_NAME
447
- , "PerflibWebService"
448
- , PRIO_WEBSITE_IIS_LOGON_ATTEMPTS
449
- , update_every
450
- , RRDSET_TYPE_LINE
451
- );
452
-
453
- snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_logon_attempts_total", windows_shared_buffer);
454
- p->rd_logon_attemps = rrddim_add(p->st_logon_attemps, id, "logon",
455
- 1, 1, RRD_ALGORITHM_INCREMENTAL);
456
-
457
- rrdlabels_add(p->st_logon_attemps->rrdlabels, "website",
458
- windows_shared_buffer, RRDLABEL_SRC_AUTO);
459
- }
460
-
461
- rrddim_set_by_pointer(p->st_logon_attemps,
462
- p->rd_logon_attemps,
463
- (collected_number)p->IISLogonAttemptsTotal.current.Data);
464
-
465
- rrdset_done(p->st_logon_attemps);
466
- }
467
-
468
- if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISUptime)) {
469
- if (!p->st_service_uptime) {
470
- snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_uptime", windows_shared_buffer);
471
- p->st_service_uptime = rrdset_create_localhost("iis"
472
- , id, NULL
473
- , "uptime"
474
- , "iis.website_uptime"
475
- , "Website uptime"
476
- , "seconds"
477
- , PLUGIN_WINDOWS_NAME
478
- , "PerflibWebService"
479
- , PRIO_WEBSITE_IIS_UPTIME
480
- , update_every
481
- , RRDSET_TYPE_LINE
482
- );
483
-
484
- snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_service_uptime", windows_shared_buffer);
485
- p->rd_service_uptime = rrddim_add(p->st_service_uptime, id, "uptime",
486
- 1, 1, RRD_ALGORITHM_ABSOLUTE);
487
-
488
- rrdlabels_add(p->st_service_uptime->rrdlabels, "website",
489
- windows_shared_buffer, RRDLABEL_SRC_AUTO);
490
- }
491
-
492
- rrddim_set_by_pointer(p->st_service_uptime,
493
- p->rd_service_uptime,
494
- (collected_number)p->IISUptime.current.Data);
495
-
496
- rrdset_done(p->st_service_uptime);
497
- }
498
-
499
- if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsOptions) &&
500
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsGet) &&
501
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsPost) &&
502
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsHead) &&
503
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsPut) &&
504
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsDelete) &&
505
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsTrace) &&
506
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsMove) &&
507
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsCopy) &&
508
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsMkcol) &&
509
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsPropfind) &&
510
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsProppatch) &&
511
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsSearch) &&
512
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsLock) &&
513
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsUnlock) &&
514
- perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsOther)) {
515
- if (!p->st_request_rate) {
516
- snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_requests_rate", windows_shared_buffer);
517
- p->st_request_rate = rrdset_create_localhost("iis"
518
- , id, NULL
519
- , "requests"
520
- , "iis.website_requests_rate"
521
- , "Website requests rate"
522
- , "requests/s"
523
- , PLUGIN_WINDOWS_NAME
524
- , "PerflibWebService"
525
- , PRIO_WEBSITE_IIS_REQUESTS_RATE
526
- , update_every
527
- , RRDSET_TYPE_LINE
528
- );
529
-
530
- snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_requests_total", windows_shared_buffer);
531
- p->rd_request_rate = rrddim_add(p->st_request_rate, id, "requests",
532
- 1, 1, RRD_ALGORITHM_ABSOLUTE);
533
-
534
- rrdlabels_add(p->st_request_rate->rrdlabels, "website",
535
- windows_shared_buffer, RRDLABEL_SRC_AUTO);
536
- }
537
-
538
- uint64_t requests = p->IISRequestsOptions.current.Data + p->IISRequestsGet.current.Data +
539
- p->IISRequestsPost.current.Data + p->IISRequestsHead.current.Data +
540
- p->IISRequestsPut.current.Data + p->IISRequestsDelete.current.Data +
541
- p->IISRequestsTrace.current.Data + p->IISRequestsMove.current.Data +
542
- p->IISRequestsCopy.current.Data + p->IISRequestsMkcol.current.Data +
543
- p->IISRequestsPropfind.current.Data + p->IISRequestsProppatch.current.Data +
544
- p->IISRequestsSearch.current.Data + p->IISRequestsLock.current.Data +
545
- p->IISRequestsUnlock.current.Data + p->IISRequestsOther.current.Data;
546
-
547
- rrddim_set_by_pointer(p->st_request_rate,
548
- p->rd_request_rate,
549
- (collected_number)requests);
550
-
551
- rrdset_done(p->st_request_rate);
552
- }
553
- }
554
-
555
- return true;
556
-}
557
-
558
-int do_PerflibWebService(int update_every, usec_t dt __maybe_unused) {
559
- static bool initialized = false;
560
-
561
- if(unlikely(!initialized)) {
562
- initialize();
563
- initialized = true;
564
- }
565
-
566
- DWORD id = RegistryFindIDByName("Web Service");
567
- if(id == PERFLIB_REGISTRY_NAME_NOT_FOUND)
568
- return -1;
569
-
570
- PERF_DATA_BLOCK *pDataBlock = perflibGetPerformanceData(id);
571
- if(!pDataBlock) return -1;
572
-
573
- do_web_services(pDataBlock, update_every);
574
-
575
- return 0;
576
-}
1
+// SPDX-License-Identifier: GPL-3.0-or-later
2
+
3
+#include "windows_plugin.h"
4
+#include "windows-internals.h"
5
+
6
+struct web_service {
7
+ RRDSET *st_traffic;
8
+ RRDDIM *rd_traffic_received;
9
+ RRDDIM *rd_traffic_sent;
10
+
11
+ RRDSET *st_file_transfer;
12
+ RRDDIM *rd_files_received;
13
+ RRDDIM *rd_files_sent;
14
+
15
+ RRDSET *st_curr_connections;
16
+ RRDDIM *rd_curr_connections;
17
+
18
+ RRDSET *st_connections_attemps;
19
+ RRDDIM *rd_connections_attemps;
20
+
21
+ RRDSET *st_user_count;
22
+ RRDDIM *rd_user_anonymous;
23
+ RRDDIM *rd_user_nonanonymous;
24
+
25
+ RRDSET *st_isapi_extension_request_count;
26
+ RRDDIM *rd_isapi_extension_request_count;
27
+
28
+ RRDSET *st_isapi_extension_request_rate;
29
+ RRDDIM *rd_isapi_extension_request_rate;
30
+
31
+ RRDSET *st_error_rate;
32
+ RRDDIM *rd_error_rate_locked;
33
+ RRDDIM *rd_error_rate_not_found;
34
+
35
+ RRDSET *st_logon_attemps;
36
+ RRDDIM *rd_logon_attemps;
37
+
38
+ RRDSET *st_service_uptime;
39
+ RRDDIM *rd_service_uptime;
40
+
41
+ RRDSET *st_request_rate;
42
+ RRDDIM *rd_request_rate;
43
+
44
+ COUNTER_DATA IISCurrentAnonymousUser;
45
+ COUNTER_DATA IISCurrentNonAnonymousUsers;
46
+ COUNTER_DATA IISCurrentConnections;
47
+ COUNTER_DATA IISCurrentISAPIExtRequests;
48
+ COUNTER_DATA IISUptime;
49
+
50
+ COUNTER_DATA IISReceivedBytesTotal;
51
+ COUNTER_DATA IISSentBytesTotal;
52
+ COUNTER_DATA IISIPAPIExtRequestsTotal;
53
+ COUNTER_DATA IISConnAttemptsAllInstancesTotal;
54
+ COUNTER_DATA IISFilesReceivedTotal;
55
+ COUNTER_DATA IISFilesSentTotal;
56
+ COUNTER_DATA IISLogonAttemptsTotal;
57
+ COUNTER_DATA IISLockedErrorsTotal;
58
+ COUNTER_DATA IISNotFoundErrorsTotal;
59
+
60
+ COUNTER_DATA IISRequestsOptions;
61
+ COUNTER_DATA IISRequestsGet;
62
+ COUNTER_DATA IISRequestsPost;
63
+ COUNTER_DATA IISRequestsHead;
64
+ COUNTER_DATA IISRequestsPut;
65
+ COUNTER_DATA IISRequestsDelete;
66
+ COUNTER_DATA IISRequestsTrace;
67
+ COUNTER_DATA IISRequestsMove;
68
+ COUNTER_DATA IISRequestsCopy;
69
+ COUNTER_DATA IISRequestsMkcol;
70
+ COUNTER_DATA IISRequestsPropfind;
71
+ COUNTER_DATA IISRequestsProppatch;
72
+ COUNTER_DATA IISRequestsSearch;
73
+ COUNTER_DATA IISRequestsLock;
74
+ COUNTER_DATA IISRequestsUnlock;
75
+ COUNTER_DATA IISRequestsOther;
76
+};
77
+
78
+static inline void initialize_web_service_keys(struct web_service *p) {
79
+ p->IISCurrentAnonymousUser.key = "Current Anonymous Users";
80
+ p->IISCurrentNonAnonymousUsers.key = "Current NonAnonymous Users";
81
+ p->IISCurrentConnections.key = "Current Connections";
82
+ p->IISCurrentISAPIExtRequests.key = "Current ISAPI Extension Requests";
83
+ p->IISUptime.key = "Service Uptime";
84
+
85
+ p->IISReceivedBytesTotal.key = "Total Bytes Received";
86
+ p->IISSentBytesTotal.key = "Total Bytes Sent";
87
+ p->IISIPAPIExtRequestsTotal.key = "Total ISAPI Extension Requests";
88
+ p->IISConnAttemptsAllInstancesTotal.key = "Total Connection Attempts (all instances)";
89
+ p->IISFilesReceivedTotal.key = "Total Files Received";
90
+ p->IISFilesSentTotal.key = "Total Files Sent";
91
+ p->IISLogonAttemptsTotal.key = "Total Logon Attempts";
92
+ p->IISLockedErrorsTotal.key = "Total Locked Errors";
93
+ p->IISNotFoundErrorsTotal.key = "Total Not Found Errors";
94
+
95
+ p->IISRequestsOptions.key = "Options Requests/sec";
96
+ p->IISRequestsGet.key = "Get Requests/sec";
97
+ p->IISRequestsPost.key = "Post Requests/sec";
98
+ p->IISRequestsHead.key = "Head Requests/sec";
99
+ p->IISRequestsPut.key = "Put Requests/sec";
100
+ p->IISRequestsDelete.key = "Delete Requests/sec";
101
+ p->IISRequestsTrace.key = "Trace Requests/sec";
102
+ p->IISRequestsMove.key = "Move Requests/sec";
103
+ p->IISRequestsCopy.key = "Copy Requests/sec";
104
+ p->IISRequestsMkcol.key = "Mkcol Requests/sec";
105
+ p->IISRequestsPropfind.key = "Propfind Requests/sec";
106
+ p->IISRequestsProppatch.key = "Proppatch Requests/sec";
107
+ p->IISRequestsSearch.key = "Search Requests/sec";
108
+ p->IISRequestsLock.key = "Lock Requests/sec";
109
+ p->IISRequestsUnlock.key = "Unlock Requests/sec";
110
+ p->IISRequestsOther.key = "Other Request Methods/sec";
111
+}
112
+
113
+void dict_web_service_insert_cb(const DICTIONARY_ITEM *item __maybe_unused, void *value, void *data __maybe_unused) {
114
+ struct web_service *p = value;
115
+ initialize_web_service_keys(p);
116
+}
117
+
118
+static DICTIONARY *web_services = NULL;
119
+
120
+static void initialize(void) {
121
+ web_services = dictionary_create_advanced(DICT_OPTION_DONT_OVERWRITE_VALUE |
122
+ DICT_OPTION_FIXED_SIZE, NULL, sizeof(struct web_service));
123
+
124
+ dictionary_register_insert_callback(web_services, dict_web_service_insert_cb, NULL);
125
+}
126
+
127
+static bool do_web_services(PERF_DATA_BLOCK *pDataBlock, int update_every) {
128
+ char id[RRD_ID_LENGTH_MAX + 1];
129
+ PERF_OBJECT_TYPE *pObjectType = perflibFindObjectTypeByName(pDataBlock, "Web Service");
130
+ if(!pObjectType) return false;
131
+
132
+ PERF_INSTANCE_DEFINITION *pi = NULL;
133
+ for(LONG i = 0; i < pObjectType->NumInstances ; i++) {
134
+ pi = perflibForEachInstance(pDataBlock, pObjectType, pi);
135
+ if(!pi) break;
136
+
137
+ if(!getInstanceName(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer)))
138
+ strncpyz(windows_shared_buffer, "[unknown]", sizeof(windows_shared_buffer) - 1);
139
+
140
+ // We are not ploting _Total here, because cloud will group the sites
141
+ if(strcasecmp(windows_shared_buffer, "_Total") == 0) {
142
+ continue;
143
+ }
144
+
145
+ netdata_fix_chart_name(windows_shared_buffer);
146
+ struct web_service *p = dictionary_set(web_services, windows_shared_buffer, NULL, sizeof(*p));
147
+
148
+ if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISReceivedBytesTotal) &&
149
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISSentBytesTotal)) {
150
+ if (!p->st_traffic) {
151
+ snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_traffic", windows_shared_buffer);
152
+ p->st_traffic = rrdset_create_localhost("iis"
153
+ , id, NULL
154
+ , "traffic"
155
+ , "iis.website_traffic"
156
+ , "Website traffic"
157
+ , "bytes/s"
158
+ , PLUGIN_WINDOWS_NAME
159
+ , "PerflibWebService"
160
+ , PRIO_WEBSITE_IIS_TRAFFIC
161
+ , update_every
162
+ , RRDSET_TYPE_AREA
163
+ );
164
+
165
+ snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_received_bytes_total", windows_shared_buffer);
166
+ p->rd_traffic_received = rrddim_add(p->st_traffic,
167
+ id,
168
+ "received",
169
+ 1,
170
+ 1,
171
+ RRD_ALGORITHM_INCREMENTAL);
172
+
173
+ snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_sent_bytes_total", windows_shared_buffer);
174
+ p->rd_traffic_sent = rrddim_add(p->st_traffic,
175
+ id,
176
+ "sent",
177
+ -1,
178
+ 1,
179
+ RRD_ALGORITHM_INCREMENTAL);
180
+
181
+ rrdlabels_add(p->st_traffic->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
182
+ }
183
+
184
+ rrddim_set_by_pointer(p->st_traffic,
185
+ p->rd_traffic_received,
186
+ (collected_number)p->IISReceivedBytesTotal.current.Data);
187
+
188
+ rrddim_set_by_pointer(p->st_traffic,
189
+ p->rd_traffic_sent,
190
+ (collected_number)p->IISSentBytesTotal.current.Data);
191
+
192
+ rrdset_done(p->st_traffic);
193
+ }
194
+
195
+ if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISFilesReceivedTotal) &&
196
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISFilesSentTotal)) {
197
+ if (!p->st_file_transfer) {
198
+ snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_ftp_file_transfer_rate", windows_shared_buffer);
199
+ p->st_file_transfer = rrdset_create_localhost("iis"
200
+ , id, NULL
201
+ , "traffic"
202
+ , "iis.website_ftp_file_transfer_rate"
203
+ , "Website FTP file transfer rate"
204
+ , "files/s"
205
+ , PLUGIN_WINDOWS_NAME
206
+ , "PerflibWebService"
207
+ , PRIO_WEBSITE_IIS_FTP_FILE_TRANSFER_RATE
208
+ , update_every
209
+ , RRDSET_TYPE_LINE
210
+ );
211
+
212
+ snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_files_received_total", windows_shared_buffer);
213
+ p->rd_files_received = rrddim_add(p->st_file_transfer, id, "received",
214
+ 1, 1, RRD_ALGORITHM_INCREMENTAL);
215
+
216
+ snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_files_sent_total", windows_shared_buffer);
217
+ p->rd_files_sent = rrddim_add(p->st_file_transfer, id, "sent",
218
+ 1, 1, RRD_ALGORITHM_INCREMENTAL);
219
+
220
+ rrdlabels_add(p->st_file_transfer->rrdlabels, "website",
221
+ windows_shared_buffer, RRDLABEL_SRC_AUTO);
222
+ }
223
+
224
+ rrddim_set_by_pointer(p->st_file_transfer,
225
+ p->rd_files_received,
226
+ (collected_number)p->IISFilesReceivedTotal.current.Data);
227
+
228
+ rrddim_set_by_pointer(p->st_file_transfer,
229
+ p->rd_files_sent,
230
+ (collected_number)p->IISFilesSentTotal.current.Data);
231
+
232
+ rrdset_done(p->st_file_transfer);
233
+ }
234
+
235
+ if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISCurrentConnections)) {
236
+ if (!p->st_curr_connections) {
237
+ snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_active_connections_count", windows_shared_buffer);
238
+ p->st_curr_connections = rrdset_create_localhost("iis"
239
+ , id, NULL
240
+ , "connections"
241
+ , "iis.website_active_connections_count"
242
+ , "Website active connections"
243
+ , "connections"
244
+ , PLUGIN_WINDOWS_NAME
245
+ , "PerflibWebService1"
246
+ , PRIO_WEBSITE_IIS_ACTIVE_CONNECTIONS_COUNT
247
+ , update_every
248
+ , RRDSET_TYPE_LINE
249
+ );
250
+
251
+ snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_current_connections", windows_shared_buffer);
252
+ p->rd_curr_connections = rrddim_add(p->st_curr_connections, id, "active",
253
+ 1, 1, RRD_ALGORITHM_ABSOLUTE);
254
+
255
+ rrdlabels_add(p->st_curr_connections->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
256
+ }
257
+
258
+ rrddim_set_by_pointer(p->st_curr_connections,
259
+ p->rd_curr_connections,
260
+ (collected_number)p->IISCurrentConnections.current.Data);
261
+
262
+ rrdset_done(p->st_curr_connections);
263
+ }
264
+
265
+ if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISConnAttemptsAllInstancesTotal)) {
266
+ if (!p->st_connections_attemps) {
267
+ snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_connection_attempts_rate", windows_shared_buffer);
268
+ netdata_fix_chart_name(id);
269
+ p->st_connections_attemps = rrdset_create_localhost("iis"
270
+ , id, NULL
271
+ , "connections"
272
+ , "iis.website_connection_attempts_rate"
273
+ , "Website connections attempts"
274
+ , "attempts/s"
275
+ , PLUGIN_WINDOWS_NAME
276
+ , "PerflibWebService"
277
+ , PRIO_WEBSITE_IIS_CONNECTIONS_ATTEMP
278
+ , update_every
279
+ , RRDSET_TYPE_LINE
280
+ );
281
+
282
+ snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_connection_attempts_all_instances_total", windows_shared_buffer);
283
+ p->rd_connections_attemps = rrddim_add(p->st_connections_attemps, id, "connection",
284
+ 1, 1, RRD_ALGORITHM_INCREMENTAL);
285
+
286
+ rrdlabels_add(p->st_connections_attemps->rrdlabels, "website",
287
+ windows_shared_buffer, RRDLABEL_SRC_AUTO);
288
+ }
289
+
290
+ rrddim_set_by_pointer(p->st_connections_attemps,
291
+ p->rd_connections_attemps,
292
+ (collected_number)p->IISCurrentConnections.current.Data);
293
+
294
+ rrdset_done(p->st_connections_attemps);
295
+ }
296
+
297
+ if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISCurrentAnonymousUser) &&
298
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISCurrentNonAnonymousUsers)) {
299
+ if (!p->st_user_count) {
300
+ snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_users_count", windows_shared_buffer);
301
+ p->st_user_count = rrdset_create_localhost("iis",
302
+ id, NULL
303
+ ,"requests"
304
+ , "iis.website_users_count"
305
+ , "Website users with pending requests"
306
+ , "users"
307
+ , PLUGIN_WINDOWS_NAME
308
+ , "PerflibWebService"
309
+ , PRIO_WEBSITE_IIS_USERS
310
+ , update_every
311
+ , RRDSET_TYPE_STACKED
312
+ );
313
+
314
+ snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_current_anonymous_users", windows_shared_buffer);
315
+ p->rd_user_anonymous = rrddim_add(p->st_user_count, id, "anonymous",
316
+ 1, 1, RRD_ALGORITHM_INCREMENTAL);
317
+
318
+ snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_current_non_anonymous_users", windows_shared_buffer);
319
+ p->rd_user_nonanonymous = rrddim_add(p->st_user_count, id, "non_anonymous",
320
+ 1, 1, RRD_ALGORITHM_INCREMENTAL);
321
+
322
+ rrdlabels_add(p->st_user_count->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
323
+ }
324
+
325
+ rrddim_set_by_pointer(p->st_user_count,
326
+ p->rd_user_anonymous,
327
+ (collected_number)p->IISCurrentAnonymousUser.current.Data);
328
+
329
+ rrddim_set_by_pointer(p->st_user_count,
330
+ p->rd_user_nonanonymous,
331
+ (collected_number)p->IISCurrentNonAnonymousUsers.current.Data);
332
+
333
+ rrdset_done(p->st_user_count);
334
+ }
335
+
336
+ if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISCurrentISAPIExtRequests)) {
337
+ if (!p->st_isapi_extension_request_count) {
338
+ snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_isapi_extension_requests_count", windows_shared_buffer);
339
+ p->st_isapi_extension_request_count = rrdset_create_localhost("iis"
340
+ , id, NULL
341
+ , "requests"
342
+ , "iis.website_isapi_extension_requests_count"
343
+ , "ISAPI extension requests"
344
+ , "requests"
345
+ , PLUGIN_WINDOWS_NAME
346
+ , "PerflibWebService"
347
+ , PRIO_WEBSITE_IIS_ISAPI_EXT_REQUEST_COUNT
348
+ , update_every
349
+ , RRDSET_TYPE_LINE
350
+ );
351
+
352
+ snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_current_isapi_extension_requests", windows_shared_buffer);
353
+ p->rd_isapi_extension_request_count = rrddim_add(p->st_isapi_extension_request_count, id, "isapi",
354
+ 1, 1, RRD_ALGORITHM_ABSOLUTE);
355
+
356
+ rrdlabels_add(p->st_isapi_extension_request_count->rrdlabels, "website",
357
+ windows_shared_buffer, RRDLABEL_SRC_AUTO);
358
+ }
359
+
360
+ rrddim_set_by_pointer(p->st_isapi_extension_request_count,
361
+ p->rd_isapi_extension_request_count,
362
+ (collected_number)p->IISCurrentISAPIExtRequests.current.Data);
363
+
364
+ rrdset_done(p->st_isapi_extension_request_count);
365
+ }
366
+
367
+ if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISIPAPIExtRequestsTotal)) {
368
+ if (!p->st_isapi_extension_request_rate) {
369
+ snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_isapi_extension_requests_rate", windows_shared_buffer);
370
+ p->st_isapi_extension_request_rate = rrdset_create_localhost("iis"
371
+ , id, NULL
372
+ , "requests"
373
+ , "iis.website_isapi_extension_requests_rate"
374
+ , "Website extensions request"
375
+ , "requests/s"
376
+ , PLUGIN_WINDOWS_NAME
377
+ , "PerflibWebService"
378
+ , PRIO_WEBSITE_IIS_ISAPI_EXT_REQUEST_RATE
379
+ , update_every
380
+ , RRDSET_TYPE_LINE
381
+ );
382
+
383
+ snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_isapi_extension_requests_total", windows_shared_buffer);
384
+ p->rd_isapi_extension_request_rate = rrddim_add(p->st_isapi_extension_request_rate, id, "isapi",
385
+ 1, 1, RRD_ALGORITHM_INCREMENTAL);
386
+
387
+ rrdlabels_add(p->st_isapi_extension_request_rate->rrdlabels, "website",
388
+ windows_shared_buffer, RRDLABEL_SRC_AUTO);
389
+ }
390
+
391
+ rrddim_set_by_pointer(p->st_isapi_extension_request_rate,
392
+ p->rd_isapi_extension_request_rate,
393
+ (collected_number)p->IISIPAPIExtRequestsTotal.current.Data);
394
+
395
+ rrdset_done(p->st_isapi_extension_request_rate);
396
+ }
397
+
398
+ if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISLockedErrorsTotal) &&
399
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISNotFoundErrorsTotal)) {
400
+ if (!p->st_error_rate) {
401
+ snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_errors_rate", windows_shared_buffer);
402
+ p->st_error_rate = rrdset_create_localhost("iis",
403
+ id, NULL
404
+ ,"requests"
405
+ , "iis.website_errors_rate"
406
+ , "Website errors"
407
+ , "errors/s"
408
+ , PLUGIN_WINDOWS_NAME
409
+ , "PerflibWebService"
410
+ , PRIO_WEBSITE_IIS_USERS
411
+ , update_every
412
+ , RRDSET_TYPE_STACKED
413
+ );
414
+
415
+ snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_locked_errors_total", windows_shared_buffer);
416
+ p->rd_error_rate_locked = rrddim_add(p->st_error_rate, id, "document_locked",
417
+ 1, 1, RRD_ALGORITHM_INCREMENTAL);
418
+
419
+ snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_not_found_errors_total", windows_shared_buffer);
420
+ p->rd_error_rate_not_found = rrddim_add(p->st_error_rate, id, "document_not_found",
421
+ 1, 1, RRD_ALGORITHM_INCREMENTAL);
422
+
423
+ rrdlabels_add(p->st_error_rate->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
424
+ }
425
+
426
+ rrddim_set_by_pointer(p->st_error_rate,
427
+ p->rd_error_rate_locked,
428
+ (collected_number)p->IISLockedErrorsTotal.current.Data);
429
+
430
+ rrddim_set_by_pointer(p->st_error_rate,
431
+ p->rd_error_rate_not_found,
432
+ (collected_number)p->IISNotFoundErrorsTotal.current.Data);
433
+
434
+ rrdset_done(p->st_error_rate);
435
+ }
436
+
437
+ if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISLogonAttemptsTotal)) {
438
+ if (!p->st_logon_attemps) {
439
+ snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_logon_attempts_rate", windows_shared_buffer);
440
+ p->st_logon_attemps = rrdset_create_localhost("iis"
441
+ , id, NULL
442
+ , "logon"
443
+ , "iis.website_logon_attempts_rate"
444
+ , "Website logon attempts"
445
+ , "attempts/s"
446
+ , PLUGIN_WINDOWS_NAME
447
+ , "PerflibWebService"
448
+ , PRIO_WEBSITE_IIS_LOGON_ATTEMPTS
449
+ , update_every
450
+ , RRDSET_TYPE_LINE
451
+ );
452
+
453
+ snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_logon_attempts_total", windows_shared_buffer);
454
+ p->rd_logon_attemps = rrddim_add(p->st_logon_attemps, id, "logon",
455
+ 1, 1, RRD_ALGORITHM_INCREMENTAL);
456
+
457
+ rrdlabels_add(p->st_logon_attemps->rrdlabels, "website",
458
+ windows_shared_buffer, RRDLABEL_SRC_AUTO);
459
+ }
460
+
461
+ rrddim_set_by_pointer(p->st_logon_attemps,
462
+ p->rd_logon_attemps,
463
+ (collected_number)p->IISLogonAttemptsTotal.current.Data);
464
+
465
+ rrdset_done(p->st_logon_attemps);
466
+ }
467
+
468
+ if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISUptime)) {
469
+ if (!p->st_service_uptime) {
470
+ snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_uptime", windows_shared_buffer);
471
+ p->st_service_uptime = rrdset_create_localhost("iis"
472
+ , id, NULL
473
+ , "uptime"
474
+ , "iis.website_uptime"
475
+ , "Website uptime"
476
+ , "seconds"
477
+ , PLUGIN_WINDOWS_NAME
478
+ , "PerflibWebService"
479
+ , PRIO_WEBSITE_IIS_UPTIME
480
+ , update_every
481
+ , RRDSET_TYPE_LINE
482
+ );
483
+
484
+ snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_service_uptime", windows_shared_buffer);
485
+ p->rd_service_uptime = rrddim_add(p->st_service_uptime, id, "uptime",
486
+ 1, 1, RRD_ALGORITHM_ABSOLUTE);
487
+
488
+ rrdlabels_add(p->st_service_uptime->rrdlabels, "website",
489
+ windows_shared_buffer, RRDLABEL_SRC_AUTO);
490
+ }
491
+
492
+ rrddim_set_by_pointer(p->st_service_uptime,
493
+ p->rd_service_uptime,
494
+ (collected_number)p->IISUptime.current.Data);
495
+
496
+ rrdset_done(p->st_service_uptime);
497
+ }
498
+
499
+ if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsOptions) &&
500
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsGet) &&
501
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsPost) &&
502
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsHead) &&
503
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsPut) &&
504
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsDelete) &&
505
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsTrace) &&
506
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsMove) &&
507
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsCopy) &&
508
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsMkcol) &&
509
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsPropfind) &&
510
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsProppatch) &&
511
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsSearch) &&
512
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsLock) &&
513
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsUnlock) &&
514
+ perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsOther)) {
515
+ if (!p->st_request_rate) {
516
+ snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_requests_rate", windows_shared_buffer);
517
+ p->st_request_rate = rrdset_create_localhost("iis"
518
+ , id, NULL
519
+ , "requests"
520
+ , "iis.website_requests_rate"
521
+ , "Website requests rate"
522
+ , "requests/s"
523
+ , PLUGIN_WINDOWS_NAME
524
+ , "PerflibWebService"
525
+ , PRIO_WEBSITE_IIS_REQUESTS_RATE
526
+ , update_every
527
+ , RRDSET_TYPE_LINE
528
+ );
529
+
530
+ snprintfz(id, RRD_ID_LENGTH_MAX, "iis_website_%s_requests_total", windows_shared_buffer);
531
+ p->rd_request_rate = rrddim_add(p->st_request_rate, id, "requests",
532
+ 1, 1, RRD_ALGORITHM_ABSOLUTE);
533
+
534
+ rrdlabels_add(p->st_request_rate->rrdlabels, "website",
535
+ windows_shared_buffer, RRDLABEL_SRC_AUTO);
536
+ }
537
+
538
+ uint64_t requests = p->IISRequestsOptions.current.Data + p->IISRequestsGet.current.Data +
539
+ p->IISRequestsPost.current.Data + p->IISRequestsHead.current.Data +
540
+ p->IISRequestsPut.current.Data + p->IISRequestsDelete.current.Data +
541
+ p->IISRequestsTrace.current.Data + p->IISRequestsMove.current.Data +
542
+ p->IISRequestsCopy.current.Data + p->IISRequestsMkcol.current.Data +
543
+ p->IISRequestsPropfind.current.Data + p->IISRequestsProppatch.current.Data +
544
+ p->IISRequestsSearch.current.Data + p->IISRequestsLock.current.Data +
545
+ p->IISRequestsUnlock.current.Data + p->IISRequestsOther.current.Data;
546
+
547
+ rrddim_set_by_pointer(p->st_request_rate,
548
+ p->rd_request_rate,
549
+ (collected_number)requests);
550
+
551
+ rrdset_done(p->st_request_rate);
552
+ }
553
+ }
554
+
555
+ return true;
556
+}
557
+
558
+int do_PerflibWebService(int update_every, usec_t dt __maybe_unused) {
559
+ static bool initialized = false;
560
+
561
+ if(unlikely(!initialized)) {
562
+ initialize();
563
+ initialized = true;
564
+ }
565
+
566
+ DWORD id = RegistryFindIDByName("Web Service");
567
+ if(id == PERFLIB_REGISTRY_NAME_NOT_FOUND)
568
+ return -1;
569
+
570
+ PERF_DATA_BLOCK *pDataBlock = perflibGetPerformanceData(id);
571
+ if(!pDataBlock) return -1;
572
+
573
+ do_web_services(pDataBlock, update_every);
574
+
575
+ return 0;
576
+}