master
c 1,986 lines 80.4 KB
Raw
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_request_rate;
8 RRDDIM *rd_request_rate;
9
10 RRDSET *st_request_by_type_rate;
11 RRDDIM *rd_request_options_rate;
12 RRDDIM *rd_request_get_rate;
13 RRDDIM *rd_request_post_rate;
14 RRDDIM *rd_request_head_rate;
15 RRDDIM *rd_request_put_rate;
16 RRDDIM *rd_request_delete_rate;
17 RRDDIM *rd_request_trace_rate;
18 RRDDIM *rd_request_move_rate;
19 RRDDIM *rd_request_copy_rate;
20 RRDDIM *rd_request_mkcol_rate;
21 RRDDIM *rd_request_propfind_rate;
22 RRDDIM *rd_request_proppatch_rate;
23 RRDDIM *rd_request_search_rate;
24 RRDDIM *rd_request_lock_rate;
25 RRDDIM *rd_request_unlock_rate;
26 RRDDIM *rd_request_other_rate;
27
28 RRDSET *st_traffic;
29 RRDDIM *rd_traffic_received;
30 RRDDIM *rd_traffic_sent;
31
32 RRDSET *st_file_transfer;
33 RRDDIM *rd_files_received;
34 RRDDIM *rd_files_sent;
35
36 RRDSET *st_curr_connections;
37 RRDDIM *rd_curr_connections;
38
39 RRDSET *st_connections_attempts;
40 RRDDIM *rd_connections_attempts;
41
42 RRDSET *st_user_count;
43 RRDDIM *rd_user_anonymous;
44 RRDDIM *rd_user_nonanonymous;
45
46 RRDSET *st_isapi_extension_request_count;
47 RRDDIM *rd_isapi_extension_request_count;
48
49 RRDSET *st_isapi_extension_request_rate;
50 RRDDIM *rd_isapi_extension_request_rate;
51
52 RRDSET *st_error_rate;
53 RRDDIM *rd_error_rate_locked;
54 RRDDIM *rd_error_rate_not_found;
55
56 RRDSET *st_logon_attempts;
57 RRDDIM *rd_logon_attempts;
58
59 RRDSET *st_service_uptime;
60 RRDDIM *rd_service_uptime;
61
62 COUNTER_DATA IISCurrentAnonymousUser;
63 COUNTER_DATA IISCurrentNonAnonymousUsers;
64 COUNTER_DATA IISCurrentConnections;
65 COUNTER_DATA IISCurrentISAPIExtRequests;
66 COUNTER_DATA IISUptime;
67
68 COUNTER_DATA IISReceivedBytesTotal;
69 COUNTER_DATA IISSentBytesTotal;
70 COUNTER_DATA IISIPAPIExtRequestsTotal;
71 COUNTER_DATA IISConnAttemptsAllInstancesTotal;
72 COUNTER_DATA IISFilesReceivedTotal;
73 COUNTER_DATA IISFilesSentTotal;
74 COUNTER_DATA IISLogonAttemptsTotal;
75 COUNTER_DATA IISLockedErrorsTotal;
76 COUNTER_DATA IISNotFoundErrorsTotal;
77
78 COUNTER_DATA IISRequestsOptions;
79 COUNTER_DATA IISRequestsGet;
80 COUNTER_DATA IISRequestsPost;
81 COUNTER_DATA IISRequestsHead;
82 COUNTER_DATA IISRequestsPut;
83 COUNTER_DATA IISRequestsDelete;
84 COUNTER_DATA IISRequestsTrace;
85 COUNTER_DATA IISRequestsMove;
86 COUNTER_DATA IISRequestsCopy;
87 COUNTER_DATA IISRequestsMkcol;
88 COUNTER_DATA IISRequestsPropfind;
89 COUNTER_DATA IISRequestsProppatch;
90 COUNTER_DATA IISRequestsSearch;
91 COUNTER_DATA IISRequestsLock;
92 COUNTER_DATA IISRequestsUnlock;
93 COUNTER_DATA IISRequestsOther;
94 };
95
96 struct ws3svc_w3wp_data {
97 RRDSET *st_w3svc_w3wp_active_threads;
98 RRDDIM *rd_w3svc_w3wp_active_threads;
99
100 RRDSET *st_w3svc_w3wp_requests_total;
101 RRDDIM *rd_w3svc_w3wp_requests_total;
102
103 RRDSET *st_w3svc_w3wp_requests_active;
104 RRDDIM *rd_w3svc_w3wp_requests_active;
105
106 RRDSET *st_w3svc_w3wp_file_cache_mem_usage;
107 RRDDIM *rd_w3svc_w3wp_file_cache_mem_usage;
108
109 RRDSET *st_w3svc_w3wp_files_cache_total;
110 RRDDIM *rd_w3svc_w3wp_files_cache_total;
111
112 RRDSET *st_w3svc_w3wp_files_flushed_total;
113 RRDDIM *rd_w3svc_w3wp_files_flushed_total;
114
115 RRDSET *st_w3svc_w3wp_uri_cache_flushed;
116 RRDDIM *rd_w3svc_w3wp_uri_cache_flushed;
117
118 RRDSET *st_w3svc_w3wp_total_uri_cached;
119 RRDDIM *rd_w3svc_w3wp_total_uri_cached;
120
121 RRDSET *st_w3svc_w3wp_total_metadata_cache;
122 RRDDIM *rd_w3svc_w3wp_total_metadata_cache;
123
124 RRDSET *st_w3svc_w3wp_total_metadata_flushed;
125 RRDDIM *rd_w3svc_w3wp_total_metadata_flushed;
126
127 RRDSET *st_w3svc_w3wp_output_cache_active_flushed_items;
128 RRDDIM *rd_w3svc_w3wp_output_cache_active_flushed_items;
129
130 RRDSET *st_w3svc_w3wp_output_cache_memory_usage;
131 RRDDIM *rd_w3svc_w3wp_output_cache_memory_usage;
132
133 RRDSET *st_w3svc_w3wp_output_cache_flushed_total;
134 RRDDIM *rd_w3svc_w3wp_output_cache_flushed_total;
135
136 COUNTER_DATA W3SVCW3WPActiveThreads;
137
138 COUNTER_DATA W3SVCW3WPRequestTotal;
139 COUNTER_DATA W3SVCW3WPRequestActive;
140
141 COUNTER_DATA W3SVCW3WPFileCacheMemUsage;
142
143 COUNTER_DATA W3SVCW3WPFilesCachedTotal;
144 COUNTER_DATA W3SVCW3WPFilesFlushedTotal;
145
146 COUNTER_DATA W3SVCW3WPURICachedFlushed;
147 COUNTER_DATA W3SVCW3WPTotalURICached;
148
149 COUNTER_DATA W3SVCW3WPTotalMetadataCached;
150 COUNTER_DATA W3SVCW3WPTotalMetadataFlushed;
151
152 COUNTER_DATA W3SVCW3WPOutputCacheActiveFlushedItems;
153 COUNTER_DATA W3SVCW3WPOutputCacheMemoryUsage;
154 COUNTER_DATA W3SVCW3WPOutputCacheFlushesTotal;
155 };
156
157 // AD information
158 struct iis_app {
159 RRDSET *st_app_current_application_pool_state;
160 RRDDIM *rd_app_current_application_pool_state_uninitialized;
161 RRDDIM *rd_app_current_application_pool_state_initialized;
162 RRDDIM *rd_app_current_application_pool_state_running;
163 RRDDIM *rd_app_current_application_pool_state_disabling;
164 RRDDIM *rd_app_current_application_pool_state_disabled;
165 RRDDIM *rd_app_current_application_pool_state_shutdown_pending;
166 RRDDIM *rd_app_current_application_pool_state_delete_pending;
167
168 RRDSET *st_app_current_worker_process;
169 RRDDIM *rd_app_current_worker_process;
170
171 RRDSET *st_app_maximum_worker_process;
172 RRDDIM *rd_app_maximum_worker_process;
173
174 RRDSET *st_app_recent_worker_process_failure;
175 RRDDIM *rd_app_recent_worker_process_failure;
176
177 RRDSET *st_app_application_pool_recycles;
178 RRDDIM *rd_app_application_pool_recycles;
179
180 RRDSET *st_app_application_pool_uptime;
181 RRDDIM *rd_app_application_pool_uptime;
182
183 RRDSET *st_app_worker_process_created;
184 RRDDIM *rd_app_worker_process_created;
185
186 RRDSET *st_app_worker_process_failures;
187 RRDDIM *rd_app_worker_process_crashes;
188 RRDDIM *rd_app_worker_process_ping_failures;
189 RRDDIM *rd_app_worker_process_shutdown_failures;
190 RRDDIM *rd_app_worker_process_startup_failures;
191
192 COUNTER_DATA APPCurrentApplicationPoolState;
193 COUNTER_DATA APPCurrentApplicationPoolUptime;
194 COUNTER_DATA APPCurrentWorkerProcess;
195 COUNTER_DATA APPMaximumWorkerProcess;
196 COUNTER_DATA APPRecentWorkerProcessFailure;
197 COUNTER_DATA APPTimeSinceProcessFailure;
198 COUNTER_DATA APPApplicationPoolRecycles;
199 COUNTER_DATA APPTotalApplicationPoolUptime;
200 COUNTER_DATA APPWorkerProcessCreated;
201 COUNTER_DATA APPWorkerProcessFailures;
202 COUNTER_DATA APPWorkerProcessPingFailures;
203 COUNTER_DATA APPWorkerProcessShutdownFailures;
204 COUNTER_DATA APPWorkerProcessStartupFailures;
205 };
206
207 static inline void initialize_web_service_keys(struct web_service *p)
208 {
209 p->IISCurrentAnonymousUser.key = "Current Anonymous Users";
210 p->IISCurrentNonAnonymousUsers.key = "Current NonAnonymous Users";
211 p->IISCurrentConnections.key = "Current Connections";
212 p->IISCurrentISAPIExtRequests.key = "Current ISAPI Extension Requests";
213 p->IISUptime.key = "Service Uptime";
214
215 p->IISReceivedBytesTotal.key = "Total Bytes Received";
216 p->IISSentBytesTotal.key = "Total Bytes Sent";
217 p->IISIPAPIExtRequestsTotal.key = "Total ISAPI Extension Requests";
218 p->IISConnAttemptsAllInstancesTotal.key = "Total Connection Attempts (all instances)";
219 p->IISFilesReceivedTotal.key = "Total Files Received";
220 p->IISFilesSentTotal.key = "Total Files Sent";
221 p->IISLogonAttemptsTotal.key = "Total Logon Attempts";
222 p->IISLockedErrorsTotal.key = "Total Locked Errors";
223 p->IISNotFoundErrorsTotal.key = "Total Not Found Errors";
224
225 p->IISRequestsOptions.key = "Options Requests/sec";
226 p->IISRequestsGet.key = "Get Requests/sec";
227 p->IISRequestsPost.key = "Post Requests/sec";
228 p->IISRequestsHead.key = "Head Requests/sec";
229 p->IISRequestsPut.key = "Put Requests/sec";
230 p->IISRequestsDelete.key = "Delete Requests/sec";
231 p->IISRequestsTrace.key = "Trace Requests/sec";
232 p->IISRequestsMove.key = "Move Requests/sec";
233 p->IISRequestsCopy.key = "Copy Requests/sec";
234 p->IISRequestsMkcol.key = "Mkcol Requests/sec";
235 p->IISRequestsPropfind.key = "Propfind Requests/sec";
236 p->IISRequestsProppatch.key = "Proppatch Requests/sec";
237 p->IISRequestsSearch.key = "Search Requests/sec";
238 p->IISRequestsLock.key = "Lock Requests/sec";
239 p->IISRequestsUnlock.key = "Unlock Requests/sec";
240 p->IISRequestsOther.key = "Other Request Methods/sec";
241 }
242
243 void dict_web_service_insert_cb(const DICTIONARY_ITEM *item __maybe_unused, void *value, void *data __maybe_unused)
244 {
245 struct web_service *p = value;
246 initialize_web_service_keys(p);
247 }
248
249 static inline void initialize_app_pool_keys(struct iis_app *p)
250 {
251 p->APPCurrentApplicationPoolState.key = "Current Application Pool State";
252 p->APPCurrentApplicationPoolUptime.key = "Current Application Pool Uptime";
253 p->APPCurrentWorkerProcess.key = "Current Worker Processes";
254 p->APPMaximumWorkerProcess.key = "Maximum Worker Processes";
255 p->APPRecentWorkerProcessFailure.key = "Recent Worker Process Failures";
256 p->APPTimeSinceProcessFailure.key = "Time Since Last Worker Process Failure";
257 p->APPApplicationPoolRecycles.key = "Total Application Pool Recycles";
258 p->APPTotalApplicationPoolUptime.key = "Total Application Pool Uptime";
259 p->APPWorkerProcessCreated.key = "Total Worker Processes Created";
260 p->APPWorkerProcessFailures.key = "Total Worker Process Failures";
261 p->APPWorkerProcessPingFailures.key = "Total Worker Process Ping Failures";
262 p->APPWorkerProcessShutdownFailures.key = "Total Worker Process Shutdown Failures";
263 p->APPWorkerProcessStartupFailures.key = "Total Worker Process Startup Failures";
264 }
265
266 void dict_app_pool_insert_cb(const DICTIONARY_ITEM *item __maybe_unused, void *value, void *data __maybe_unused)
267 {
268 struct iis_app *p = value;
269 initialize_app_pool_keys(p);
270 }
271
272 static inline void initialize_w3svc_w3wp_keys(struct ws3svc_w3wp_data *p)
273 {
274 p->W3SVCW3WPActiveThreads.key = "Active Threads Count";
275
276 p->W3SVCW3WPRequestTotal.key = "Total HTTP Requests Served";
277 p->W3SVCW3WPRequestActive.key = "Active Requests";
278
279 p->W3SVCW3WPFileCacheMemUsage.key = "Current File Cache Memory Usage";
280
281 p->W3SVCW3WPFilesCachedTotal.key = "Total Files Cached";
282 p->W3SVCW3WPFilesFlushedTotal.key = "Total Flushed Files";
283
284 p->W3SVCW3WPURICachedFlushed.key = "Total Flushed URIs";
285 p->W3SVCW3WPTotalURICached.key = "Total URIs Cached";
286
287 p->W3SVCW3WPTotalMetadataCached.key = "Total Metadata Cached";
288 p->W3SVCW3WPTotalMetadataFlushed.key = "Total Flushed Metadata";
289
290 p->W3SVCW3WPOutputCacheActiveFlushedItems.key = "Output Cache Current Flushed Items";
291 p->W3SVCW3WPOutputCacheMemoryUsage.key = "Output Cache Current Memory Usage";
292 p->W3SVCW3WPOutputCacheFlushesTotal.key = "Output Cache Total Flushes";
293 }
294
295 void dict_wesvc_w3wp_insert_cb(const DICTIONARY_ITEM *item __maybe_unused, void *value, void *data __maybe_unused)
296 {
297 struct ws3svc_w3wp_data *p = value;
298 initialize_w3svc_w3wp_keys(p);
299 }
300
301 static DICTIONARY *web_services = NULL;
302 static DICTIONARY *app_pools = NULL;
303 static DICTIONARY *w3svc_w3wp_service = NULL;
304
305 static void initialize(void)
306 {
307 // IIS
308 web_services = dictionary_create_advanced(
309 DICT_OPTION_DONT_OVERWRITE_VALUE | DICT_OPTION_FIXED_SIZE, NULL, sizeof(struct web_service));
310
311 dictionary_register_insert_callback(web_services, dict_web_service_insert_cb, NULL);
312
313 // AD (APP_POOL_WAS)
314 app_pools = dictionary_create_advanced(
315 DICT_OPTION_DONT_OVERWRITE_VALUE | DICT_OPTION_FIXED_SIZE, NULL, sizeof(struct iis_app));
316
317 dictionary_register_insert_callback(app_pools, dict_app_pool_insert_cb, NULL);
318
319 w3svc_w3wp_service = dictionary_create_advanced(
320 DICT_OPTION_DONT_OVERWRITE_VALUE | DICT_OPTION_FIXED_SIZE, NULL, sizeof(struct ws3svc_w3wp_data));
321
322 dictionary_register_insert_callback(w3svc_w3wp_service, dict_wesvc_w3wp_insert_cb, NULL);
323 }
324
325 static inline void netdata_webservice_traffic(
326 PERF_DATA_BLOCK *pDataBlock,
327 PERF_OBJECT_TYPE *pObjectType,
328 PERF_INSTANCE_DEFINITION *pi,
329 struct web_service *p,
330 int update_every)
331 {
332 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISReceivedBytesTotal) &&
333 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISSentBytesTotal)) {
334 if (!p->st_traffic) {
335 char id[RRD_ID_LENGTH_MAX + 1];
336 snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_traffic", windows_shared_buffer);
337 netdata_fix_chart_name(id);
338 p->st_traffic = rrdset_create_localhost(
339 "iis",
340 id,
341 NULL,
342 "traffic",
343 "iis.website_traffic",
344 "Website traffic",
345 "bytes/s",
346 PLUGIN_WINDOWS_NAME,
347 "PerflibWebService",
348 PRIO_WEBSITE_IIS_TRAFFIC,
349 update_every,
350 RRDSET_TYPE_AREA);
351
352 p->rd_traffic_received = rrddim_add(p->st_traffic, "received", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
353 p->rd_traffic_sent = rrddim_add(p->st_traffic, "sent", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
354 rrdlabels_add(p->st_traffic->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
355 }
356
357 rrddim_set_by_pointer(
358 p->st_traffic, p->rd_traffic_received, (collected_number)p->IISReceivedBytesTotal.current.Data);
359 rrddim_set_by_pointer(p->st_traffic, p->rd_traffic_sent, (collected_number)p->IISSentBytesTotal.current.Data);
360
361 rrdset_done(p->st_traffic);
362 }
363 }
364
365 static inline void netdata_webservice_file_transfer_rate(
366 PERF_DATA_BLOCK *pDataBlock,
367 PERF_OBJECT_TYPE *pObjectType,
368 PERF_INSTANCE_DEFINITION *pi,
369 struct web_service *p,
370 int update_every)
371 {
372 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISFilesReceivedTotal) &&
373 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISFilesSentTotal)) {
374 if (!p->st_file_transfer) {
375 char id[RRD_ID_LENGTH_MAX + 1];
376 snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_ftp_file_transfer_rate", windows_shared_buffer);
377 netdata_fix_chart_name(id);
378 p->st_file_transfer = rrdset_create_localhost(
379 "iis",
380 id,
381 NULL,
382 "traffic",
383 "iis.website_ftp_file_transfer_rate",
384 "Website FTP file transfer rate",
385 "files/s",
386 PLUGIN_WINDOWS_NAME,
387 "PerflibWebService",
388 PRIO_WEBSITE_IIS_FTP_FILE_TRANSFER_RATE,
389 update_every,
390 RRDSET_TYPE_LINE);
391
392 p->rd_files_received = rrddim_add(p->st_file_transfer, "received", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
393 p->rd_files_sent = rrddim_add(p->st_file_transfer, "sent", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
394 rrdlabels_add(p->st_file_transfer->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
395 }
396
397 rrddim_set_by_pointer(
398 p->st_file_transfer, p->rd_files_received, (collected_number)p->IISFilesReceivedTotal.current.Data);
399 rrddim_set_by_pointer(
400 p->st_file_transfer, p->rd_files_sent, (collected_number)p->IISFilesSentTotal.current.Data);
401
402 rrdset_done(p->st_file_transfer);
403 }
404 }
405
406 static inline void netdata_webservice_active_connection(
407 PERF_DATA_BLOCK *pDataBlock,
408 PERF_OBJECT_TYPE *pObjectType,
409 PERF_INSTANCE_DEFINITION *pi,
410 struct web_service *p,
411 int update_every)
412 {
413 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISCurrentConnections)) {
414 if (!p->st_curr_connections) {
415 char id[RRD_ID_LENGTH_MAX + 1];
416 snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_active_connections_count", windows_shared_buffer);
417 netdata_fix_chart_name(id);
418 p->st_curr_connections = rrdset_create_localhost(
419 "iis",
420 id,
421 NULL,
422 "connections",
423 "iis.website_active_connections_count",
424 "Website active connections",
425 "connections",
426 PLUGIN_WINDOWS_NAME,
427 "PerflibWebService",
428 PRIO_WEBSITE_IIS_ACTIVE_CONNECTIONS_COUNT,
429 update_every,
430 RRDSET_TYPE_LINE);
431
432 p->rd_curr_connections = rrddim_add(p->st_curr_connections, "active", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
433 rrdlabels_add(p->st_curr_connections->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
434 }
435
436 rrddim_set_by_pointer(
437 p->st_curr_connections, p->rd_curr_connections, (collected_number)p->IISCurrentConnections.current.Data);
438
439 rrdset_done(p->st_curr_connections);
440 }
441 }
442
443 static inline void netdata_webservice_connection_attempt_rate(
444 PERF_DATA_BLOCK *pDataBlock,
445 PERF_OBJECT_TYPE *pObjectType,
446 PERF_INSTANCE_DEFINITION *pi,
447 struct web_service *p,
448 int update_every)
449 {
450 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISConnAttemptsAllInstancesTotal)) {
451 if (!p->st_connections_attempts) {
452 char id[RRD_ID_LENGTH_MAX + 1];
453 snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_connection_attempts_rate", windows_shared_buffer);
454 netdata_fix_chart_name(id);
455 p->st_connections_attempts = rrdset_create_localhost(
456 "iis",
457 id,
458 NULL,
459 "connections",
460 "iis.website_connection_attempts_rate",
461 "Website connections attempts",
462 "attempts/s",
463 PLUGIN_WINDOWS_NAME,
464 "PerflibWebService",
465 PRIO_WEBSITE_IIS_CONNECTIONS_ATTEMPT,
466 update_every,
467 RRDSET_TYPE_LINE);
468
469 p->rd_connections_attempts =
470 rrddim_add(p->st_connections_attempts, "connection", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
471
472 rrdlabels_add(p->st_connections_attempts->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
473 }
474
475 rrddim_set_by_pointer(
476 p->st_connections_attempts,
477 p->rd_connections_attempts,
478 (collected_number)p->IISConnAttemptsAllInstancesTotal.current.Data);
479
480 rrdset_done(p->st_connections_attempts);
481 }
482 }
483
484 static inline void netdata_webservice_user_count(
485 PERF_DATA_BLOCK *pDataBlock,
486 PERF_OBJECT_TYPE *pObjectType,
487 PERF_INSTANCE_DEFINITION *pi,
488 struct web_service *p,
489 int update_every)
490 {
491 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISCurrentAnonymousUser) &&
492 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISCurrentNonAnonymousUsers)) {
493 if (!p->st_user_count) {
494 char id[RRD_ID_LENGTH_MAX + 1];
495 snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_users_count", windows_shared_buffer);
496 netdata_fix_chart_name(id);
497 p->st_user_count = rrdset_create_localhost(
498 "iis",
499 id,
500 NULL,
501 "requests",
502 "iis.website_users_count",
503 "Website users with pending requests",
504 "users",
505 PLUGIN_WINDOWS_NAME,
506 "PerflibWebService",
507 PRIO_WEBSITE_IIS_USERS,
508 update_every,
509 RRDSET_TYPE_STACKED);
510
511 p->rd_user_anonymous = rrddim_add(p->st_user_count, "anonymous", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
512 p->rd_user_nonanonymous = rrddim_add(p->st_user_count, "non_anonymous", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
513
514 rrdlabels_add(p->st_user_count->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
515 }
516
517 rrddim_set_by_pointer(
518 p->st_user_count, p->rd_user_anonymous, (collected_number)p->IISCurrentAnonymousUser.current.Data);
519
520 rrddim_set_by_pointer(
521 p->st_user_count, p->rd_user_nonanonymous, (collected_number)p->IISCurrentNonAnonymousUsers.current.Data);
522
523 rrdset_done(p->st_user_count);
524 }
525 }
526
527 static inline void netdata_webservice_isapi_extension_request_count(
528 PERF_DATA_BLOCK *pDataBlock,
529 PERF_OBJECT_TYPE *pObjectType,
530 PERF_INSTANCE_DEFINITION *pi,
531 struct web_service *p,
532 int update_every)
533 {
534 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISCurrentISAPIExtRequests)) {
535 if (!p->st_isapi_extension_request_count) {
536 char id[RRD_ID_LENGTH_MAX + 1];
537 snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_isapi_extension_requests_count", windows_shared_buffer);
538 netdata_fix_chart_name(id);
539 p->st_isapi_extension_request_count = rrdset_create_localhost(
540 "iis",
541 id,
542 NULL,
543 "requests",
544 "iis.website_isapi_extension_requests_count",
545 "ISAPI extension requests",
546 "requests",
547 PLUGIN_WINDOWS_NAME,
548 "PerflibWebService",
549 PRIO_WEBSITE_IIS_ISAPI_EXT_REQUEST_COUNT,
550 update_every,
551 RRDSET_TYPE_LINE);
552
553 p->rd_isapi_extension_request_count =
554 rrddim_add(p->st_isapi_extension_request_count, "isapi", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
555
556 rrdlabels_add(
557 p->st_isapi_extension_request_count->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
558 }
559
560 rrddim_set_by_pointer(
561 p->st_isapi_extension_request_count,
562 p->rd_isapi_extension_request_count,
563 (collected_number)p->IISCurrentISAPIExtRequests.current.Data);
564
565 rrdset_done(p->st_isapi_extension_request_count);
566 }
567 }
568
569 static inline void netdata_webservice_isapi_extension_request_rate(
570 PERF_DATA_BLOCK *pDataBlock,
571 PERF_OBJECT_TYPE *pObjectType,
572 PERF_INSTANCE_DEFINITION *pi,
573 struct web_service *p,
574 int update_every)
575 {
576 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISIPAPIExtRequestsTotal)) {
577 if (!p->st_isapi_extension_request_rate) {
578 char id[RRD_ID_LENGTH_MAX + 1];
579 snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_isapi_extension_requests_rate", windows_shared_buffer);
580 netdata_fix_chart_name(id);
581 p->st_isapi_extension_request_rate = rrdset_create_localhost(
582 "iis",
583 id,
584 NULL,
585 "requests",
586 "iis.website_isapi_extension_requests_rate",
587 "Website extensions request",
588 "requests/s",
589 PLUGIN_WINDOWS_NAME,
590 "PerflibWebService",
591 PRIO_WEBSITE_IIS_ISAPI_EXT_REQUEST_RATE,
592 update_every,
593 RRDSET_TYPE_LINE);
594
595 p->rd_isapi_extension_request_rate =
596 rrddim_add(p->st_isapi_extension_request_rate, "isapi", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
597
598 rrdlabels_add(
599 p->st_isapi_extension_request_rate->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
600 }
601
602 rrddim_set_by_pointer(
603 p->st_isapi_extension_request_rate,
604 p->rd_isapi_extension_request_rate,
605 (collected_number)p->IISIPAPIExtRequestsTotal.current.Data);
606
607 rrdset_done(p->st_isapi_extension_request_rate);
608 }
609 }
610
611 static inline void netdata_webservice_errors_rate(
612 PERF_DATA_BLOCK *pDataBlock,
613 PERF_OBJECT_TYPE *pObjectType,
614 PERF_INSTANCE_DEFINITION *pi,
615 struct web_service *p,
616 int update_every)
617 {
618 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISLockedErrorsTotal) &&
619 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISNotFoundErrorsTotal)) {
620 if (!p->st_error_rate) {
621 char id[RRD_ID_LENGTH_MAX + 1];
622 snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_errors_rate", windows_shared_buffer);
623 netdata_fix_chart_name(id);
624 p->st_error_rate = rrdset_create_localhost(
625 "iis",
626 id,
627 NULL,
628 "requests",
629 "iis.website_errors_rate",
630 "Website errors",
631 "errors/s",
632 PLUGIN_WINDOWS_NAME,
633 "PerflibWebService",
634 PRIO_WEBSITE_IIS_USERS,
635 update_every,
636 RRDSET_TYPE_STACKED);
637
638 p->rd_error_rate_locked =
639 rrddim_add(p->st_error_rate, "document_locked", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
640 p->rd_error_rate_not_found =
641 rrddim_add(p->st_error_rate, "document_not_found", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
642
643 rrdlabels_add(p->st_error_rate->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
644 }
645
646 rrddim_set_by_pointer(
647 p->st_error_rate, p->rd_error_rate_locked, (collected_number)p->IISLockedErrorsTotal.current.Data);
648
649 rrddim_set_by_pointer(
650 p->st_error_rate, p->rd_error_rate_not_found, (collected_number)p->IISNotFoundErrorsTotal.current.Data);
651
652 rrdset_done(p->st_error_rate);
653 }
654 }
655
656 static inline void netdata_webservice_logon_attempt_rate(
657 PERF_DATA_BLOCK *pDataBlock,
658 PERF_OBJECT_TYPE *pObjectType,
659 PERF_INSTANCE_DEFINITION *pi,
660 struct web_service *p,
661 int update_every)
662 {
663 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISLogonAttemptsTotal)) {
664 if (!p->st_logon_attempts) {
665 char id[RRD_ID_LENGTH_MAX + 1];
666 snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_logon_attempts_rate", windows_shared_buffer);
667 netdata_fix_chart_name(id);
668 p->st_logon_attempts = rrdset_create_localhost(
669 "iis",
670 id,
671 NULL,
672 "logon",
673 "iis.website_logon_attempts_rate",
674 "Website logon attempts",
675 "attempts/s",
676 PLUGIN_WINDOWS_NAME,
677 "PerflibWebService",
678 PRIO_WEBSITE_IIS_LOGON_ATTEMPTS,
679 update_every,
680 RRDSET_TYPE_LINE);
681
682 p->rd_logon_attempts = rrddim_add(p->st_logon_attempts, "logon", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
683
684 rrdlabels_add(p->st_logon_attempts->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
685 }
686
687 rrddim_set_by_pointer(
688 p->st_logon_attempts, p->rd_logon_attempts, (collected_number)p->IISLogonAttemptsTotal.current.Data);
689
690 rrdset_done(p->st_logon_attempts);
691 }
692 }
693
694 static inline void netdata_webservice_uptime(
695 PERF_DATA_BLOCK *pDataBlock,
696 PERF_OBJECT_TYPE *pObjectType,
697 PERF_INSTANCE_DEFINITION *pi,
698 struct web_service *p,
699 int update_every)
700 {
701 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISUptime)) {
702 if (!p->st_service_uptime) {
703 char id[RRD_ID_LENGTH_MAX + 1];
704 snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_uptime", windows_shared_buffer);
705 netdata_fix_chart_name(id);
706 p->st_service_uptime = rrdset_create_localhost(
707 "iis",
708 id,
709 NULL,
710 "uptime",
711 "iis.website_uptime",
712 "Website uptime",
713 "seconds",
714 PLUGIN_WINDOWS_NAME,
715 "PerflibWebService",
716 PRIO_WEBSITE_IIS_UPTIME,
717 update_every,
718 RRDSET_TYPE_LINE);
719
720 p->rd_service_uptime = rrddim_add(p->st_service_uptime, "uptime", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
721
722 rrdlabels_add(p->st_service_uptime->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
723 }
724
725 rrddim_set_by_pointer(p->st_service_uptime, p->rd_service_uptime, (collected_number)p->IISUptime.current.Data);
726
727 rrdset_done(p->st_service_uptime);
728 }
729 }
730
731 static inline void netdata_webservice_requests(
732 PERF_DATA_BLOCK *pDataBlock,
733 PERF_OBJECT_TYPE *pObjectType,
734 PERF_INSTANCE_DEFINITION *pi,
735 struct web_service *p,
736 int update_every)
737 {
738 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsOptions) &&
739 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsGet) &&
740 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsPost) &&
741 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsHead) &&
742 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsPut) &&
743 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsDelete) &&
744 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsTrace) &&
745 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsMove) &&
746 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsCopy) &&
747 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsMkcol) &&
748 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsPropfind) &&
749 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsProppatch) &&
750 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsSearch) &&
751 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsLock) &&
752 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsUnlock) &&
753 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->IISRequestsOther)) {
754 char id[RRD_ID_LENGTH_MAX + 1];
755 if (!p->st_request_rate) {
756 snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_requests_rate", windows_shared_buffer);
757 netdata_fix_chart_name(id);
758 p->st_request_rate = rrdset_create_localhost(
759 "iis",
760 id,
761 NULL,
762 "requests",
763 "iis.website_requests_rate",
764 "Website requests rate",
765 "requests/s",
766 PLUGIN_WINDOWS_NAME,
767 "PerflibWebService",
768 PRIO_WEBSITE_IIS_REQUESTS_RATE,
769 update_every,
770 RRDSET_TYPE_LINE);
771
772 p->rd_request_rate = rrddim_add(p->st_request_rate, "requests", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
773
774 rrdlabels_add(p->st_request_rate->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
775 }
776
777 uint64_t requests =
778 p->IISRequestsOptions.current.Data + p->IISRequestsGet.current.Data + p->IISRequestsPost.current.Data +
779 p->IISRequestsHead.current.Data + p->IISRequestsPut.current.Data + p->IISRequestsDelete.current.Data +
780 p->IISRequestsTrace.current.Data + p->IISRequestsMove.current.Data + p->IISRequestsCopy.current.Data +
781 p->IISRequestsMkcol.current.Data + p->IISRequestsPropfind.current.Data +
782 p->IISRequestsProppatch.current.Data + p->IISRequestsSearch.current.Data + p->IISRequestsLock.current.Data +
783 p->IISRequestsUnlock.current.Data + p->IISRequestsOther.current.Data;
784
785 rrddim_set_by_pointer(p->st_request_rate, p->rd_request_rate, (collected_number)requests);
786
787 rrdset_done(p->st_request_rate);
788
789 if (!p->st_request_by_type_rate) {
790 snprintfz(id, RRD_ID_LENGTH_MAX, "website_%s_requests_by_type_rate", windows_shared_buffer);
791 netdata_fix_chart_name(id);
792 p->st_request_by_type_rate = rrdset_create_localhost(
793 "iis",
794 id,
795 NULL,
796 "requests",
797 "iis.website_requests_by_type_rate",
798 "Website requests rate",
799 "requests/s",
800 PLUGIN_WINDOWS_NAME,
801 "PerflibWebService",
802 PRIO_WEBSITE_IIS_REQUESTS_BY_TYPE_RATE,
803 update_every,
804 RRDSET_TYPE_STACKED);
805
806 p->rd_request_options_rate =
807 rrddim_add(p->st_request_by_type_rate, "options", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
808 p->rd_request_get_rate =
809 rrddim_add(p->st_request_by_type_rate, "get", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
810 p->rd_request_post_rate =
811 rrddim_add(p->st_request_by_type_rate, "post", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
812 p->rd_request_head_rate =
813 rrddim_add(p->st_request_by_type_rate, "head", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
814 p->rd_request_put_rate =
815 rrddim_add(p->st_request_by_type_rate, "put", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
816 p->rd_request_delete_rate =
817 rrddim_add(p->st_request_by_type_rate, "delete", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
818 p->rd_request_trace_rate =
819 rrddim_add(p->st_request_by_type_rate, "trace", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
820 p->rd_request_move_rate =
821 rrddim_add(p->st_request_by_type_rate, "move", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
822 p->rd_request_copy_rate =
823 rrddim_add(p->st_request_by_type_rate, "copy", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
824 p->rd_request_mkcol_rate =
825 rrddim_add(p->st_request_by_type_rate, "mkcol", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
826 p->rd_request_propfind_rate =
827 rrddim_add(p->st_request_by_type_rate, "propfind", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
828 p->rd_request_proppatch_rate =
829 rrddim_add(p->st_request_by_type_rate, "proppatch", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
830 p->rd_request_search_rate =
831 rrddim_add(p->st_request_by_type_rate, "search", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
832 p->rd_request_lock_rate =
833 rrddim_add(p->st_request_by_type_rate, "lock", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
834 p->rd_request_unlock_rate =
835 rrddim_add(p->st_request_by_type_rate, "unlock", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
836 p->rd_request_other_rate =
837 rrddim_add(p->st_request_by_type_rate, "other", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
838
839 rrdlabels_add(p->st_request_by_type_rate->rrdlabels, "website", windows_shared_buffer, RRDLABEL_SRC_AUTO);
840 }
841
842 rrddim_set_by_pointer(
843 p->st_request_by_type_rate,
844 p->rd_request_options_rate,
845 (collected_number)p->IISRequestsOptions.current.Data);
846 rrddim_set_by_pointer(
847 p->st_request_by_type_rate, p->rd_request_get_rate, (collected_number)p->IISRequestsGet.current.Data);
848 rrddim_set_by_pointer(
849 p->st_request_by_type_rate, p->rd_request_post_rate, (collected_number)p->IISRequestsPost.current.Data);
850 rrddim_set_by_pointer(
851 p->st_request_by_type_rate, p->rd_request_head_rate, (collected_number)p->IISRequestsHead.current.Data);
852 rrddim_set_by_pointer(
853 p->st_request_by_type_rate, p->rd_request_put_rate, (collected_number)p->IISRequestsPut.current.Data);
854 rrddim_set_by_pointer(
855 p->st_request_by_type_rate, p->rd_request_delete_rate, (collected_number)p->IISRequestsDelete.current.Data);
856 rrddim_set_by_pointer(
857 p->st_request_by_type_rate, p->rd_request_trace_rate, (collected_number)p->IISRequestsTrace.current.Data);
858 rrddim_set_by_pointer(
859 p->st_request_by_type_rate, p->rd_request_move_rate, (collected_number)p->IISRequestsMove.current.Data);
860 rrddim_set_by_pointer(
861 p->st_request_by_type_rate, p->rd_request_copy_rate, (collected_number)p->IISRequestsCopy.current.Data);
862 rrddim_set_by_pointer(
863 p->st_request_by_type_rate, p->rd_request_mkcol_rate, (collected_number)p->IISRequestsMkcol.current.Data);
864 rrddim_set_by_pointer(
865 p->st_request_by_type_rate,
866 p->rd_request_propfind_rate,
867 (collected_number)p->IISRequestsPropfind.current.Data);
868 rrddim_set_by_pointer(
869 p->st_request_by_type_rate,
870 p->rd_request_proppatch_rate,
871 (collected_number)p->IISRequestsProppatch.current.Data);
872 rrddim_set_by_pointer(
873 p->st_request_by_type_rate, p->rd_request_search_rate, (collected_number)p->IISRequestsSearch.current.Data);
874 rrddim_set_by_pointer(
875 p->st_request_by_type_rate, p->rd_request_lock_rate, (collected_number)p->IISRequestsLock.current.Data);
876 rrddim_set_by_pointer(
877 p->st_request_by_type_rate, p->rd_request_unlock_rate, (collected_number)p->IISRequestsUnlock.current.Data);
878 rrddim_set_by_pointer(
879 p->st_request_by_type_rate, p->rd_request_other_rate, (collected_number)p->IISRequestsOther.current.Data);
880
881 rrdset_done(p->st_request_by_type_rate);
882 }
883 }
884
885 static bool do_web_services(PERF_DATA_BLOCK *pDataBlock, int update_every)
886 {
887 PERF_OBJECT_TYPE *pObjectType = perflibFindObjectTypeByName(pDataBlock, "Web Service");
888 if (!pObjectType)
889 return false;
890
891 PERF_INSTANCE_DEFINITION *pi = NULL;
892 for (LONG i = 0; i < pObjectType->NumInstances; i++) {
893 pi = perflibForEachInstance(pDataBlock, pObjectType, pi);
894 if (!pi)
895 break;
896
897 if (!getInstanceName(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer)))
898 strncpyz(windows_shared_buffer, "[unknown]", sizeof(windows_shared_buffer) - 1);
899
900 // We are not ploting _Total here, because cloud will group the sites
901 if (strcasecmp(windows_shared_buffer, "_Total") == 0) {
902 continue;
903 }
904
905 struct web_service *p = dictionary_set(web_services, windows_shared_buffer, NULL, sizeof(*p));
906
907 netdata_webservice_traffic(pDataBlock, pObjectType, pi, p, update_every);
908 netdata_webservice_file_transfer_rate(pDataBlock, pObjectType, pi, p, update_every);
909 netdata_webservice_active_connection(pDataBlock, pObjectType, pi, p, update_every);
910 netdata_webservice_connection_attempt_rate(pDataBlock, pObjectType, pi, p, update_every);
911 netdata_webservice_user_count(pDataBlock, pObjectType, pi, p, update_every);
912 netdata_webservice_isapi_extension_request_count(pDataBlock, pObjectType, pi, p, update_every);
913 netdata_webservice_isapi_extension_request_rate(pDataBlock, pObjectType, pi, p, update_every);
914 netdata_webservice_errors_rate(pDataBlock, pObjectType, pi, p, update_every);
915 netdata_webservice_logon_attempt_rate(pDataBlock, pObjectType, pi, p, update_every);
916 netdata_webservice_uptime(pDataBlock, pObjectType, pi, p, update_every);
917 netdata_webservice_requests(pDataBlock, pObjectType, pi, p, update_every);
918 }
919
920 return true;
921 }
922
923 static RRDDIM *app_pool_select_dim(struct iis_app *p, uint32_t selector)
924 {
925 switch (selector) {
926 case 1:
927 return p->rd_app_current_application_pool_state_uninitialized;
928 case 2:
929 return p->rd_app_current_application_pool_state_initialized;
930 case 3:
931 return p->rd_app_current_application_pool_state_running;
932 case 4:
933 return p->rd_app_current_application_pool_state_disabling;
934 case 5:
935 return p->rd_app_current_application_pool_state_disabled;
936 case 6:
937 return p->rd_app_current_application_pool_state_shutdown_pending;
938 case 7:
939 default:
940 return p->rd_app_current_application_pool_state_delete_pending;
941 }
942 }
943
944 static inline void app_pool_current_state(
945 struct iis_app *p,
946 PERF_DATA_BLOCK *pDataBlock,
947 PERF_OBJECT_TYPE *pObjectType,
948 PERF_INSTANCE_DEFINITION *pi,
949 int update_every)
950 {
951 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->APPCurrentApplicationPoolState)) {
952 if (!p->st_app_current_application_pool_state) {
953 char id[RRD_ID_LENGTH_MAX + 1];
954 snprintfz(id, RRD_ID_LENGTH_MAX, "application_pool_%s_current_state", windows_shared_buffer);
955 netdata_fix_chart_name(id);
956 p->st_app_current_application_pool_state = rrdset_create_localhost(
957 "iis",
958 id,
959 NULL,
960 "app pool status",
961 "iis.application_pool_current_status",
962 "IIS App Pool current status",
963 "status",
964 PLUGIN_WINDOWS_NAME,
965 "PerflibWebService",
966 PRIO_IIS_APP_POOL_STATE,
967 update_every,
968 RRDSET_TYPE_LINE);
969
970 p->rd_app_current_application_pool_state_uninitialized = rrddim_add(
971 p->st_app_current_application_pool_state, "uninitialized", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
972
973 p->rd_app_current_application_pool_state_initialized =
974 rrddim_add(p->st_app_current_application_pool_state, "initialized", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
975
976 p->rd_app_current_application_pool_state_running =
977 rrddim_add(p->st_app_current_application_pool_state, "running", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
978
979 p->rd_app_current_application_pool_state_disabling =
980 rrddim_add(p->st_app_current_application_pool_state, "disabling", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
981
982 p->rd_app_current_application_pool_state_disabled =
983 rrddim_add(p->st_app_current_application_pool_state, "disabled", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
984
985 p->rd_app_current_application_pool_state_shutdown_pending = rrddim_add(
986 p->st_app_current_application_pool_state, "shutdown_pending", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
987
988 p->rd_app_current_application_pool_state_delete_pending = rrddim_add(
989 p->st_app_current_application_pool_state, "delete_pending", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
990
991 rrdlabels_add(
992 p->st_app_current_application_pool_state->rrdlabels,
993 "app_pool",
994 windows_shared_buffer,
995 RRDLABEL_SRC_AUTO);
996 }
997
998 #define NETDATA_APP_COOL_TOTAL_STATES (7)
999 uint32_t current_state = (uint32_t)p->APPCurrentApplicationPoolState.current.Data;
1000 for (uint32_t i = 1; i <= NETDATA_APP_COOL_TOTAL_STATES; i++) {
1001 RRDDIM *dim = app_pool_select_dim(p, i);
1002 uint32_t value = (current_state == i) ? 1 : 0;
1003
1004 rrddim_set_by_pointer(p->st_app_current_application_pool_state, dim, (collected_number)value);
1005 }
1006
1007 rrdset_done(p->st_app_current_application_pool_state);
1008 }
1009 }
1010
1011 static inline void app_pool_current_worker_processes(
1012 struct iis_app *p,
1013 PERF_DATA_BLOCK *pDataBlock,
1014 PERF_OBJECT_TYPE *pObjectType,
1015 PERF_INSTANCE_DEFINITION *pi,
1016 int update_every)
1017 {
1018 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->APPCurrentWorkerProcess)) {
1019 if (!p->st_app_current_worker_process) {
1020 char id[RRD_ID_LENGTH_MAX + 1];
1021 snprintfz(id, RRD_ID_LENGTH_MAX, "application_pool_%s_current_worker_processes", windows_shared_buffer);
1022 netdata_fix_chart_name(id);
1023 p->st_app_current_worker_process = rrdset_create_localhost(
1024 "iis",
1025 id,
1026 NULL,
1027 "app pool worker processes",
1028 "iis.application_pool_current_worker_processes",
1029 "IIS App Pool worker processes currently running",
1030 "processes",
1031 PLUGIN_WINDOWS_NAME,
1032 "PerflibWebService",
1033 PRIO_IIS_APP_POOL_WORKER_PROCESSES_CURRENT,
1034 update_every,
1035 RRDSET_TYPE_LINE);
1036
1037 p->rd_app_current_worker_process =
1038 rrddim_add(p->st_app_current_worker_process, "running", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1039 rrdlabels_add(
1040 p->st_app_current_worker_process->rrdlabels, "app_pool", windows_shared_buffer, RRDLABEL_SRC_AUTO);
1041 }
1042
1043 rrddim_set_by_pointer(
1044 p->st_app_current_worker_process,
1045 p->rd_app_current_worker_process,
1046 (collected_number)p->APPCurrentWorkerProcess.current.Data);
1047
1048 rrdset_done(p->st_app_current_worker_process);
1049 }
1050 }
1051
1052 static inline void app_pool_maximum_worker_processes(
1053 struct iis_app *p,
1054 PERF_DATA_BLOCK *pDataBlock,
1055 PERF_OBJECT_TYPE *pObjectType,
1056 PERF_INSTANCE_DEFINITION *pi,
1057 int update_every)
1058 {
1059 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->APPMaximumWorkerProcess)) {
1060 if (!p->st_app_maximum_worker_process) {
1061 char id[RRD_ID_LENGTH_MAX + 1];
1062 snprintfz(id, RRD_ID_LENGTH_MAX, "application_pool_%s_maximum_worker_processes", windows_shared_buffer);
1063 netdata_fix_chart_name(id);
1064 p->st_app_maximum_worker_process = rrdset_create_localhost(
1065 "iis",
1066 id,
1067 NULL,
1068 "app pool worker processes",
1069 "iis.application_pool_maximum_worker_processes",
1070 "IIS App Pool maximum created worker processes",
1071 "processes",
1072 PLUGIN_WINDOWS_NAME,
1073 "PerflibWebService",
1074 PRIO_IIS_APP_POOL_WORKER_PROCESSES_MAX,
1075 update_every,
1076 RRDSET_TYPE_LINE);
1077
1078 p->rd_app_maximum_worker_process =
1079 rrddim_add(p->st_app_maximum_worker_process, "created", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1080 rrdlabels_add(
1081 p->st_app_maximum_worker_process->rrdlabels, "app_pool", windows_shared_buffer, RRDLABEL_SRC_AUTO);
1082 }
1083
1084 rrddim_set_by_pointer(
1085 p->st_app_maximum_worker_process,
1086 p->rd_app_maximum_worker_process,
1087 (collected_number)p->APPMaximumWorkerProcess.current.Data);
1088
1089 rrdset_done(p->st_app_maximum_worker_process);
1090 }
1091 }
1092
1093 static inline void app_pool_recent_worker_process_failures(
1094 struct iis_app *p,
1095 PERF_DATA_BLOCK *pDataBlock,
1096 PERF_OBJECT_TYPE *pObjectType,
1097 PERF_INSTANCE_DEFINITION *pi,
1098 int update_every)
1099 {
1100 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->APPRecentWorkerProcessFailure)) {
1101 if (!p->st_app_recent_worker_process_failure) {
1102 char id[RRD_ID_LENGTH_MAX + 1];
1103 snprintfz(
1104 id, RRD_ID_LENGTH_MAX, "application_pool_%s_recent_worker_process_failures", windows_shared_buffer);
1105 netdata_fix_chart_name(id);
1106 p->st_app_recent_worker_process_failure = rrdset_create_localhost(
1107 "iis",
1108 id,
1109 NULL,
1110 "app pool failures",
1111 "iis.application_pool_recent_worker_process_failures",
1112 "IIS App Pool worker process failures during the rapid-fail protection interval",
1113 "failures/s",
1114 PLUGIN_WINDOWS_NAME,
1115 "PerflibWebService",
1116 PRIO_IIS_APP_POOL_WORKER_PROCESS_RECENT_FAILURES,
1117 update_every,
1118 RRDSET_TYPE_LINE);
1119
1120 p->rd_app_recent_worker_process_failure =
1121 rrddim_add(p->st_app_recent_worker_process_failure, "failures", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1122 rrdlabels_add(
1123 p->st_app_recent_worker_process_failure->rrdlabels,
1124 "app_pool",
1125 windows_shared_buffer,
1126 RRDLABEL_SRC_AUTO);
1127 }
1128
1129 rrddim_set_by_pointer(
1130 p->st_app_recent_worker_process_failure,
1131 p->rd_app_recent_worker_process_failure,
1132 (collected_number)p->APPRecentWorkerProcessFailure.current.Data);
1133
1134 rrdset_done(p->st_app_recent_worker_process_failure);
1135 }
1136 }
1137
1138 static inline void app_pool_recycles(
1139 struct iis_app *p,
1140 PERF_DATA_BLOCK *pDataBlock,
1141 PERF_OBJECT_TYPE *pObjectType,
1142 PERF_INSTANCE_DEFINITION *pi,
1143 int update_every)
1144 {
1145 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->APPApplicationPoolRecycles)) {
1146 if (!p->st_app_application_pool_recycles) {
1147 char id[RRD_ID_LENGTH_MAX + 1];
1148 snprintfz(id, RRD_ID_LENGTH_MAX, "application_pool_%s_recycles", windows_shared_buffer);
1149 netdata_fix_chart_name(id);
1150 p->st_app_application_pool_recycles = rrdset_create_localhost(
1151 "iis",
1152 id,
1153 NULL,
1154 "app pool recycles",
1155 "iis.application_pool_recycles",
1156 "IIS App Pool recycles",
1157 "recycles/s",
1158 PLUGIN_WINDOWS_NAME,
1159 "PerflibWebService",
1160 PRIO_IIS_APP_POOL_RECYCLES,
1161 update_every,
1162 RRDSET_TYPE_LINE);
1163
1164 p->rd_app_application_pool_recycles =
1165 rrddim_add(p->st_app_application_pool_recycles, "recycles", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1166 rrdlabels_add(
1167 p->st_app_application_pool_recycles->rrdlabels, "app_pool", windows_shared_buffer, RRDLABEL_SRC_AUTO);
1168 }
1169
1170 rrddim_set_by_pointer(
1171 p->st_app_application_pool_recycles,
1172 p->rd_app_application_pool_recycles,
1173 (collected_number)p->APPApplicationPoolRecycles.current.Data);
1174
1175 rrdset_done(p->st_app_application_pool_recycles);
1176 }
1177 }
1178
1179 static inline void app_pool_uptime(
1180 struct iis_app *p,
1181 PERF_DATA_BLOCK *pDataBlock,
1182 PERF_OBJECT_TYPE *pObjectType,
1183 PERF_INSTANCE_DEFINITION *pi,
1184 int update_every)
1185 {
1186 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->APPTotalApplicationPoolUptime)) {
1187 if (p->APPTotalApplicationPoolUptime.current.Frequency != 0) {
1188 if (!p->st_app_application_pool_uptime) {
1189 char id[RRD_ID_LENGTH_MAX + 1];
1190 snprintfz(id, RRD_ID_LENGTH_MAX, "application_pool_%s_uptime", windows_shared_buffer);
1191 netdata_fix_chart_name(id);
1192 p->st_app_application_pool_uptime = rrdset_create_localhost(
1193 "iis",
1194 id,
1195 NULL,
1196 "app pool uptime",
1197 "iis.application_pool_uptime",
1198 "IIS App Pool uptime",
1199 "seconds",
1200 PLUGIN_WINDOWS_NAME,
1201 "PerflibWebService",
1202 PRIO_IIS_APP_POOL_TOTAL_UPTIME,
1203 update_every,
1204 RRDSET_TYPE_LINE);
1205
1206 p->rd_app_application_pool_uptime =
1207 rrddim_add(p->st_app_application_pool_uptime, "uptime", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1208 rrdlabels_add(
1209 p->st_app_application_pool_uptime->rrdlabels, "app_pool", windows_shared_buffer, RRDLABEL_SRC_AUTO);
1210 }
1211
1212 time_t uptime = (time_t)(p->APPTotalApplicationPoolUptime.current.Time /
1213 p->APPTotalApplicationPoolUptime.current.Frequency);
1214
1215 rrddim_set_by_pointer(
1216 p->st_app_application_pool_uptime, p->rd_app_application_pool_uptime, (collected_number)uptime);
1217
1218 rrdset_done(p->st_app_application_pool_uptime);
1219 }
1220 }
1221 }
1222
1223 static inline void app_pool_worker_processes_created(
1224 struct iis_app *p,
1225 PERF_DATA_BLOCK *pDataBlock,
1226 PERF_OBJECT_TYPE *pObjectType,
1227 PERF_INSTANCE_DEFINITION *pi,
1228 int update_every)
1229 {
1230 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->APPWorkerProcessCreated)) {
1231 if (!p->st_app_worker_process_created) {
1232 char id[RRD_ID_LENGTH_MAX + 1];
1233 snprintfz(id, RRD_ID_LENGTH_MAX, "application_pool_%s_worker_processes_created", windows_shared_buffer);
1234 netdata_fix_chart_name(id);
1235 p->st_app_worker_process_created = rrdset_create_localhost(
1236 "iis",
1237 id,
1238 NULL,
1239 "app pool worker processes",
1240 "iis.application_pool_worker_processes_created",
1241 "IIS App Pool worker processes created",
1242 "processes/s",
1243 PLUGIN_WINDOWS_NAME,
1244 "PerflibWebService",
1245 PRIO_IIS_APP_POOL_TOTAL_WORKER_PROCESSES_CREATED,
1246 update_every,
1247 RRDSET_TYPE_LINE);
1248
1249 p->rd_app_worker_process_created =
1250 rrddim_add(p->st_app_worker_process_created, "created", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1251 rrdlabels_add(
1252 p->st_app_worker_process_created->rrdlabels, "app_pool", windows_shared_buffer, RRDLABEL_SRC_AUTO);
1253 }
1254
1255 rrddim_set_by_pointer(
1256 p->st_app_worker_process_created,
1257 p->rd_app_worker_process_created,
1258 (collected_number)p->APPWorkerProcessCreated.current.Data);
1259
1260 rrdset_done(p->st_app_worker_process_created);
1261 }
1262 }
1263
1264 static inline void app_pool_worker_process_failures(
1265 struct iis_app *p,
1266 PERF_DATA_BLOCK *pDataBlock,
1267 PERF_OBJECT_TYPE *pObjectType,
1268 PERF_INSTANCE_DEFINITION *pi,
1269 int update_every)
1270 {
1271 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->APPWorkerProcessFailures) &&
1272 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->APPWorkerProcessPingFailures) &&
1273 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->APPWorkerProcessShutdownFailures) &&
1274 perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->APPWorkerProcessStartupFailures)) {
1275 if (!p->st_app_worker_process_failures) {
1276 char id[RRD_ID_LENGTH_MAX + 1];
1277 snprintfz(id, RRD_ID_LENGTH_MAX, "application_pool_%s_worker_process_failures", windows_shared_buffer);
1278 netdata_fix_chart_name(id);
1279 p->st_app_worker_process_failures = rrdset_create_localhost(
1280 "iis",
1281 id,
1282 NULL,
1283 "app pool failures",
1284 "iis.application_pool_worker_process_failures",
1285 "IIS App Pool worker process failures",
1286 "failures/s",
1287 PLUGIN_WINDOWS_NAME,
1288 "PerflibWebService",
1289 PRIO_IIS_APP_POOL_TOTAL_WORKER_PROCESS_FAILURES,
1290 update_every,
1291 RRDSET_TYPE_LINE);
1292
1293 p->rd_app_worker_process_crashes =
1294 rrddim_add(p->st_app_worker_process_failures, "crash", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1295 p->rd_app_worker_process_ping_failures =
1296 rrddim_add(p->st_app_worker_process_failures, "ping", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1297 p->rd_app_worker_process_startup_failures =
1298 rrddim_add(p->st_app_worker_process_failures, "startup", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1299 p->rd_app_worker_process_shutdown_failures =
1300 rrddim_add(p->st_app_worker_process_failures, "shutdown", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1301 rrdlabels_add(
1302 p->st_app_worker_process_failures->rrdlabels, "app_pool", windows_shared_buffer, RRDLABEL_SRC_AUTO);
1303 }
1304
1305 rrddim_set_by_pointer(
1306 p->st_app_worker_process_failures,
1307 p->rd_app_worker_process_crashes,
1308 (collected_number)p->APPWorkerProcessFailures.current.Data);
1309
1310 rrddim_set_by_pointer(
1311 p->st_app_worker_process_failures,
1312 p->rd_app_worker_process_ping_failures,
1313 (collected_number)p->APPWorkerProcessPingFailures.current.Data);
1314
1315 rrddim_set_by_pointer(
1316 p->st_app_worker_process_failures,
1317 p->rd_app_worker_process_startup_failures,
1318 (collected_number)p->APPWorkerProcessStartupFailures.current.Data);
1319
1320 rrddim_set_by_pointer(
1321 p->st_app_worker_process_failures,
1322 p->rd_app_worker_process_shutdown_failures,
1323 (collected_number)p->APPWorkerProcessShutdownFailures.current.Data);
1324
1325 rrdset_done(p->st_app_worker_process_failures);
1326 }
1327 }
1328
1329 static bool do_app_pool(PERF_DATA_BLOCK *pDataBlock, int update_every)
1330 {
1331 PERF_OBJECT_TYPE *pObjectType = perflibFindObjectTypeByName(pDataBlock, "APP_POOL_WAS");
1332 if (!pObjectType)
1333 return false;
1334
1335 PERF_INSTANCE_DEFINITION *pi = NULL;
1336 for (LONG i = 0; i < pObjectType->NumInstances; i++) {
1337 pi = perflibForEachInstance(pDataBlock, pObjectType, pi);
1338 if (!pi)
1339 break;
1340
1341 if (!getInstanceName(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer)))
1342 strncpyz(windows_shared_buffer, "[unknown]", sizeof(windows_shared_buffer) - 1);
1343
1344 // We are not ploting _Total here, because cloud will group the sites
1345 if (strcasecmp(windows_shared_buffer, "_Total") == 0) {
1346 continue;
1347 }
1348
1349 struct iis_app *p = dictionary_set(app_pools, windows_shared_buffer, NULL, sizeof(*p));
1350 app_pool_current_state(p, pDataBlock, pObjectType, pi, update_every);
1351
1352 app_pool_current_worker_processes(p, pDataBlock, pObjectType, pi, update_every);
1353 app_pool_maximum_worker_processes(p, pDataBlock, pObjectType, pi, update_every);
1354 app_pool_worker_processes_created(p, pDataBlock, pObjectType, pi, update_every);
1355
1356 app_pool_recent_worker_process_failures(p, pDataBlock, pObjectType, pi, update_every);
1357 app_pool_worker_process_failures(p, pDataBlock, pObjectType, pi, update_every);
1358
1359 app_pool_recycles(p, pDataBlock, pObjectType, pi, update_every);
1360 app_pool_uptime(p, pDataBlock, pObjectType, pi, update_every);
1361 }
1362
1363 return true;
1364 }
1365
1366 static int iis_web_service(char *name, int update_every, typeof(bool(PERF_DATA_BLOCK *, int)) *routine)
1367 {
1368 DWORD id = RegistryFindIDByName(name);
1369 if (id == PERFLIB_REGISTRY_NAME_NOT_FOUND)
1370 return -1;
1371
1372 PERF_DATA_BLOCK *pDataBlock = perflibGetPerformanceData(id);
1373 if (!pDataBlock)
1374 return -1;
1375
1376 routine(pDataBlock, update_every);
1377 return 0;
1378 }
1379
1380 static inline void w3svc_w3wp_active_threads(
1381 struct ws3svc_w3wp_data *p,
1382 PERF_DATA_BLOCK *pDataBlock,
1383 PERF_OBJECT_TYPE *pObjectType,
1384 PERF_INSTANCE_DEFINITION *pi,
1385 int update_every,
1386 char *app_name)
1387 {
1388 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->W3SVCW3WPActiveThreads)) {
1389 if (!p->st_w3svc_w3wp_active_threads) {
1390 char id[RRD_ID_LENGTH_MAX + 1];
1391 snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_active_threads", app_name);
1392 netdata_fix_chart_name(id);
1393 p->st_w3svc_w3wp_active_threads = rrdset_create_localhost(
1394 "iis",
1395 id,
1396 NULL,
1397 "w3svc w3wp",
1398 "iis.w3svc_w3wp_active_threads",
1399 "Threads actively processing requests in the worker process",
1400 "threads",
1401 PLUGIN_WINDOWS_NAME,
1402 "PerflibWebService",
1403 PRIO_W3SVC_W3WP_ACTIVE_THREADS,
1404 update_every,
1405 RRDSET_TYPE_LINE);
1406
1407 p->rd_w3svc_w3wp_active_threads =
1408 rrddim_add(p->st_w3svc_w3wp_active_threads, "active", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1409 rrdlabels_add(p->st_w3svc_w3wp_active_threads->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1410 }
1411
1412 rrddim_set_by_pointer(
1413 p->st_w3svc_w3wp_active_threads,
1414 p->rd_w3svc_w3wp_active_threads,
1415 (collected_number)p->W3SVCW3WPActiveThreads.current.Data);
1416
1417 rrdset_done(p->st_w3svc_w3wp_active_threads);
1418 }
1419 }
1420
1421 static inline void w3svc_w3wp_requests_total(
1422 struct ws3svc_w3wp_data *p,
1423 PERF_DATA_BLOCK *pDataBlock,
1424 PERF_OBJECT_TYPE *pObjectType,
1425 PERF_INSTANCE_DEFINITION *pi,
1426 int update_every,
1427 char *app_name)
1428 {
1429 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->W3SVCW3WPRequestTotal)) {
1430 if (!p->st_w3svc_w3wp_requests_total) {
1431 char id[RRD_ID_LENGTH_MAX + 1];
1432 snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_requests_total", app_name);
1433 netdata_fix_chart_name(id);
1434 p->st_w3svc_w3wp_requests_total = rrdset_create_localhost(
1435 "iis",
1436 id,
1437 NULL,
1438 "w3svc w3wp",
1439 "iis.w3svc_w3wp_requests_total",
1440 "HTTP requests served by the worker process.",
1441 "requests/s",
1442 PLUGIN_WINDOWS_NAME,
1443 "PerflibWebService",
1444 PRIO_W3SVC_W3WP_REQUESTS_TOTAL,
1445 update_every,
1446 RRDSET_TYPE_LINE);
1447
1448 p->rd_w3svc_w3wp_requests_total =
1449 rrddim_add(p->st_w3svc_w3wp_requests_total, "requests", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1450 rrdlabels_add(p->st_w3svc_w3wp_requests_total->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1451 }
1452
1453 rrddim_set_by_pointer(
1454 p->st_w3svc_w3wp_requests_total,
1455 p->rd_w3svc_w3wp_requests_total,
1456 (collected_number)p->W3SVCW3WPRequestTotal.current.Data);
1457
1458 rrdset_done(p->st_w3svc_w3wp_requests_total);
1459 }
1460 }
1461
1462 static inline void w3svc_w3wp_requests_active(
1463 struct ws3svc_w3wp_data *p,
1464 PERF_DATA_BLOCK *pDataBlock,
1465 PERF_OBJECT_TYPE *pObjectType,
1466 PERF_INSTANCE_DEFINITION *pi,
1467 int update_every,
1468 char *app_name)
1469 {
1470 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->W3SVCW3WPRequestActive)) {
1471 if (!p->st_w3svc_w3wp_requests_active) {
1472 char id[RRD_ID_LENGTH_MAX + 1];
1473 snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_requests_active", app_name);
1474 netdata_fix_chart_name(id);
1475 p->st_w3svc_w3wp_requests_active = rrdset_create_localhost(
1476 "iis",
1477 id,
1478 NULL,
1479 "w3svc w3wp",
1480 "iis.w3svc_w3wp_requests_active",
1481 "Current number of requests being processed by the worker process",
1482 "requests",
1483 PLUGIN_WINDOWS_NAME,
1484 "PerflibWebService",
1485 PRIO_W3SVC_W3WP_REQUESTS_ACTIVE,
1486 update_every,
1487 RRDSET_TYPE_LINE);
1488
1489 p->rd_w3svc_w3wp_requests_active =
1490 rrddim_add(p->st_w3svc_w3wp_requests_active, "active", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1491 rrdlabels_add(p->st_w3svc_w3wp_requests_active->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1492 }
1493
1494 rrddim_set_by_pointer(
1495 p->st_w3svc_w3wp_requests_active,
1496 p->rd_w3svc_w3wp_requests_active,
1497 (collected_number)p->W3SVCW3WPRequestActive.current.Data);
1498
1499 rrdset_done(p->st_w3svc_w3wp_requests_active);
1500 }
1501 }
1502
1503 static inline void w3svc_w3wp_file_cache_mem_usage(
1504 struct ws3svc_w3wp_data *p,
1505 PERF_DATA_BLOCK *pDataBlock,
1506 PERF_OBJECT_TYPE *pObjectType,
1507 PERF_INSTANCE_DEFINITION *pi,
1508 int update_every,
1509 char *app_name)
1510 {
1511 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->W3SVCW3WPFileCacheMemUsage)) {
1512 if (!p->st_w3svc_w3wp_file_cache_mem_usage) {
1513 char id[RRD_ID_LENGTH_MAX + 1];
1514 snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_file_cache_mem_usage", app_name);
1515 netdata_fix_chart_name(id);
1516 p->st_w3svc_w3wp_file_cache_mem_usage = rrdset_create_localhost(
1517 "iis",
1518 id,
1519 NULL,
1520 "w3svc w3wp",
1521 "iis.w3svc_w3wp_file_cache_mem_usage",
1522 "Current memory usage by the worker process.",
1523 "bytes",
1524 PLUGIN_WINDOWS_NAME,
1525 "PerflibWebService",
1526 PRIO_W3SVC_W3WP_FILE_CACHE_MEM_USAGE,
1527 update_every,
1528 RRDSET_TYPE_AREA);
1529
1530 p->rd_w3svc_w3wp_file_cache_mem_usage =
1531 rrddim_add(p->st_w3svc_w3wp_file_cache_mem_usage, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1532 rrdlabels_add(p->st_w3svc_w3wp_file_cache_mem_usage->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1533 }
1534
1535 rrddim_set_by_pointer(
1536 p->st_w3svc_w3wp_file_cache_mem_usage,
1537 p->rd_w3svc_w3wp_file_cache_mem_usage,
1538 (collected_number)p->W3SVCW3WPFileCacheMemUsage.current.Data);
1539
1540 rrdset_done(p->st_w3svc_w3wp_file_cache_mem_usage);
1541 }
1542 }
1543
1544 static inline void w3svc_w3wp_files_cached_total(
1545 struct ws3svc_w3wp_data *p,
1546 PERF_DATA_BLOCK *pDataBlock,
1547 PERF_OBJECT_TYPE *pObjectType,
1548 PERF_INSTANCE_DEFINITION *pi,
1549 int update_every,
1550 char *app_name)
1551 {
1552 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->W3SVCW3WPFilesCachedTotal)) {
1553 if (!p->st_w3svc_w3wp_files_cache_total) {
1554 char id[RRD_ID_LENGTH_MAX + 1];
1555 snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_files_cache_total", app_name);
1556 netdata_fix_chart_name(id);
1557 p->st_w3svc_w3wp_files_cache_total = rrdset_create_localhost(
1558 "iis",
1559 id,
1560 NULL,
1561 "w3svc w3wp",
1562 "iis.w3svc_w3wp_files_cache_total",
1563 "Files whose contents were ever added to the cache",
1564 "files/s",
1565 PLUGIN_WINDOWS_NAME,
1566 "PerflibWebService",
1567 PRIO_W3SVC_W3WP_FILE_CACHE_TOTAL,
1568 update_every,
1569 RRDSET_TYPE_LINE);
1570
1571 p->rd_w3svc_w3wp_files_cache_total =
1572 rrddim_add(p->st_w3svc_w3wp_files_cache_total, "cached_files", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1573 rrdlabels_add(p->st_w3svc_w3wp_files_cache_total->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1574 }
1575
1576 rrddim_set_by_pointer(
1577 p->st_w3svc_w3wp_files_cache_total,
1578 p->rd_w3svc_w3wp_files_cache_total,
1579 (collected_number)p->W3SVCW3WPFilesCachedTotal.current.Data);
1580
1581 rrdset_done(p->st_w3svc_w3wp_files_cache_total);
1582 }
1583 }
1584
1585 static inline void w3svc_w3wp_files_flushed_total(
1586 struct ws3svc_w3wp_data *p,
1587 PERF_DATA_BLOCK *pDataBlock,
1588 PERF_OBJECT_TYPE *pObjectType,
1589 PERF_INSTANCE_DEFINITION *pi,
1590 int update_every,
1591 char *app_name)
1592 {
1593 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->W3SVCW3WPFilesFlushedTotal)) {
1594 if (!p->st_w3svc_w3wp_files_flushed_total) {
1595 char id[RRD_ID_LENGTH_MAX + 1];
1596 snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_files_flushed_total", app_name);
1597 netdata_fix_chart_name(id);
1598 p->st_w3svc_w3wp_files_flushed_total = rrdset_create_localhost(
1599 "iis",
1600 id,
1601 NULL,
1602 "w3svc w3wp",
1603 "iis.w3svc_w3wp_files_flushed_total",
1604 "File handles that have been removed from the cache",
1605 "flushes/s",
1606 PLUGIN_WINDOWS_NAME,
1607 "PerflibWebService",
1608 PRIO_W3SVC_W3WP_FILE_FLUSHED_TOTAL,
1609 update_every,
1610 RRDSET_TYPE_LINE);
1611
1612 p->rd_w3svc_w3wp_files_flushed_total =
1613 rrddim_add(p->st_w3svc_w3wp_files_flushed_total, "file_handles", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1614 rrdlabels_add(p->st_w3svc_w3wp_files_flushed_total->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1615 }
1616
1617 rrddim_set_by_pointer(
1618 p->st_w3svc_w3wp_files_flushed_total,
1619 p->rd_w3svc_w3wp_files_flushed_total,
1620 (collected_number)p->W3SVCW3WPFilesFlushedTotal.current.Data);
1621
1622 rrdset_done(p->st_w3svc_w3wp_files_flushed_total);
1623 }
1624 }
1625
1626 static inline void w3svc_w3wp_uri_cached_flushed(
1627 struct ws3svc_w3wp_data *p,
1628 PERF_DATA_BLOCK *pDataBlock,
1629 PERF_OBJECT_TYPE *pObjectType,
1630 PERF_INSTANCE_DEFINITION *pi,
1631 int update_every,
1632 char *app_name)
1633 {
1634 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->W3SVCW3WPURICachedFlushed)) {
1635 if (!p->st_w3svc_w3wp_uri_cache_flushed) {
1636 char id[RRD_ID_LENGTH_MAX + 1];
1637 snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_uri_cache_flushed", app_name);
1638 netdata_fix_chart_name(id);
1639 p->st_w3svc_w3wp_uri_cache_flushed = rrdset_create_localhost(
1640 "iis",
1641 id,
1642 NULL,
1643 "w3svc w3wp",
1644 "iis.w3svc_w3wp_uri_cache_flushed",
1645 "URI cache flushes",
1646 "flushes/s",
1647 PLUGIN_WINDOWS_NAME,
1648 "PerflibWebService",
1649 PRIO_W3SVC_W3WP_URI_FLUSHED_TOTAL,
1650 update_every,
1651 RRDSET_TYPE_LINE);
1652
1653 p->rd_w3svc_w3wp_uri_cache_flushed =
1654 rrddim_add(p->st_w3svc_w3wp_uri_cache_flushed, "cached_uris", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1655 rrdlabels_add(p->st_w3svc_w3wp_uri_cache_flushed->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1656 }
1657
1658 rrddim_set_by_pointer(
1659 p->st_w3svc_w3wp_uri_cache_flushed,
1660 p->rd_w3svc_w3wp_uri_cache_flushed,
1661 (collected_number)p->W3SVCW3WPURICachedFlushed.current.Data);
1662
1663 rrdset_done(p->st_w3svc_w3wp_uri_cache_flushed);
1664 }
1665 }
1666
1667 static inline void w3svc_w3wp_total_uri_cached(
1668 struct ws3svc_w3wp_data *p,
1669 PERF_DATA_BLOCK *pDataBlock,
1670 PERF_OBJECT_TYPE *pObjectType,
1671 PERF_INSTANCE_DEFINITION *pi,
1672 int update_every,
1673 char *app_name)
1674 {
1675 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->W3SVCW3WPTotalURICached)) {
1676 if (!p->st_w3svc_w3wp_total_uri_cached) {
1677 char id[RRD_ID_LENGTH_MAX + 1];
1678 snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_total_uri_cached", app_name);
1679 netdata_fix_chart_name(id);
1680 p->st_w3svc_w3wp_total_uri_cached = rrdset_create_localhost(
1681 "iis",
1682 id,
1683 NULL,
1684 "w3svc w3wp",
1685 "iis.w3svc_w3wp_total_uri_cached",
1686 "URI information blocks added to the cache",
1687 "blocks/s",
1688 PLUGIN_WINDOWS_NAME,
1689 "PerflibWebService",
1690 PRIO_W3SVC_W3WP_URI_CACHED_TOTAL,
1691 update_every,
1692 RRDSET_TYPE_LINE);
1693
1694 p->rd_w3svc_w3wp_total_uri_cached =
1695 rrddim_add(p->st_w3svc_w3wp_total_uri_cached, "uri_cache_blocks", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1696 rrdlabels_add(p->st_w3svc_w3wp_total_uri_cached->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1697 }
1698
1699 rrddim_set_by_pointer(
1700 p->st_w3svc_w3wp_total_uri_cached,
1701 p->rd_w3svc_w3wp_total_uri_cached,
1702 (collected_number)p->W3SVCW3WPTotalURICached.current.Data);
1703
1704 rrdset_done(p->st_w3svc_w3wp_total_uri_cached);
1705 }
1706 }
1707
1708 static inline void w3svc_w3wp_total_metadata_cached(
1709 struct ws3svc_w3wp_data *p,
1710 PERF_DATA_BLOCK *pDataBlock,
1711 PERF_OBJECT_TYPE *pObjectType,
1712 PERF_INSTANCE_DEFINITION *pi,
1713 int update_every,
1714 char *app_name)
1715 {
1716 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->W3SVCW3WPTotalMetadataCached)) {
1717 if (!p->st_w3svc_w3wp_total_metadata_cache) {
1718 char id[RRD_ID_LENGTH_MAX + 1];
1719 snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_total_metadata_cache", app_name);
1720 netdata_fix_chart_name(id);
1721 p->st_w3svc_w3wp_total_metadata_cache = rrdset_create_localhost(
1722 "iis",
1723 id,
1724 NULL,
1725 "w3svc w3wp",
1726 "iis.w3svc_w3wp_total_metadata_cached",
1727 "Metadata information blocks added to the user-mode cache",
1728 "blocks/s",
1729 PLUGIN_WINDOWS_NAME,
1730 "PerflibWebService",
1731 PRIO_W3SVC_W3WP_METADATA_CACHED,
1732 update_every,
1733 RRDSET_TYPE_LINE);
1734
1735 p->rd_w3svc_w3wp_total_metadata_cache =
1736 rrddim_add(p->st_w3svc_w3wp_total_metadata_cache, "metadata_blocks", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1737 rrdlabels_add(p->st_w3svc_w3wp_total_metadata_cache->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1738 }
1739
1740 rrddim_set_by_pointer(
1741 p->st_w3svc_w3wp_total_metadata_cache,
1742 p->rd_w3svc_w3wp_total_metadata_cache,
1743 (collected_number)p->W3SVCW3WPTotalMetadataCached.current.Data);
1744
1745 rrdset_done(p->st_w3svc_w3wp_total_metadata_cache);
1746 }
1747 }
1748
1749 static inline void w3svc_w3wp_total_metadata_flushed(
1750 struct ws3svc_w3wp_data *p,
1751 PERF_DATA_BLOCK *pDataBlock,
1752 PERF_OBJECT_TYPE *pObjectType,
1753 PERF_INSTANCE_DEFINITION *pi,
1754 int update_every,
1755 char *app_name)
1756 {
1757 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->W3SVCW3WPTotalMetadataFlushed)) {
1758 if (!p->st_w3svc_w3wp_total_metadata_flushed) {
1759 char id[RRD_ID_LENGTH_MAX + 1];
1760 snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_total_metadata_flushed", app_name);
1761 netdata_fix_chart_name(id);
1762 p->st_w3svc_w3wp_total_metadata_flushed = rrdset_create_localhost(
1763 "iis",
1764 id,
1765 NULL,
1766 "w3svc w3wp",
1767 "iis.w3svc_w3wp_total_metadata_flushed",
1768 "User-mode metadata cache flushed",
1769 "flushes/s",
1770 PLUGIN_WINDOWS_NAME,
1771 "PerflibWebService",
1772 PRIO_W3SVC_W3WP_METADATA_FLUSHED,
1773 update_every,
1774 RRDSET_TYPE_LINE);
1775
1776 p->rd_w3svc_w3wp_total_metadata_flushed =
1777 rrddim_add(p->st_w3svc_w3wp_total_metadata_flushed, "metadata_blocks", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1778 rrdlabels_add(p->st_w3svc_w3wp_total_metadata_flushed->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1779 }
1780
1781 rrddim_set_by_pointer(
1782 p->st_w3svc_w3wp_total_metadata_flushed,
1783 p->rd_w3svc_w3wp_total_metadata_flushed,
1784 (collected_number)p->W3SVCW3WPTotalMetadataFlushed.current.Data);
1785
1786 rrdset_done(p->st_w3svc_w3wp_total_metadata_flushed);
1787 }
1788 }
1789
1790 static inline void w3svc_w3wp_output_cache_active_flushed_items(
1791 struct ws3svc_w3wp_data *p,
1792 PERF_DATA_BLOCK *pDataBlock,
1793 PERF_OBJECT_TYPE *pObjectType,
1794 PERF_INSTANCE_DEFINITION *pi,
1795 int update_every,
1796 char *app_name)
1797 {
1798 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->W3SVCW3WPOutputCacheActiveFlushedItems)) {
1799 if (!p->st_w3svc_w3wp_output_cache_active_flushed_items) {
1800 char id[RRD_ID_LENGTH_MAX + 1];
1801 snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_output_cache_active_flushed_items", app_name);
1802 netdata_fix_chart_name(id);
1803 p->st_w3svc_w3wp_output_cache_active_flushed_items = rrdset_create_localhost(
1804 "iis",
1805 id,
1806 NULL,
1807 "w3svc w3wp",
1808 "iis.w3svc_w3wp_output_cache_active_flushed_items",
1809 "Items flushed but still in memory for active responses",
1810 "items",
1811 PLUGIN_WINDOWS_NAME,
1812 "PerflibWebService",
1813 PRIO_W3SVC_W3WP_OUTPUT_CACHE_ACTIVE_FLUSH,
1814 update_every,
1815 RRDSET_TYPE_LINE);
1816
1817 p->rd_w3svc_w3wp_output_cache_active_flushed_items = rrddim_add(
1818 p->st_w3svc_w3wp_output_cache_active_flushed_items, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1819 rrdlabels_add(
1820 p->st_w3svc_w3wp_output_cache_active_flushed_items->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1821 }
1822
1823 rrddim_set_by_pointer(
1824 p->st_w3svc_w3wp_output_cache_active_flushed_items,
1825 p->rd_w3svc_w3wp_output_cache_active_flushed_items,
1826 (collected_number)p->W3SVCW3WPOutputCacheActiveFlushedItems.current.Data);
1827
1828 rrdset_done(p->st_w3svc_w3wp_output_cache_active_flushed_items);
1829 }
1830 }
1831
1832 static inline void w3svc_w3wp_output_cache_memory_usage(
1833 struct ws3svc_w3wp_data *p,
1834 PERF_DATA_BLOCK *pDataBlock,
1835 PERF_OBJECT_TYPE *pObjectType,
1836 PERF_INSTANCE_DEFINITION *pi,
1837 int update_every,
1838 char *app_name)
1839 {
1840 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->W3SVCW3WPOutputCacheMemoryUsage)) {
1841 if (!p->st_w3svc_w3wp_output_cache_memory_usage) {
1842 char id[RRD_ID_LENGTH_MAX + 1];
1843 snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_output_cache_memory_usage", app_name);
1844 netdata_fix_chart_name(id);
1845 p->st_w3svc_w3wp_output_cache_memory_usage = rrdset_create_localhost(
1846 "iis",
1847 id,
1848 NULL,
1849 "w3svc w3wp",
1850 "iis.w3svc_w3wp_output_cache_memory_usage",
1851 "Current number of bytes used by output cache",
1852 "bytes",
1853 PLUGIN_WINDOWS_NAME,
1854 "PerflibWebService",
1855 PRIO_W3SVC_W3WP_OUTPUT_CACHE_MEMORY_USAGE,
1856 update_every,
1857 RRDSET_TYPE_AREA);
1858
1859 p->rd_w3svc_w3wp_output_cache_memory_usage =
1860 rrddim_add(p->st_w3svc_w3wp_output_cache_memory_usage, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1861 rrdlabels_add(p->st_w3svc_w3wp_output_cache_memory_usage->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1862 }
1863
1864 rrddim_set_by_pointer(
1865 p->st_w3svc_w3wp_output_cache_memory_usage,
1866 p->rd_w3svc_w3wp_output_cache_memory_usage,
1867 (collected_number)p->W3SVCW3WPOutputCacheMemoryUsage.current.Data);
1868
1869 rrdset_done(p->st_w3svc_w3wp_output_cache_memory_usage);
1870 }
1871 }
1872
1873 static inline void w3svc_w3wp_output_cache_flushed_total(
1874 struct ws3svc_w3wp_data *p,
1875 PERF_DATA_BLOCK *pDataBlock,
1876 PERF_OBJECT_TYPE *pObjectType,
1877 PERF_INSTANCE_DEFINITION *pi,
1878 int update_every,
1879 char *app_name)
1880 {
1881 if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->W3SVCW3WPOutputCacheFlushesTotal)) {
1882 if (!p->st_w3svc_w3wp_output_cache_flushed_total) {
1883 char id[RRD_ID_LENGTH_MAX + 1];
1884 snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_output_cache_flushed_total", app_name);
1885 netdata_fix_chart_name(id);
1886 p->st_w3svc_w3wp_output_cache_flushed_total = rrdset_create_localhost(
1887 "iis",
1888 id,
1889 NULL,
1890 "w3svc w3wp",
1891 "iis.w3svc_w3wp_output_cache_flushed_total",
1892 "Flushes of output cache",
1893 "flushes/s",
1894 PLUGIN_WINDOWS_NAME,
1895 "PerflibWebService",
1896 PRIO_W3SVC_W3WP_OUTPUT_CACHE_FLUSHED_TOTAL,
1897 update_every,
1898 RRDSET_TYPE_LINE);
1899
1900 p->rd_w3svc_w3wp_output_cache_flushed_total = rrddim_add(
1901 p->st_w3svc_w3wp_output_cache_flushed_total, "output_cache_entries", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1902 rrdlabels_add(p->st_w3svc_w3wp_output_cache_flushed_total->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1903 }
1904
1905 rrddim_set_by_pointer(
1906 p->st_w3svc_w3wp_output_cache_flushed_total,
1907 p->rd_w3svc_w3wp_output_cache_flushed_total,
1908 (collected_number)p->W3SVCW3WPOutputCacheFlushesTotal.current.Data);
1909
1910 rrdset_done(p->st_w3svc_w3wp_output_cache_flushed_total);
1911 }
1912 }
1913
1914 static bool do_W3SCV_W3WP(PERF_DATA_BLOCK *pDataBlock, int update_every)
1915 {
1916 PERF_OBJECT_TYPE *pObjectType = perflibFindObjectTypeByName(pDataBlock, "W3SVC_W3WP");
1917 if (!pObjectType)
1918 return false;
1919
1920 PERF_INSTANCE_DEFINITION *pi = NULL;
1921 for (LONG i = 0; i < pObjectType->NumInstances; i++) {
1922 pi = perflibForEachInstance(pDataBlock, pObjectType, pi);
1923 if (!pi)
1924 break;
1925
1926 if (!getInstanceName(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer)))
1927 strncpyz(windows_shared_buffer, "[unknown]", sizeof(windows_shared_buffer) - 1);
1928
1929 // We are not ploting _Total here, because cloud will group the sites
1930 if (strcasecmp(windows_shared_buffer, "_Total") == 0) {
1931 continue;
1932 }
1933
1934 struct ws3svc_w3wp_data *p = dictionary_set(w3svc_w3wp_service, windows_shared_buffer, NULL, sizeof(*p));
1935 // Instance example: "11084_MSExchangeOABAppPool"
1936 char *app = strchr(windows_shared_buffer, '_');
1937 if (!app) {
1938 continue;
1939 }
1940
1941 *app++ = '\0';
1942
1943 w3svc_w3wp_active_threads(p, pDataBlock, pObjectType, pi, update_every, app);
1944
1945 w3svc_w3wp_requests_total(p, pDataBlock, pObjectType, pi, update_every, app);
1946 w3svc_w3wp_requests_active(p, pDataBlock, pObjectType, pi, update_every, app);
1947
1948 w3svc_w3wp_file_cache_mem_usage(p, pDataBlock, pObjectType, pi, update_every, app);
1949
1950 w3svc_w3wp_files_cached_total(p, pDataBlock, pObjectType, pi, update_every, app);
1951 w3svc_w3wp_files_flushed_total(p, pDataBlock, pObjectType, pi, update_every, app);
1952
1953 w3svc_w3wp_uri_cached_flushed(p, pDataBlock, pObjectType, pi, update_every, app);
1954 w3svc_w3wp_total_uri_cached(p, pDataBlock, pObjectType, pi, update_every, app);
1955
1956 w3svc_w3wp_total_metadata_cached(p, pDataBlock, pObjectType, pi, update_every, app);
1957 w3svc_w3wp_total_metadata_flushed(p, pDataBlock, pObjectType, pi, update_every, app);
1958
1959 w3svc_w3wp_output_cache_active_flushed_items(p, pDataBlock, pObjectType, pi, update_every, app);
1960 w3svc_w3wp_output_cache_memory_usage(p, pDataBlock, pObjectType, pi, update_every, app);
1961 w3svc_w3wp_output_cache_flushed_total(p, pDataBlock, pObjectType, pi, update_every, app);
1962 }
1963
1964 return true;
1965 }
1966
1967 int do_PerflibWebService(int update_every __maybe_unused, usec_t dt __maybe_unused)
1968 {
1969 static bool initialized = false;
1970
1971 if (unlikely(!initialized)) {
1972 initialize();
1973 initialized = true;
1974 }
1975
1976 int ret = 0;
1977 #define TOTAL_NUMBER_OF_FAILURES (3)
1978 if (iis_web_service("Web Service", update_every, do_web_services))
1979 ret++;
1980 if (iis_web_service("APP_POOL_WAS", update_every, do_app_pool))
1981 ret++;
1982 if (iis_web_service("W3SVC_W3WP", update_every, do_W3SCV_W3WP))
1983 ret++;
1984
1985 return (ret == TOTAL_NUMBER_OF_FAILURES) ? -1 : 0;
1986 }