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,