@cryptotaxi247 / netdata-1 / commits / 03455218e

IIS W3SCV W3MP Metrics (windows.plugin) (#20245)

thiagoftsm committed May 20, 2025 at 17:47 UTC 03455218ee908f3b4dc93e867605eb6c67dc3b99
4 files changed +788 -5
src/collectors/windows.plugin/metadata.yaml
+87 -3
@@ -1218,6 +1218,90 @@ modules:
1218 chart_type: line
1219 dimensions:
1220 - name: uptime
1221 + - name: IIS W3SCV W3MP
1222 + description: "These metrics refer to the World Wide Web Publishing Service, the service responsible for hosting and serving web content."
1223 + labels:
1224 + - name: app
1225 + description: Application name.
1226 + metrics:
1227 + - name: iis.w3svc_w3wp_active_threads
1228 + description: Threads actively processing requests in the worker process
1229 + unit: "threads"
1230 + chart_type: line
1231 + dimensions:
1232 + - name: threads
1233 + - name: iis.w3svc_w3wp_requests_total
1234 + description: HTTP requests served by the worker process
1235 + unit: "requests/s"
1236 + chart_type: line
1237 + dimensions:
1238 + - name: requests
1239 + - name: iis.w3svc_w3wp_requests_active
1240 + description: Current number of requests being processed by the worker process
1241 + unit: "requests"
1242 + chart_type: line
1243 + dimensions:
1244 + - name: requests
1245 + - name: iis.w3svc_w3wp_file_cache_mem_usage
1246 + description: Current memory usage by the worker process
1247 + unit: "bytes"
1248 + chart_type: area
1249 + dimensions:
1250 + - name: used
1251 + - name: iis.w3svc_w3wp_files_cache_total
1252 + description: Files whose contents were ever added to the cache
1253 + unit: "files/s"
1254 + chart_type: line
1255 + dimensions:
1256 + - name: cached_files
1257 + - name: iis.w3svc_w3wp_files_flushed_total
1258 + description: File handles that have been removed from the cache
1259 + unit: "flushes/s"
1260 + chart_type: line
1261 + dimensions:
1262 + - name: file_handles
1263 + - name: iis.w3svc_w3wp_uri_cache_flushed
1264 + description: URI cache flushes
1265 + unit: "flushes/s"
1266 + chart_type: line
1267 + dimensions:
1268 + - name: cached_uris
1269 + - name: iis.w3svc_w3wp_total_uri_cached
1270 + description: URI information blocks added to the cache
1271 + unit: "blocks/s"
1272 + chart_type: line
1273 + dimensions:
1274 + - name: uri_cache_blocks
1275 + - name: iis.w3svc_w3wp_total_metadata_cached
1276 + description: Metadata information blocks added to the user-mode cache
1277 + unit: "blocks/s"
1278 + chart_type: line
1279 + dimensions:
1280 + - name: metadata_blocks
1281 + - name: iis.w3svc_w3wp_total_metadata_flushed
1282 + description: User-mode metadata cache flushes
1283 + unit: "flushes/s"
1284 + chart_type: line
1285 + dimensions:
1286 + - name: metadata_blocks
1287 + - name: iis.w3svc_w3wp_output_cache_active_flushed_items
1288 + description: Items flushed but still in memory for active responses
1289 + unit: "items"
1290 + chart_type: line
1291 + dimensions:
1292 + - name: used
1293 + - name: iis.w3svc_w3wp_output_cache_memory_usage
1294 + description: Current number of bytes used by output cache
1295 + unit: "bytes"
1296 + chart_type: area
1297 + dimensions:
1298 + - name: used
1299 + - name: iis.w3svc_w3wp_output_cache_flushed_total
1300 + description: Flushes of output cache
1301 + unit: "flushes"
1302 + chart_type: line
1303 + dimensions:
1304 + - name: output_cache_entries
1305 - meta:
1306 plugin_name: windows.plugin
1307 module_name: PerflibHyperV
@@ -1637,7 +1721,7 @@ modules:
1721 1. **Create Monitoring User**
1722
1723 Create an SQL Server user with the necessary permissions to collect monitoring data:
1640 -
1724 +
1725 ```tsql
1726 USE master;
1727 CREATE LOGIN netdata_user WITH PASSWORD = '1ReallyStrongPasswordShouldBeInsertedHere';
@@ -1650,13 +1734,13 @@ modules:
1734 2. **Enable Query Store**
1735
1736 Enable the [Query Store](https://learn.microsoft.com/en-us/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store?view=sql-server-ver16) and grant access to the monitoring user on all relevant databases:
1653 -
1737 +
1738 ```tsql
1739 DECLARE @dbname NVARCHAR(max)
1740 DECLARE nd_user_cursor CURSOR FOR SELECT name
1741 FROM master.dbo.sysdatabases
1742 WHERE name NOT IN ('master', 'tempdb')
1659 -
1743 +
1744 OPEN nd_user_cursor
1745 FETCH NEXT FROM nd_user_cursor INTO @dbname
1746 WHILE @@FETCH_STATUS = 0
src/collectors/windows.plugin/perflib-web-service.c
+687 -2
@@ -93,6 +93,67 @@ struct web_service {
93 COUNTER_DATA IISRequestsOther;
94 };
95
96 +struct ws3svc_w3wp_data {
97 + RRDSET *st_wescv_w3wp_active_threads;
98 + RRDDIM *rd_wescv_w3wp_active_threads;
99 +
100 + RRDSET *st_wescv_w3wp_requests_total;
101 + RRDDIM *rd_wescv_w3wp_requests_total;
102 +
103 + RRDSET *st_wescv_w3wp_requests_active;
104 + RRDDIM *rd_wescv_w3wp_requests_active;
105 +
106 + RRDSET *st_wescv_w3wp_file_cache_mem_usage;
107 + RRDDIM *rd_wescv_w3wp_file_cache_mem_usage;
108 +
109 + RRDSET *st_wescv_w3wp_files_cache_total;
110 + RRDDIM *rd_wescv_w3wp_files_cache_total;
111 +
112 + RRDSET *st_wescv_w3wp_files_flushed_total;
113 + RRDDIM *rd_wescv_w3wp_files_flushed_total;
114 +
115 + RRDSET *st_wescv_w3wp_uri_cache_flushed;
116 + RRDDIM *rd_wescv_w3wp_uri_cache_flushed;
117 +
118 + RRDSET *st_wescv_w3wp_total_uri_cached;
119 + RRDDIM *rd_wescv_w3wp_total_uri_cached;
120 +
121 + RRDSET *st_wescv_w3wp_total_metadata_cache;
122 + RRDDIM *rd_wescv_w3wp_total_metadata_cache;
123 +
124 + RRDSET *st_wescv_w3wp_total_metadata_flushed;
125 + RRDDIM *rd_wescv_w3wp_total_metadata_flushed;
126 +
127 + RRDSET *st_wescv_w3wp_output_cache_active_flushed_items;
128 + RRDDIM *rd_wescv_w3wp_output_cache_active_flushed_items;
129 +
130 + RRDSET *st_wescv_w3wp_output_cache_memory_usage;
131 + RRDDIM *rd_wescv_w3wp_output_cache_memory_usage;
132 +
133 + RRDSET *st_wescv_w3wp_output_cache_flushed_total;
134 + RRDDIM *rd_wescv_w3wp_output_cache_flushed_total;
135 +
136 + COUNTER_DATA WESCVW3WPActiveThreads;
137 +
138 + COUNTER_DATA WESCVW3WPRequestTotal;
139 + COUNTER_DATA WESCVW3WPRequestActive;
140 +
141 + COUNTER_DATA WESCVW3WPFileCacheMemUsage;
142 +
143 + COUNTER_DATA WESCVW3WPFilesCachedTotal;
144 + COUNTER_DATA WESCVW3WPFilesFlushedTotal;
145 +
146 + COUNTER_DATA WESCVW3WPURICachedFlushed;
147 + COUNTER_DATA WESCVW3WPTotalURICached;
148 +
149 + COUNTER_DATA WESCVW3WPTotalMetadataCached;
150 + COUNTER_DATA WESCVW3WPTotalMetadataFlushed;
151 +
152 + COUNTER_DATA WESCVW3WPOutputCacheActiveFlushedItens;
153 + COUNTER_DATA WESCVW3WPOutputCacheMemoryUsage;
154 + COUNTER_DATA WESCVW3WPOutputCacheFlushesTotal;
155 +};
156 +
157 // AD information
158 struct iis_app {
159 RRDSET *st_app_current_application_pool_state;
@@ -208,8 +269,38 @@ void dict_app_pool_insert_cb(const DICTIONARY_ITEM *item __maybe_unused, void *v
269 initialize_app_pool_keys(p);
270 }
271
272 +static inline void initialize_w3svc_w3wp_keys(struct ws3svc_w3wp_data *p)
273 +{
274 + p->WESCVW3WPActiveThreads.key = "Active Threads Count";
275 +
276 + p->WESCVW3WPRequestTotal.key = "Total HTTP Requests Served";
277 + p->WESCVW3WPRequestActive.key = "Active Requests";
278 +
279 + p->WESCVW3WPFileCacheMemUsage.key = "Current File Cache Memory Usage";
280 +
281 + p->WESCVW3WPFilesCachedTotal.key = "Total Files Cached";
282 + p->WESCVW3WPFilesFlushedTotal.key = "Total Flushed Files";
283 +
284 + p->WESCVW3WPURICachedFlushed.key = "Total Flushed URIs";
285 + p->WESCVW3WPTotalURICached.key = "Total URIs Cached";
286 +
287 + p->WESCVW3WPTotalMetadataCached.key = "Total Metadata Cached";
288 + p->WESCVW3WPTotalMetadataFlushed.key = "Total Flushed Metadata";
289 +
290 + p->WESCVW3WPOutputCacheActiveFlushedItens.key = "Output Cache Current Flushed Items";
291 + p->WESCVW3WPOutputCacheMemoryUsage.key = "Output Cache Current Memory Usage";
292 + p->WESCVW3WPOutputCacheFlushesTotal.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 {
@@ -224,6 +315,11 @@ static void initialize(void)
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(
@@ -1281,7 +1377,594 @@ static int iis_web_service(char *name, int update_every, typeof(bool(PERF_DATA_B
1377 return 0;
1378 }
1379
1284 -int do_PerflibWebService(int update_every, usec_t dt __maybe_unused)
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->WESCVW3WPActiveThreads)) {
1389 + if (!p->st_wescv_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_wescv_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_wescv_w3wp_active_threads =
1408 + rrddim_add(p->st_wescv_w3wp_active_threads, "active", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1409 + rrdlabels_add(p->st_wescv_w3wp_active_threads->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1410 + }
1411 +
1412 + rrddim_set_by_pointer(
1413 + p->st_wescv_w3wp_active_threads,
1414 + p->rd_wescv_w3wp_active_threads,
1415 + (collected_number)p->WESCVW3WPActiveThreads.current.Data);
1416 +
1417 + rrdset_done(p->st_wescv_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->WESCVW3WPRequestTotal)) {
1430 + if (!p->st_wescv_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_wescv_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_wescv_w3wp_requests_total =
1449 + rrddim_add(p->st_wescv_w3wp_requests_total, "requests", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1450 + rrdlabels_add(p->st_wescv_w3wp_requests_total->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1451 + }
1452 +
1453 + rrddim_set_by_pointer(
1454 + p->st_wescv_w3wp_requests_total,
1455 + p->rd_wescv_w3wp_requests_total,
1456 + (collected_number)p->WESCVW3WPRequestTotal.current.Data);
1457 +
1458 + rrdset_done(p->st_wescv_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->WESCVW3WPRequestActive)) {
1471 + if (!p->st_wescv_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_wescv_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_wescv_w3wp_requests_active =
1490 + rrddim_add(p->st_wescv_w3wp_requests_active, "active", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1491 + rrdlabels_add(p->st_wescv_w3wp_requests_active->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1492 + }
1493 +
1494 + rrddim_set_by_pointer(
1495 + p->st_wescv_w3wp_requests_active,
1496 + p->rd_wescv_w3wp_requests_active,
1497 + (collected_number)p->WESCVW3WPRequestActive.current.Data);
1498 +
1499 + rrdset_done(p->st_wescv_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->WESCVW3WPFileCacheMemUsage)) {
1512 + if (!p->st_wescv_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", windows_shared_buffer);
1515 + netdata_fix_chart_name(id);
1516 + p->st_wescv_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_wescv_w3wp_file_cache_mem_usage =
1531 + rrddim_add(p->st_wescv_w3wp_file_cache_mem_usage, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1532 + rrdlabels_add(p->st_wescv_w3wp_file_cache_mem_usage->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1533 + }
1534 +
1535 + rrddim_set_by_pointer(
1536 + p->st_wescv_w3wp_file_cache_mem_usage,
1537 + p->rd_wescv_w3wp_file_cache_mem_usage,
1538 + (collected_number)p->WESCVW3WPFileCacheMemUsage.current.Data);
1539 +
1540 + rrdset_done(p->st_wescv_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->WESCVW3WPFilesCachedTotal)) {
1553 + if (!p->st_wescv_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_wescv_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_wescv_w3wp_files_cache_total =
1572 + rrddim_add(p->st_wescv_w3wp_files_cache_total, "cached_files", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1573 + rrdlabels_add(p->st_wescv_w3wp_files_cache_total->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1574 + }
1575 +
1576 + rrddim_set_by_pointer(
1577 + p->st_wescv_w3wp_files_cache_total,
1578 + p->rd_wescv_w3wp_files_cache_total,
1579 + (collected_number)p->WESCVW3WPFilesCachedTotal.current.Data);
1580 +
1581 + rrdset_done(p->st_wescv_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->WESCVW3WPFilesFlushedTotal)) {
1594 + if (!p->st_wescv_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_wescv_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_wescv_w3wp_files_flushed_total =
1613 + rrddim_add(p->st_wescv_w3wp_files_flushed_total, "file_handles", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1614 + rrdlabels_add(p->st_wescv_w3wp_files_flushed_total->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1615 + }
1616 +
1617 + rrddim_set_by_pointer(
1618 + p->st_wescv_w3wp_files_flushed_total,
1619 + p->rd_wescv_w3wp_files_flushed_total,
1620 + (collected_number)p->WESCVW3WPFilesFlushedTotal.current.Data);
1621 +
1622 + rrdset_done(p->st_wescv_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->WESCVW3WPURICachedFlushed)) {
1635 + if (!p->st_wescv_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_wescv_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_wescv_w3wp_uri_cache_flushed =
1654 + rrddim_add(p->st_wescv_w3wp_uri_cache_flushed, "cached_uris", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1655 + rrdlabels_add(p->st_wescv_w3wp_uri_cache_flushed->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1656 + }
1657 +
1658 + rrddim_set_by_pointer(
1659 + p->st_wescv_w3wp_uri_cache_flushed,
1660 + p->rd_wescv_w3wp_uri_cache_flushed,
1661 + (collected_number)p->WESCVW3WPURICachedFlushed.current.Data);
1662 +
1663 + rrdset_done(p->st_wescv_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->WESCVW3WPTotalURICached)) {
1676 + if (!p->st_wescv_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_wescv_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_wescv_w3wp_total_uri_cached =
1695 + rrddim_add(p->st_wescv_w3wp_total_uri_cached, "uri_cache_blocks", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1696 + rrdlabels_add(p->st_wescv_w3wp_total_uri_cached->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1697 + }
1698 +
1699 + rrddim_set_by_pointer(
1700 + p->st_wescv_w3wp_total_uri_cached,
1701 + p->rd_wescv_w3wp_total_uri_cached,
1702 + (collected_number)p->WESCVW3WPTotalURICached.current.Data);
1703 +
1704 + rrdset_done(p->st_wescv_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->WESCVW3WPTotalMetadataCached)) {
1717 + if (!p->st_wescv_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_wescv_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_wescv_w3wp_total_metadata_cache =
1736 + rrddim_add(p->st_wescv_w3wp_total_metadata_cache, "metadata_blocks", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1737 + rrdlabels_add(p->st_wescv_w3wp_total_metadata_cache->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1738 + }
1739 +
1740 + rrddim_set_by_pointer(
1741 + p->st_wescv_w3wp_total_metadata_cache,
1742 + p->rd_wescv_w3wp_total_metadata_cache,
1743 + (collected_number)p->WESCVW3WPTotalMetadataCached.current.Data);
1744 +
1745 + rrdset_done(p->st_wescv_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->WESCVW3WPTotalMetadataFlushed)) {
1758 + if (!p->st_wescv_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_wescv_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_wescv_w3wp_total_metadata_flushed =
1777 + rrddim_add(p->st_wescv_w3wp_total_metadata_flushed, "metadata_blocks", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1778 + rrdlabels_add(p->st_wescv_w3wp_total_metadata_flushed->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1779 + }
1780 +
1781 + rrddim_set_by_pointer(
1782 + p->st_wescv_w3wp_total_metadata_flushed,
1783 + p->rd_wescv_w3wp_total_metadata_flushed,
1784 + (collected_number)p->WESCVW3WPTotalMetadataFlushed.current.Data);
1785 +
1786 + rrdset_done(p->st_wescv_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->WESCVW3WPOutputCacheActiveFlushedItens)) {
1799 + if (!p->st_wescv_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_wescv_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_wescv_w3wp_output_cache_active_flushed_items = rrddim_add(
1818 + p->st_wescv_w3wp_output_cache_active_flushed_items, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1819 + rrdlabels_add(
1820 + p->st_wescv_w3wp_output_cache_active_flushed_items->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1821 + }
1822 +
1823 + rrddim_set_by_pointer(
1824 + p->st_wescv_w3wp_output_cache_active_flushed_items,
1825 + p->rd_wescv_w3wp_output_cache_active_flushed_items,
1826 + (collected_number)p->WESCVW3WPOutputCacheActiveFlushedItens.current.Data);
1827 +
1828 + rrdset_done(p->st_wescv_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->WESCVW3WPOutputCacheMemoryUsage)) {
1841 + if (!p->st_wescv_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_wescv_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_wescv_w3wp_output_cache_memory_usage =
1860 + rrddim_add(p->st_wescv_w3wp_output_cache_memory_usage, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1861 + rrdlabels_add(p->st_wescv_w3wp_output_cache_memory_usage->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1862 + }
1863 +
1864 + rrddim_set_by_pointer(
1865 + p->st_wescv_w3wp_output_cache_memory_usage,
1866 + p->rd_wescv_w3wp_output_cache_memory_usage,
1867 + (collected_number)p->WESCVW3WPOutputCacheMemoryUsage.current.Data);
1868 +
1869 + rrdset_done(p->st_wescv_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->WESCVW3WPOutputCacheFlushesTotal)) {
1882 + if (!p->st_wescv_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_wescv_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_wescv_w3wp_output_cache_flushed_total = rrddim_add(
1901 + p->st_wescv_w3wp_output_cache_flushed_total, "output_cache_entries", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1902 + rrdlabels_add(p->st_wescv_w3wp_output_cache_flushed_total->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
1903 + }
1904 +
1905 + rrddim_set_by_pointer(
1906 + p->st_wescv_w3wp_output_cache_flushed_total,
1907 + p->rd_wescv_w3wp_output_cache_flushed_total,
1908 + (collected_number)p->WESCVW3WPOutputCacheFlushesTotal.current.Data);
1909 +
1910 + rrdset_done(p->st_wescv_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
@@ -1291,11 +1974,13 @@ int do_PerflibWebService(int update_every, usec_t dt __maybe_unused)
1974 }
1975
1976 int ret = 0;
1294 -#define TOTAL_NUMBER_OF_FAILURES (2)
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 }
src/collectors/windows.plugin/windows_plugin.h
+14
@@ -60,6 +60,20 @@ enum PERFLIB_PRIO {
60 PRIO_IIS_APP_POOL_TOTAL_WORKER_PROCESS_STARTUP_FAILURES,
61 PRIO_IIS_APP_POOL_TOTAL_UPTIME,
62
63 + PRIO_W3SVC_W3WP_ACTIVE_THREADS,
64 + PRIO_W3SVC_W3WP_REQUESTS_TOTAL,
65 + PRIO_W3SVC_W3WP_REQUESTS_ACTIVE,
66 + PRIO_W3SVC_W3WP_FILE_CACHE_MEM_USAGE,
67 + PRIO_W3SVC_W3WP_FILE_CACHE_TOTAL,
68 + PRIO_W3SVC_W3WP_FILE_FLUSHED_TOTAL,
69 + PRIO_W3SVC_W3WP_URI_FLUSHED_TOTAL,
70 + PRIO_W3SVC_W3WP_URI_CACHED_TOTAL,
71 + PRIO_W3SVC_W3WP_METADATA_CACHED,
72 + PRIO_W3SVC_W3WP_METADATA_FLUSHED,
73 + PRIO_W3SVC_W3WP_OUTPUT_CACHE_ACTIVE_FLUSH,
74 + PRIO_W3SVC_W3WP_OUTPUT_CACHE_MEMORY_USAGE,
75 + PRIO_W3SVC_W3WP_OUTPUT_CACHE_FLUSHED_TOTAL,
76 +
77 PRIO_MSSQL_USER_CONNECTIONS,
78
79 PRIO_MSSQL_DATABASE_TRANSACTIONS,
src/go/qq.md