@cryptotaxi247 / netdata-1 / commits / 861bf3150

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 +}