Repository: netdata/netdata
Pull request #20245: IIS W3SCV W3MP Metrics (windows.plugin)
Author: login: thiagoftsm
Labels: name: area/docs
name: area/collectors
description: Everything related to data collection
name: collectors/go.d
name: area/metadata
description: Integrations metadata
name: area/go
name: collectors/windows
Created: 2025-05-07T03:05:17Z | Merged: 2025-05-20T17:47:39Z

##### Summary
This PR brings new metrics to IIS. The main goal of these metrics are to monitor specific applications.

Finish implementation of https://github.com/netdata/netdata/issues/19911

##### Test Plan

1. Compile this Branch
2. Install it on host with IIS/Exchange.

##### Additional Information
This PR was tested on the following scenarios:

| Windows Version | Have Metrics | Additional information|
|---------------------------|---------------------|----------------------------------|
|Windows 11            | No                    |                                           |
|Windows 2022        | Yes                   | We have Exchange installed|
|Windows 2019        | No                     |              |

<details> <summary>For users: How does this change affect me?</summary>
  <!--
Describe the PR affects users: 
- Which area of Netdata is affected by the change?
- Can they see the change or is it an under the hood? If they can see it, where?
- How is the user impacted by the change? 
- What are there any benefits of the change? 
-->
</details>



Diff:
diff --git a/src/collectors/windows.plugin/metadata.yaml b/src/collectors/windows.plugin/metadata.yaml
index 9408f59651bb02..2111dd29e72c20 100644
--- a/src/collectors/windows.plugin/metadata.yaml
+++ b/src/collectors/windows.plugin/metadata.yaml
@@ -1218,6 +1218,90 @@ modules:
               chart_type: line
               dimensions:
                 - name: uptime
+        - name: IIS W3SCV W3MP
+          description: "These metrics refer to the World Wide Web Publishing Service, the service responsible for hosting and serving web content."
+          labels:
+            - name: app
+              description: Application name.
+          metrics:
+            - name: iis.w3svc_w3wp_active_threads
+              description: Threads actively processing requests in the worker process
+              unit: "threads"
+              chart_type: line
+              dimensions:
+                - name: threads
+            - name: iis.w3svc_w3wp_requests_total
+              description: HTTP requests served by the worker process
+              unit: "requests/s"
+              chart_type: line
+              dimensions:
+                - name: requests
+            - name: iis.w3svc_w3wp_requests_active
+              description: Current number of requests being processed by the worker process
+              unit: "requests"
+              chart_type: line
+              dimensions:
+                - name: requests
+            - name: iis.w3svc_w3wp_file_cache_mem_usage
+              description: Current memory usage by the worker process
+              unit: "bytes"
+              chart_type: area
+              dimensions:
+                - name: used
+            - name: iis.w3svc_w3wp_files_cache_total
+              description: Files whose contents were ever added to the cache
+              unit: "files/s"
+              chart_type: line
+              dimensions:
+                - name: cached_files
+            - name: iis.w3svc_w3wp_files_flushed_total
+              description: File handles that have been removed from the cache
+              unit: "flushes/s"
+              chart_type: line
+              dimensions:
+                - name: file_handles
+            - name: iis.w3svc_w3wp_uri_cache_flushed
+              description: URI cache flushes
+              unit: "flushes/s"
+              chart_type: line
+              dimensions:
+                - name: cached_uris
+            - name: iis.w3svc_w3wp_total_uri_cached
+              description: URI information blocks added to the cache
+              unit: "blocks/s"
+              chart_type: line
+              dimensions:
+                - name: uri_cache_blocks
+            - name: iis.w3svc_w3wp_total_metadata_cached
+              description: Metadata information blocks added to the user-mode cache
+              unit: "blocks/s"
+              chart_type: line
+              dimensions:
+                - name: metadata_blocks
+            - name: iis.w3svc_w3wp_total_metadata_flushed
+              description: User-mode metadata cache flushes
+              unit: "flushes/s"
+              chart_type: line
+              dimensions:
+                - name: metadata_blocks
+            - name: iis.w3svc_w3wp_output_cache_active_flushed_items
+              description: Items flushed but still in memory for active responses
+              unit: "items"
+              chart_type: line
+              dimensions:
+                - name: used
+            - name: iis.w3svc_w3wp_output_cache_memory_usage
+              description: Current number of bytes used by output cache
+              unit: "bytes"
+              chart_type: area
+              dimensions:
+                - name: used
+            - name: iis.w3svc_w3wp_output_cache_flushed_total
+              description: Flushes of output cache
+              unit: "flushes"
+              chart_type: line
+              dimensions:
+                - name: output_cache_entries
   - meta:
       plugin_name: windows.plugin
       module_name: PerflibHyperV
@@ -1637,7 +1721,7 @@ modules:
               1. **Create Monitoring User**
               
                  Create an SQL Server user with the necessary permissions to collect monitoring data:
-                 
+
                  ```tsql
                  USE master;
                  CREATE LOGIN netdata_user WITH PASSWORD = '1ReallyStrongPasswordShouldBeInsertedHere';
@@ -1650,13 +1734,13 @@ modules:
               2. **Enable Query Store**
               
                  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:
-                 
+
                  ```tsql
                  DECLARE @dbname NVARCHAR(max)
                  DECLARE nd_user_cursor CURSOR FOR SELECT name
                                      FROM master.dbo.sysdatabases
                                      WHERE name NOT IN ('master', 'tempdb')
-                 
+
                  OPEN nd_user_cursor
                  FETCH NEXT FROM nd_user_cursor INTO @dbname
                  WHILE @@FETCH_STATUS = 0
diff --git a/src/collectors/windows.plugin/perflib-web-service.c b/src/collectors/windows.plugin/perflib-web-service.c
index a9dac7954343ea..e61f44f85545db 100644
--- a/src/collectors/windows.plugin/perflib-web-service.c
+++ b/src/collectors/windows.plugin/perflib-web-service.c
@@ -93,6 +93,67 @@ struct web_service {
     COUNTER_DATA IISRequestsOther;
 };
 
+struct ws3svc_w3wp_data {
+    RRDSET *st_wescv_w3wp_active_threads;
+    RRDDIM *rd_wescv_w3wp_active_threads;
+
+    RRDSET *st_wescv_w3wp_requests_total;
+    RRDDIM *rd_wescv_w3wp_requests_total;
+
+    RRDSET *st_wescv_w3wp_requests_active;
+    RRDDIM *rd_wescv_w3wp_requests_active;
+
+    RRDSET *st_wescv_w3wp_file_cache_mem_usage;
+    RRDDIM *rd_wescv_w3wp_file_cache_mem_usage;
+
+    RRDSET *st_wescv_w3wp_files_cache_total;
+    RRDDIM *rd_wescv_w3wp_files_cache_total;
+
+    RRDSET *st_wescv_w3wp_files_flushed_total;
+    RRDDIM *rd_wescv_w3wp_files_flushed_total;
+
+    RRDSET *st_wescv_w3wp_uri_cache_flushed;
+    RRDDIM *rd_wescv_w3wp_uri_cache_flushed;
+
+    RRDSET *st_wescv_w3wp_total_uri_cached;
+    RRDDIM *rd_wescv_w3wp_total_uri_cached;
+
+    RRDSET *st_wescv_w3wp_total_metadata_cache;
+    RRDDIM *rd_wescv_w3wp_total_metadata_cache;
+
+    RRDSET *st_wescv_w3wp_total_metadata_flushed;
+    RRDDIM *rd_wescv_w3wp_total_metadata_flushed;
+
+    RRDSET *st_wescv_w3wp_output_cache_active_flushed_items;
+    RRDDIM *rd_wescv_w3wp_output_cache_active_flushed_items;
+
+    RRDSET *st_wescv_w3wp_output_cache_memory_usage;
+    RRDDIM *rd_wescv_w3wp_output_cache_memory_usage;
+
+    RRDSET *st_wescv_w3wp_output_cache_flushed_total;
+    RRDDIM *rd_wescv_w3wp_output_cache_flushed_total;
+
+    COUNTER_DATA WESCVW3WPActiveThreads;
+
+    COUNTER_DATA WESCVW3WPRequestTotal;
+    COUNTER_DATA WESCVW3WPRequestActive;
+
+    COUNTER_DATA WESCVW3WPFileCacheMemUsage;
+
+    COUNTER_DATA WESCVW3WPFilesCachedTotal;
+    COUNTER_DATA WESCVW3WPFilesFlushedTotal;
+
+    COUNTER_DATA WESCVW3WPURICachedFlushed;
+    COUNTER_DATA WESCVW3WPTotalURICached;
+
+    COUNTER_DATA WESCVW3WPTotalMetadataCached;
+    COUNTER_DATA WESCVW3WPTotalMetadataFlushed;
+
+    COUNTER_DATA WESCVW3WPOutputCacheActiveFlushedItens;
+    COUNTER_DATA WESCVW3WPOutputCacheMemoryUsage;
+    COUNTER_DATA WESCVW3WPOutputCacheFlushesTotal;
+};
+
 // AD information
 struct iis_app {
     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
     initialize_app_pool_keys(p);
 }
 
+static inline void initialize_w3svc_w3wp_keys(struct ws3svc_w3wp_data *p)
+{
+    p->WESCVW3WPActiveThreads.key = "Active Threads Count";
+
+    p->WESCVW3WPRequestTotal.key = "Total HTTP Requests Served";
+    p->WESCVW3WPRequestActive.key = "Active Requests";
+
+    p->WESCVW3WPFileCacheMemUsage.key = "Current File Cache Memory Usage";
+
+    p->WESCVW3WPFilesCachedTotal.key = "Total Files Cached";
+    p->WESCVW3WPFilesFlushedTotal.key = "Total Flushed Files";
+
+    p->WESCVW3WPURICachedFlushed.key = "Total Flushed URIs";
+    p->WESCVW3WPTotalURICached.key = "Total URIs Cached";
+
+    p->WESCVW3WPTotalMetadataCached.key = "Total Metadata Cached";
+    p->WESCVW3WPTotalMetadataFlushed.key = "Total Flushed Metadata";
+
+    p->WESCVW3WPOutputCacheActiveFlushedItens.key = "Output Cache Current Flushed Items";
+    p->WESCVW3WPOutputCacheMemoryUsage.key = "Output Cache Current Memory Usage";
+    p->WESCVW3WPOutputCacheFlushesTotal.key = "Output Cache Total Flushes";
+}
+
+void dict_wesvc_w3wp_insert_cb(const DICTIONARY_ITEM *item __maybe_unused, void *value, void *data __maybe_unused)
+{
+    struct ws3svc_w3wp_data *p = value;
+    initialize_w3svc_w3wp_keys(p);
+}
+
 static DICTIONARY *web_services = NULL;
 static DICTIONARY *app_pools = NULL;
+static DICTIONARY *w3svc_w3wp_service = NULL;
 
 static void initialize(void)
 {
@@ -224,6 +315,11 @@ static void initialize(void)
         DICT_OPTION_DONT_OVERWRITE_VALUE | DICT_OPTION_FIXED_SIZE, NULL, sizeof(struct iis_app));
 
     dictionary_register_insert_callback(app_pools, dict_app_pool_insert_cb, NULL);
+
+    w3svc_w3wp_service = dictionary_create_advanced(
+        DICT_OPTION_DONT_OVERWRITE_VALUE | DICT_OPTION_FIXED_SIZE, NULL, sizeof(struct ws3svc_w3wp_data));
+
+    dictionary_register_insert_callback(w3svc_w3wp_service, dict_wesvc_w3wp_insert_cb, NULL);
 }
 
 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
     return 0;
 }
 
-int do_PerflibWebService(int update_every, usec_t dt __maybe_unused)
+static inline void w3svc_w3wp_active_threads(
+    struct ws3svc_w3wp_data *p,
+    PERF_DATA_BLOCK *pDataBlock,
+    PERF_OBJECT_TYPE *pObjectType,
+    PERF_INSTANCE_DEFINITION *pi,
+    int update_every,
+    char *app_name)
+{
+    if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->WESCVW3WPActiveThreads)) {
+        if (!p->st_wescv_w3wp_active_threads) {
+            char id[RRD_ID_LENGTH_MAX + 1];
+            snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_active_threads", app_name);
+            netdata_fix_chart_name(id);
+            p->st_wescv_w3wp_active_threads = rrdset_create_localhost(
+                "iis",
+                id,
+                NULL,
+                "w3svc w3wp",
+                "iis.w3svc_w3wp_active_threads",
+                "Threads actively processing requests in the worker process",
+                "threads",
+                PLUGIN_WINDOWS_NAME,
+                "PerflibWebService",
+                PRIO_W3SVC_W3WP_ACTIVE_THREADS,
+                update_every,
+                RRDSET_TYPE_LINE);
+
+            p->rd_wescv_w3wp_active_threads =
+                rrddim_add(p->st_wescv_w3wp_active_threads, "active", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
+            rrdlabels_add(p->st_wescv_w3wp_active_threads->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
+        }
+
+        rrddim_set_by_pointer(
+            p->st_wescv_w3wp_active_threads,
+            p->rd_wescv_w3wp_active_threads,
+            (collected_number)p->WESCVW3WPActiveThreads.current.Data);
+
+        rrdset_done(p->st_wescv_w3wp_active_threads);
+    }
+}
+
+static inline void w3svc_w3wp_requests_total(
+    struct ws3svc_w3wp_data *p,
+    PERF_DATA_BLOCK *pDataBlock,
+    PERF_OBJECT_TYPE *pObjectType,
+    PERF_INSTANCE_DEFINITION *pi,
+    int update_every,
+    char *app_name)
+{
+    if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->WESCVW3WPRequestTotal)) {
+        if (!p->st_wescv_w3wp_requests_total) {
+            char id[RRD_ID_LENGTH_MAX + 1];
+            snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_requests_total", app_name);
+            netdata_fix_chart_name(id);
+            p->st_wescv_w3wp_requests_total = rrdset_create_localhost(
+                "iis",
+                id,
+                NULL,
+                "w3svc w3wp",
+                "iis.w3svc_w3wp_requests_total",
+                "HTTP requests served by the worker process.",
+                "requests/s",
+                PLUGIN_WINDOWS_NAME,
+                "PerflibWebService",
+                PRIO_W3SVC_W3WP_REQUESTS_TOTAL,
+                update_every,
+                RRDSET_TYPE_LINE);
+
+            p->rd_wescv_w3wp_requests_total =
+                rrddim_add(p->st_wescv_w3wp_requests_total, "requests", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
+            rrdlabels_add(p->st_wescv_w3wp_requests_total->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
+        }
+
+        rrddim_set_by_pointer(
+            p->st_wescv_w3wp_requests_total,
+            p->rd_wescv_w3wp_requests_total,
+            (collected_number)p->WESCVW3WPRequestTotal.current.Data);
+
+        rrdset_done(p->st_wescv_w3wp_requests_total);
+    }
+}
+
+static inline void w3svc_w3wp_requests_active(
+    struct ws3svc_w3wp_data *p,
+    PERF_DATA_BLOCK *pDataBlock,
+    PERF_OBJECT_TYPE *pObjectType,
+    PERF_INSTANCE_DEFINITION *pi,
+    int update_every,
+    char *app_name)
+{
+    if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->WESCVW3WPRequestActive)) {
+        if (!p->st_wescv_w3wp_requests_active) {
+            char id[RRD_ID_LENGTH_MAX + 1];
+            snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_requests_active", app_name);
+            netdata_fix_chart_name(id);
+            p->st_wescv_w3wp_requests_active = rrdset_create_localhost(
+                "iis",
+                id,
+                NULL,
+                "w3svc w3wp",
+                "iis.w3svc_w3wp_requests_active",
+                "Current number of requests being processed by the worker process",
+                "requests",
+                PLUGIN_WINDOWS_NAME,
+                "PerflibWebService",
+                PRIO_W3SVC_W3WP_REQUESTS_ACTIVE,
+                update_every,
+                RRDSET_TYPE_LINE);
+
+            p->rd_wescv_w3wp_requests_active =
+                rrddim_add(p->st_wescv_w3wp_requests_active, "active", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
+            rrdlabels_add(p->st_wescv_w3wp_requests_active->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
+        }
+
+        rrddim_set_by_pointer(
+            p->st_wescv_w3wp_requests_active,
+            p->rd_wescv_w3wp_requests_active,
+            (collected_number)p->WESCVW3WPRequestActive.current.Data);
+
+        rrdset_done(p->st_wescv_w3wp_requests_active);
+    }
+}
+
+static inline void w3svc_w3wp_file_cache_mem_usage(
+    struct ws3svc_w3wp_data *p,
+    PERF_DATA_BLOCK *pDataBlock,
+    PERF_OBJECT_TYPE *pObjectType,
+    PERF_INSTANCE_DEFINITION *pi,
+    int update_every,
+    char *app_name)
+{
+    if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->WESCVW3WPFileCacheMemUsage)) {
+        if (!p->st_wescv_w3wp_file_cache_mem_usage) {
+            char id[RRD_ID_LENGTH_MAX + 1];
+            snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_file_cache_mem_usage", windows_shared_buffer);
+            netdata_fix_chart_name(id);
+            p->st_wescv_w3wp_file_cache_mem_usage = rrdset_create_localhost(
+                "iis",
+                id,
+                NULL,
+                "w3svc w3wp",
+                "iis.w3svc_w3wp_file_cache_mem_usage",
+                "Current memory usage by the worker process.",
+                "bytes",
+                PLUGIN_WINDOWS_NAME,
+                "PerflibWebService",
+                PRIO_W3SVC_W3WP_FILE_CACHE_MEM_USAGE,
+                update_every,
+                RRDSET_TYPE_AREA);
+
+            p->rd_wescv_w3wp_file_cache_mem_usage =
+                rrddim_add(p->st_wescv_w3wp_file_cache_mem_usage, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
+            rrdlabels_add(p->st_wescv_w3wp_file_cache_mem_usage->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
+        }
+
+        rrddim_set_by_pointer(
+            p->st_wescv_w3wp_file_cache_mem_usage,
+            p->rd_wescv_w3wp_file_cache_mem_usage,
+            (collected_number)p->WESCVW3WPFileCacheMemUsage.current.Data);
+
+        rrdset_done(p->st_wescv_w3wp_file_cache_mem_usage);
+    }
+}
+
+static inline void w3svc_w3wp_files_cached_total(
+    struct ws3svc_w3wp_data *p,
+    PERF_DATA_BLOCK *pDataBlock,
+    PERF_OBJECT_TYPE *pObjectType,
+    PERF_INSTANCE_DEFINITION *pi,
+    int update_every,
+    char *app_name)
+{
+    if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->WESCVW3WPFilesCachedTotal)) {
+        if (!p->st_wescv_w3wp_files_cache_total) {
+            char id[RRD_ID_LENGTH_MAX + 1];
+            snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_files_cache_total", app_name);
+            netdata_fix_chart_name(id);
+            p->st_wescv_w3wp_files_cache_total = rrdset_create_localhost(
+                "iis",
+                id,
+                NULL,
+                "w3svc w3wp",
+                "iis.w3svc_w3wp_files_cache_total",
+                "Files whose contents were ever added to the cache",
+                "files/s",
+                PLUGIN_WINDOWS_NAME,
+                "PerflibWebService",
+                PRIO_W3SVC_W3WP_FILE_CACHE_TOTAL,
+                update_every,
+                RRDSET_TYPE_LINE);
+
+            p->rd_wescv_w3wp_files_cache_total =
+                rrddim_add(p->st_wescv_w3wp_files_cache_total, "cached_files", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
+            rrdlabels_add(p->st_wescv_w3wp_files_cache_total->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
+        }
+
+        rrddim_set_by_pointer(
+            p->st_wescv_w3wp_files_cache_total,
+            p->rd_wescv_w3wp_files_cache_total,
+            (collected_number)p->WESCVW3WPFilesCachedTotal.current.Data);
+
+        rrdset_done(p->st_wescv_w3wp_files_cache_total);
+    }
+}
+
+static inline void w3svc_w3wp_files_flushed_total(
+    struct ws3svc_w3wp_data *p,
+    PERF_DATA_BLOCK *pDataBlock,
+    PERF_OBJECT_TYPE *pObjectType,
+    PERF_INSTANCE_DEFINITION *pi,
+    int update_every,
+    char *app_name)
+{
+    if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->WESCVW3WPFilesFlushedTotal)) {
+        if (!p->st_wescv_w3wp_files_flushed_total) {
+            char id[RRD_ID_LENGTH_MAX + 1];
+            snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_files_flushed_total", app_name);
+            netdata_fix_chart_name(id);
+            p->st_wescv_w3wp_files_flushed_total = rrdset_create_localhost(
+                "iis",
+                id,
+                NULL,
+                "w3svc w3wp",
+                "iis.w3svc_w3wp_files_flushed_total",
+                "File handles that have been removed from the cache",
+                "flushes/s",
+                PLUGIN_WINDOWS_NAME,
+                "PerflibWebService",
+                PRIO_W3SVC_W3WP_FILE_FLUSHED_TOTAL,
+                update_every,
+                RRDSET_TYPE_LINE);
+
+            p->rd_wescv_w3wp_files_flushed_total =
+                rrddim_add(p->st_wescv_w3wp_files_flushed_total, "file_handles", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
+            rrdlabels_add(p->st_wescv_w3wp_files_flushed_total->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
+        }
+
+        rrddim_set_by_pointer(
+            p->st_wescv_w3wp_files_flushed_total,
+            p->rd_wescv_w3wp_files_flushed_total,
+            (collected_number)p->WESCVW3WPFilesFlushedTotal.current.Data);
+
+        rrdset_done(p->st_wescv_w3wp_files_flushed_total);
+    }
+}
+
+static inline void w3svc_w3wp_uri_cached_flushed(
+    struct ws3svc_w3wp_data *p,
+    PERF_DATA_BLOCK *pDataBlock,
+    PERF_OBJECT_TYPE *pObjectType,
+    PERF_INSTANCE_DEFINITION *pi,
+    int update_every,
+    char *app_name)
+{
+    if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->WESCVW3WPURICachedFlushed)) {
+        if (!p->st_wescv_w3wp_uri_cache_flushed) {
+            char id[RRD_ID_LENGTH_MAX + 1];
+            snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_uri_cache_flushed", app_name);
+            netdata_fix_chart_name(id);
+            p->st_wescv_w3wp_uri_cache_flushed = rrdset_create_localhost(
+                "iis",
+                id,
+                NULL,
+                "w3svc w3wp",
+                "iis.w3svc_w3wp_uri_cache_flushed",
+                "URI cache flushes",
+                "flushes/s",
+                PLUGIN_WINDOWS_NAME,
+                "PerflibWebService",
+                PRIO_W3SVC_W3WP_URI_FLUSHED_TOTAL,
+                update_every,
+                RRDSET_TYPE_LINE);
+
+            p->rd_wescv_w3wp_uri_cache_flushed =
+                rrddim_add(p->st_wescv_w3wp_uri_cache_flushed, "cached_uris", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
+            rrdlabels_add(p->st_wescv_w3wp_uri_cache_flushed->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
+        }
+
+        rrddim_set_by_pointer(
+            p->st_wescv_w3wp_uri_cache_flushed,
+            p->rd_wescv_w3wp_uri_cache_flushed,
+            (collected_number)p->WESCVW3WPURICachedFlushed.current.Data);
+
+        rrdset_done(p->st_wescv_w3wp_uri_cache_flushed);
+    }
+}
+
+static inline void w3svc_w3wp_total_uri_cached(
+    struct ws3svc_w3wp_data *p,
+    PERF_DATA_BLOCK *pDataBlock,
+    PERF_OBJECT_TYPE *pObjectType,
+    PERF_INSTANCE_DEFINITION *pi,
+    int update_every,
+    char *app_name)
+{
+    if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->WESCVW3WPTotalURICached)) {
+        if (!p->st_wescv_w3wp_total_uri_cached) {
+            char id[RRD_ID_LENGTH_MAX + 1];
+            snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_total_uri_cached", app_name);
+            netdata_fix_chart_name(id);
+            p->st_wescv_w3wp_total_uri_cached = rrdset_create_localhost(
+                "iis",
+                id,
+                NULL,
+                "w3svc w3wp",
+                "iis.w3svc_w3wp_total_uri_cached",
+                "URI information blocks added to the cache",
+                "blocks/s",
+                PLUGIN_WINDOWS_NAME,
+                "PerflibWebService",
+                PRIO_W3SVC_W3WP_URI_CACHED_TOTAL,
+                update_every,
+                RRDSET_TYPE_LINE);
+
+            p->rd_wescv_w3wp_total_uri_cached =
+                rrddim_add(p->st_wescv_w3wp_total_uri_cached, "uri_cache_blocks", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
+            rrdlabels_add(p->st_wescv_w3wp_total_uri_cached->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
+        }
+
+        rrddim_set_by_pointer(
+            p->st_wescv_w3wp_total_uri_cached,
+            p->rd_wescv_w3wp_total_uri_cached,
+            (collected_number)p->WESCVW3WPTotalURICached.current.Data);
+
+        rrdset_done(p->st_wescv_w3wp_total_uri_cached);
+    }
+}
+
+static inline void w3svc_w3wp_total_metadata_cached(
+    struct ws3svc_w3wp_data *p,
+    PERF_DATA_BLOCK *pDataBlock,
+    PERF_OBJECT_TYPE *pObjectType,
+    PERF_INSTANCE_DEFINITION *pi,
+    int update_every,
+    char *app_name)
+{
+    if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->WESCVW3WPTotalMetadataCached)) {
+        if (!p->st_wescv_w3wp_total_metadata_cache) {
+            char id[RRD_ID_LENGTH_MAX + 1];
+            snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_total_metadata_cache", app_name);
+            netdata_fix_chart_name(id);
+            p->st_wescv_w3wp_total_metadata_cache = rrdset_create_localhost(
+                "iis",
+                id,
+                NULL,
+                "w3svc w3wp",
+                "iis.w3svc_w3wp_total_metadata_cached",
+                "Metadata information blocks added to the user-mode cache",
+                "blocks/s",
+                PLUGIN_WINDOWS_NAME,
+                "PerflibWebService",
+                PRIO_W3SVC_W3WP_METADATA_CACHED,
+                update_every,
+                RRDSET_TYPE_LINE);
+
+            p->rd_wescv_w3wp_total_metadata_cache =
+                rrddim_add(p->st_wescv_w3wp_total_metadata_cache, "metadata_blocks", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
+            rrdlabels_add(p->st_wescv_w3wp_total_metadata_cache->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
+        }
+
+        rrddim_set_by_pointer(
+            p->st_wescv_w3wp_total_metadata_cache,
+            p->rd_wescv_w3wp_total_metadata_cache,
+            (collected_number)p->WESCVW3WPTotalMetadataCached.current.Data);
+
+        rrdset_done(p->st_wescv_w3wp_total_metadata_cache);
+    }
+}
+
+static inline void w3svc_w3wp_total_metadata_flushed(
+    struct ws3svc_w3wp_data *p,
+    PERF_DATA_BLOCK *pDataBlock,
+    PERF_OBJECT_TYPE *pObjectType,
+    PERF_INSTANCE_DEFINITION *pi,
+    int update_every,
+    char *app_name)
+{
+    if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->WESCVW3WPTotalMetadataFlushed)) {
+        if (!p->st_wescv_w3wp_total_metadata_flushed) {
+            char id[RRD_ID_LENGTH_MAX + 1];
+            snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_total_metadata_flushed", app_name);
+            netdata_fix_chart_name(id);
+            p->st_wescv_w3wp_total_metadata_flushed = rrdset_create_localhost(
+                "iis",
+                id,
+                NULL,
+                "w3svc w3wp",
+                "iis.w3svc_w3wp_total_metadata_flushed",
+                "User-mode metadata cache flushed",
+                "flushes/s",
+                PLUGIN_WINDOWS_NAME,
+                "PerflibWebService",
+                PRIO_W3SVC_W3WP_METADATA_FLUSHED,
+                update_every,
+                RRDSET_TYPE_LINE);
+
+            p->rd_wescv_w3wp_total_metadata_flushed =
+                rrddim_add(p->st_wescv_w3wp_total_metadata_flushed, "metadata_blocks", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
+            rrdlabels_add(p->st_wescv_w3wp_total_metadata_flushed->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
+        }
+
+        rrddim_set_by_pointer(
+            p->st_wescv_w3wp_total_metadata_flushed,
+            p->rd_wescv_w3wp_total_metadata_flushed,
+            (collected_number)p->WESCVW3WPTotalMetadataFlushed.current.Data);
+
+        rrdset_done(p->st_wescv_w3wp_total_metadata_flushed);
+    }
+}
+
+static inline void w3svc_w3wp_output_cache_active_flushed_items(
+    struct ws3svc_w3wp_data *p,
+    PERF_DATA_BLOCK *pDataBlock,
+    PERF_OBJECT_TYPE *pObjectType,
+    PERF_INSTANCE_DEFINITION *pi,
+    int update_every,
+    char *app_name)
+{
+    if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->WESCVW3WPOutputCacheActiveFlushedItens)) {
+        if (!p->st_wescv_w3wp_output_cache_active_flushed_items) {
+            char id[RRD_ID_LENGTH_MAX + 1];
+            snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_output_cache_active_flushed_items", app_name);
+            netdata_fix_chart_name(id);
+            p->st_wescv_w3wp_output_cache_active_flushed_items = rrdset_create_localhost(
+                "iis",
+                id,
+                NULL,
+                "w3svc w3wp",
+                "iis.w3svc_w3wp_output_cache_active_flushed_items",
+                "Items flushed but still in memory for active responses",
+                "items",
+                PLUGIN_WINDOWS_NAME,
+                "PerflibWebService",
+                PRIO_W3SVC_W3WP_OUTPUT_CACHE_ACTIVE_FLUSH,
+                update_every,
+                RRDSET_TYPE_LINE);
+
+            p->rd_wescv_w3wp_output_cache_active_flushed_items = rrddim_add(
+                p->st_wescv_w3wp_output_cache_active_flushed_items, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
+            rrdlabels_add(
+                p->st_wescv_w3wp_output_cache_active_flushed_items->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
+        }
+
+        rrddim_set_by_pointer(
+            p->st_wescv_w3wp_output_cache_active_flushed_items,
+            p->rd_wescv_w3wp_output_cache_active_flushed_items,
+            (collected_number)p->WESCVW3WPOutputCacheActiveFlushedItens.current.Data);
+
+        rrdset_done(p->st_wescv_w3wp_output_cache_active_flushed_items);
+    }
+}
+
+static inline void w3svc_w3wp_output_cache_memory_usage(
+    struct ws3svc_w3wp_data *p,
+    PERF_DATA_BLOCK *pDataBlock,
+    PERF_OBJECT_TYPE *pObjectType,
+    PERF_INSTANCE_DEFINITION *pi,
+    int update_every,
+    char *app_name)
+{
+    if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->WESCVW3WPOutputCacheMemoryUsage)) {
+        if (!p->st_wescv_w3wp_output_cache_memory_usage) {
+            char id[RRD_ID_LENGTH_MAX + 1];
+            snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_output_cache_memory_usage", app_name);
+            netdata_fix_chart_name(id);
+            p->st_wescv_w3wp_output_cache_memory_usage = rrdset_create_localhost(
+                "iis",
+                id,
+                NULL,
+                "w3svc w3wp",
+                "iis.w3svc_w3wp_output_cache_memory_usage",
+                "Current number of bytes used by output cache",
+                "bytes",
+                PLUGIN_WINDOWS_NAME,
+                "PerflibWebService",
+                PRIO_W3SVC_W3WP_OUTPUT_CACHE_MEMORY_USAGE,
+                update_every,
+                RRDSET_TYPE_AREA);
+
+            p->rd_wescv_w3wp_output_cache_memory_usage =
+                rrddim_add(p->st_wescv_w3wp_output_cache_memory_usage, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
+            rrdlabels_add(p->st_wescv_w3wp_output_cache_memory_usage->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
+        }
+
+        rrddim_set_by_pointer(
+            p->st_wescv_w3wp_output_cache_memory_usage,
+            p->rd_wescv_w3wp_output_cache_memory_usage,
+            (collected_number)p->WESCVW3WPOutputCacheMemoryUsage.current.Data);
+
+        rrdset_done(p->st_wescv_w3wp_output_cache_memory_usage);
+    }
+}
+
+static inline void w3svc_w3wp_output_cache_flushed_total(
+    struct ws3svc_w3wp_data *p,
+    PERF_DATA_BLOCK *pDataBlock,
+    PERF_OBJECT_TYPE *pObjectType,
+    PERF_INSTANCE_DEFINITION *pi,
+    int update_every,
+    char *app_name)
+{
+    if (perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &p->WESCVW3WPOutputCacheFlushesTotal)) {
+        if (!p->st_wescv_w3wp_output_cache_flushed_total) {
+            char id[RRD_ID_LENGTH_MAX + 1];
+            snprintfz(id, RRD_ID_LENGTH_MAX, "w3svc_w3wp_%s_output_cache_flushed_total", app_name);
+            netdata_fix_chart_name(id);
+            p->st_wescv_w3wp_output_cache_flushed_total = rrdset_create_localhost(
+                "iis",
+                id,
+                NULL,
+                "w3svc w3wp",
+                "iis.w3svc_w3wp_output_cache_flushed_total",
+                "Flushes of output cache",
+                "flushes/s",
+                PLUGIN_WINDOWS_NAME,
+                "PerflibWebService",
+                PRIO_W3SVC_W3WP_OUTPUT_CACHE_FLUSHED_TOTAL,
+                update_every,
+                RRDSET_TYPE_LINE);
+
+            p->rd_wescv_w3wp_output_cache_flushed_total = rrddim_add(
+                p->st_wescv_w3wp_output_cache_flushed_total, "output_cache_entries", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
+            rrdlabels_add(p->st_wescv_w3wp_output_cache_flushed_total->rrdlabels, "app", app_name, RRDLABEL_SRC_AUTO);
+        }
+
+        rrddim_set_by_pointer(
+            p->st_wescv_w3wp_output_cache_flushed_total,
+            p->rd_wescv_w3wp_output_cache_flushed_total,
+            (collected_number)p->WESCVW3WPOutputCacheFlushesTotal.current.Data);
+
+        rrdset_done(p->st_wescv_w3wp_output_cache_flushed_total);
+    }
+}
+
+static bool do_W3SCV_W3WP(PERF_DATA_BLOCK *pDataBlock, int update_every)
+{
+    PERF_OBJECT_TYPE *pObjectType = perflibFindObjectTypeByName(pDataBlock, "W3SVC_W3WP");
+    if (!pObjectType)
+        return false;
+
+    PERF_INSTANCE_DEFINITION *pi = NULL;
+    for (LONG i = 0; i < pObjectType->NumInstances; i++) {
+        pi = perflibForEachInstance(pDataBlock, pObjectType, pi);
+        if (!pi)
+            break;
+
+        if (!getInstanceName(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer)))
+            strncpyz(windows_shared_buffer, "[unknown]", sizeof(windows_shared_buffer) - 1);
+
+        // We are not ploting _Total here, because cloud will group the sites
+        if (strcasecmp(windows_shared_buffer, "_Total") == 0) {
+            continue;
+        }
+
+        struct ws3svc_w3wp_data *p = dictionary_set(w3svc_w3wp_service, windows_shared_buffer, NULL, sizeof(*p));
+        // Instance example: "11084_MSExchangeOABAppPool"
+        char *app = strchr(windows_shared_buffer, '_');
+        if (!app) {
+            continue;
+        }
+
+        *app++ = '\0';
+
+        w3svc_w3wp_active_threads(p, pDataBlock, pObjectType, pi, update_every, app);
+
+        w3svc_w3wp_requests_total(p, pDataBlock, pObjectType, pi, update_every, app);
+        w3svc_w3wp_requests_active(p, pDataBlock, pObjectType, pi, update_every, app);
+
+        w3svc_w3wp_file_cache_mem_usage(p, pDataBlock, pObjectType, pi, update_every, app);
+
+        w3svc_w3wp_files_cached_total(p, pDataBlock, pObjectType, pi, update_every, app);
+        w3svc_w3wp_files_flushed_total(p, pDataBlock, pObjectType, pi, update_every, app);
+
+        w3svc_w3wp_uri_cached_flushed(p, pDataBlock, pObjectType, pi, update_every, app);
+        w3svc_w3wp_total_uri_cached(p, pDataBlock, pObjectType, pi, update_every, app);
+
+        w3svc_w3wp_total_metadata_cached(p, pDataBlock, pObjectType, pi, update_every, app);
+        w3svc_w3wp_total_metadata_flushed(p, pDataBlock, pObjectType, pi, update_every, app);
+
+        w3svc_w3wp_output_cache_active_flushed_items(p, pDataBlock, pObjectType, pi, update_every, app);
+        w3svc_w3wp_output_cache_memory_usage(p, pDataBlock, pObjectType, pi, update_every, app);
+        w3svc_w3wp_output_cache_flushed_total(p, pDataBlock, pObjectType, pi, update_every, app);
+    }
+
+    return true;
+}
+
+int do_PerflibWebService(int update_every __maybe_unused, usec_t dt __maybe_unused)
 {
     static bool initialized = false;
 
@@ -1291,11 +1974,13 @@ int do_PerflibWebService(int update_every, usec_t dt __maybe_unused)
     }
 
     int ret = 0;
-#define TOTAL_NUMBER_OF_FAILURES (2)
+#define TOTAL_NUMBER_OF_FAILURES (3)
     if (iis_web_service("Web Service", update_every, do_web_services))
         ret++;
     if (iis_web_service("APP_POOL_WAS", update_every, do_app_pool))
         ret++;
+    if (iis_web_service("W3SVC_W3WP", update_every, do_W3SCV_W3WP))
+        ret++;
 
     return (ret == TOTAL_NUMBER_OF_FAILURES) ? -1 : 0;
 }
diff --git a/src/collectors/windows.plugin/windows_plugin.h b/src/collectors/windows.plugin/windows_plugin.h
index 1366eef73a1e4c..50ee4d6750fa6b 100644
--- a/src/collectors/windows.plugin/windows_plugin.h
+++ b/src/collectors/windows.plugin/windows_plugin.h
@@ -60,6 +60,20 @@ enum PERFLIB_PRIO {
     PRIO_IIS_APP_POOL_TOTAL_WORKER_PROCESS_STARTUP_FAILURES,
     PRIO_IIS_APP_POOL_TOTAL_UPTIME,
 
+    PRIO_W3SVC_W3WP_ACTIVE_THREADS,
+    PRIO_W3SVC_W3WP_REQUESTS_TOTAL,
+    PRIO_W3SVC_W3WP_REQUESTS_ACTIVE,
+    PRIO_W3SVC_W3WP_FILE_CACHE_MEM_USAGE,
+    PRIO_W3SVC_W3WP_FILE_CACHE_TOTAL,
+    PRIO_W3SVC_W3WP_FILE_FLUSHED_TOTAL,
+    PRIO_W3SVC_W3WP_URI_FLUSHED_TOTAL,
+    PRIO_W3SVC_W3WP_URI_CACHED_TOTAL,
+    PRIO_W3SVC_W3WP_METADATA_CACHED,
+    PRIO_W3SVC_W3WP_METADATA_FLUSHED,
+    PRIO_W3SVC_W3WP_OUTPUT_CACHE_ACTIVE_FLUSH,
+    PRIO_W3SVC_W3WP_OUTPUT_CACHE_MEMORY_USAGE,
+    PRIO_W3SVC_W3WP_OUTPUT_CACHE_FLUSHED_TOTAL,
+
     PRIO_MSSQL_USER_CONNECTIONS,
 
     PRIO_MSSQL_DATABASE_TRANSACTIONS,
diff --git a/src/go/qq.md b/src/go/qq.md
deleted file mode 100644
index e69de29bb2d1d6..00000000000000


Reviews:
user: login: ilyam8
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-08T08:05:06Z
user: login: thiagoftsm
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T11:43:29Z
user: login: thiagoftsm
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T12:03:21Z
user: login: thiagoftsm
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T13:52:07Z
user: login: thiagoftsm
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T13:54:18Z
user: login: thiagoftsm
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T14:02:14Z
user: login: ilyam8
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-15T07:40:03Z
user: login: thiagoftsm
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T20:39:07Z
user: login: ilyam8
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-20T17:04:20Z

Review comments:
diff_hunk: @@ -1206,6 +1206,92 @@ modules:
               chart_type: line
               dimensions:
                 - name: uptime
+        - name: IIS W3SCV W3MP
+          description: "These metrics refer to the World Wide Web Publishing Service, the service responsible for hosting and serving web content"
+          labels:
+            - name: app
+              description: The name of the Application running.
+            - name: pid
+              description: Current PID of the process.
path: src/collectors/windows.plugin/metadata.yaml
user: login: ilyam8
body: Are there a lot of PIDs? And they come and go frequently? If so, I think we need to aggregate by "app".
created_at: 2025-05-08T07:58:52Z
author_association: MEMBER
diff_hunk: @@ -1206,6 +1206,92 @@ modules:
               chart_type: line
               dimensions:
                 - name: uptime
+        - name: IIS W3SCV W3MP
+          description: "These metrics refer to the World Wide Web Publishing Service, the service responsible for hosting and serving web content"
+          labels:
+            - name: app
+              description: The name of the Application running.
+            - name: pid
+              description: Current PID of the process.
+          metrics:
+            - name: iis.w3scv_w3wp_active_threads
+              description: Threads actively processing requests in the worker process.
+              unit: "threads"
+              chart_type: line
+              dimensions:
+                - name: threads
+            - name: iis.w3scv_w3wp_requests_total
+              description: Maximum number of threads to which the thread pool can grow as needed.
+              unit: "requests"
+              chart_type: line
+              dimensions:
+                - name: requests
path: src/collectors/windows.plugin/metadata.yaml
user: login: ilyam8
body: If the description is correct, then metric name is wrong. This looks like a constant value. Is it? If so, I think we don't need to collect it.
created_at: 2025-05-08T08:00:15Z
author_association: MEMBER
diff_hunk: @@ -1206,6 +1206,92 @@ modules:
               chart_type: line
               dimensions:
                 - name: uptime
+        - name: IIS W3SCV W3MP
+          description: "These metrics refer to the World Wide Web Publishing Service, the service responsible for hosting and serving web content"
+          labels:
+            - name: app
+              description: The name of the Application running.
+            - name: pid
+              description: Current PID of the process.
+          metrics:
+            - name: iis.w3scv_w3wp_active_threads
+              description: Threads actively processing requests in the worker process.
+              unit: "threads"
+              chart_type: line
+              dimensions:
+                - name: threads
+            - name: iis.w3scv_w3wp_requests_total
+              description: Maximum number of threads to which the thread pool can grow as needed.
+              unit: "requests"
+              chart_type: line
+              dimensions:
+                - name: requests
+            - name: iis.w3scv_w3wp_requests_active
+              description: Current number of requests being processed by the worker process.
+              unit: "requests"
+              chart_type: line
+              dimensions:
+                - name: requests
+            - name: iis.w3scv_w3wp_file_cache_mem_usage
+              description: Current memory usage by the worker process.
+              unit: "bytes/s"
+              chart_type: line
+              dimensions:
+                - name: used
path: src/collectors/windows.plugin/metadata.yaml
user: login: ilyam8
body: Why "bytes/s" if this is current memory?
created_at: 2025-05-08T08:00:50Z
author_association: MEMBER
diff_hunk: @@ -1206,6 +1206,92 @@ modules:
               chart_type: line
               dimensions:
                 - name: uptime
+        - name: IIS W3SCV W3MP
+          description: "These metrics refer to the World Wide Web Publishing Service, the service responsible for hosting and serving web content"
+          labels:
+            - name: app
+              description: The name of the Application running.
+            - name: pid
+              description: Current PID of the process.
+          metrics:
+            - name: iis.w3scv_w3wp_active_threads
+              description: Threads actively processing requests in the worker process.
+              unit: "threads"
+              chart_type: line
+              dimensions:
+                - name: threads
+            - name: iis.w3scv_w3wp_requests_total
+              description: Maximum number of threads to which the thread pool can grow as needed.
+              unit: "requests"
+              chart_type: line
+              dimensions:
+                - name: requests
+            - name: iis.w3scv_w3wp_requests_active
+              description: Current number of requests being processed by the worker process.
+              unit: "requests"
+              chart_type: line
+              dimensions:
+                - name: requests
+            - name: iis.w3scv_w3wp_file_cache_mem_usage
+              description: Current memory usage by the worker process.
+              unit: "bytes/s"
+              chart_type: line
+              dimensions:
+                - name: used
+            - name: iis.w3scv_w3wp_files_cache_total
+              description: Total number of files whose contents were ever added to the cache.
+              unit: "files/s"
+              chart_type: line
+              dimensions:
+                - name: files
+            - name: iis.w3scv_w3wp_files_flushed_total
+              description: Total number of file handles that have been removed from the cache.
+              unit: "files/s"
+              chart_type: line
+              dimensions:
+                - name: files
+            - name: iis.w3scv_w3wp_uri_cache_flushed
+              description: Total number of URI cache flushes.
+              unit: "flushes/s"
+              chart_type: line
+              dimensions:
+                - name: flushes
+            - name: iis.w3scv_w3wp_total_uri_cached
+              description: Total number of URI information blocks added to the cache.
+              unit: "blocks/s"
+              chart_type: line
+              dimensions:
+                - name: blocks
+            - name: iis.w3scv_w3wp_total_metadata_cache
+              description: Number of metadata information blocks currently present in user-mode cache.
+              unit: "blocks/s"
+              chart_type: line
+              dimensions:
+                - name: blocks
path: src/collectors/windows.plugin/metadata.yaml
user: login: ilyam8
body: Why "blocks/s" if this is blocks currently present?
created_at: 2025-05-08T08:04:14Z
author_association: MEMBER
diff_hunk: @@ -1206,6 +1206,92 @@ modules:
               chart_type: line
               dimensions:
                 - name: uptime
+        - name: IIS W3SCV W3MP
+          description: "These metrics refer to the World Wide Web Publishing Service, the service responsible for hosting and serving web content"
+          labels:
+            - name: app
+              description: The name of the Application running.
+            - name: pid
+              description: Current PID of the process.
+          metrics:
+            - name: iis.w3scv_w3wp_active_threads
+              description: Threads actively processing requests in the worker process.
+              unit: "threads"
+              chart_type: line
+              dimensions:
+                - name: threads
+            - name: iis.w3scv_w3wp_requests_total
+              description: Maximum number of threads to which the thread pool can grow as needed.
+              unit: "requests"
+              chart_type: line
+              dimensions:
+                - name: requests
+            - name: iis.w3scv_w3wp_requests_active
+              description: Current number of requests being processed by the worker process.
+              unit: "requests"
+              chart_type: line
+              dimensions:
+                - name: requests
+            - name: iis.w3scv_w3wp_file_cache_mem_usage
+              description: Current memory usage by the worker process.
+              unit: "bytes/s"
+              chart_type: line
+              dimensions:
+                - name: used
+            - name: iis.w3scv_w3wp_files_cache_total
+              description: Total number of files whose contents were ever added to the cache.
+              unit: "files/s"
+              chart_type: line
+              dimensions:
+                - name: files
+            - name: iis.w3scv_w3wp_files_flushed_total
+              description: Total number of file handles that have been removed from the cache.
+              unit: "files/s"
+              chart_type: line
+              dimensions:
+                - name: files
+            - name: iis.w3scv_w3wp_uri_cache_flushed
+              description: Total number of URI cache flushes.
+              unit: "flushes/s"
+              chart_type: line
+              dimensions:
+                - name: flushes
+            - name: iis.w3scv_w3wp_total_uri_cached
+              description: Total number of URI information blocks added to the cache.
+              unit: "blocks/s"
+              chart_type: line
+              dimensions:
+                - name: blocks
+            - name: iis.w3scv_w3wp_total_metadata_cache
+              description: Number of metadata information blocks currently present in user-mode cache.
+              unit: "blocks/s"
+              chart_type: line
+              dimensions:
+                - name: blocks
+            - name: iis.w3scv_w3wp_total_metadata_flushed
+              description: Total number of user-mode metadata cache flushed.
+              unit: "flushes/s"
+              chart_type: line
+              dimensions:
+                - name: flushes
+            - name: iis.w3scv_w3wp_output_cache_active_flushed_items
+              description: Number of items that have been flushed from output cache but are still being used by outgoing responses so are still taking up memory.
+              unit: "itens/s"
+              chart_type: line
+              dimensions:
+                - name: itens
path: src/collectors/windows.plugin/metadata.yaml
user: login: ilyam8
body: ```suggestion
              description: Number of items that have been flushed from output cache but are still being used by outgoing responses so are still taking up memory.
              unit: "items/s"
              chart_type: line
              dimensions:
                - name: items
```
created_at: 2025-05-08T08:04:56Z
author_association: MEMBER
diff_hunk: @@ -1206,6 +1206,92 @@ modules:
               chart_type: line
               dimensions:
                 - name: uptime
+        - name: IIS W3SCV W3MP
+          description: "These metrics refer to the World Wide Web Publishing Service, the service responsible for hosting and serving web content"
+          labels:
+            - name: app
+              description: The name of the Application running.
+            - name: pid
+              description: Current PID of the process.
path: src/collectors/windows.plugin/metadata.yaml
user: login: thiagoftsm
body: I’ve only seen one while collecting, so I added PID to maintain compatibility with other software. However, I’ll remove it now.
created_at: 2025-05-08T11:43:29Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1206,6 +1206,92 @@ modules:
               chart_type: line
               dimensions:
                 - name: uptime
+        - name: IIS W3SCV W3MP
+          description: "These metrics refer to the World Wide Web Publishing Service, the service responsible for hosting and serving web content"
+          labels:
+            - name: app
+              description: The name of the Application running.
+            - name: pid
+              description: Current PID of the process.
path: src/collectors/windows.plugin/metadata.yaml
user: login: thiagoftsm
body: Regarding the frequency of PID changes, it should probably be low since it’s tied to the instance name.
created_at: 2025-05-08T12:03:21Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1206,6 +1206,92 @@ modules:
               chart_type: line
               dimensions:
                 - name: uptime
+        - name: IIS W3SCV W3MP
+          description: "These metrics refer to the World Wide Web Publishing Service, the service responsible for hosting and serving web content"
+          labels:
+            - name: app
+              description: The name of the Application running.
+            - name: pid
+              description: Current PID of the process.
+          metrics:
+            - name: iis.w3scv_w3wp_active_threads
+              description: Threads actively processing requests in the worker process.
+              unit: "threads"
+              chart_type: line
+              dimensions:
+                - name: threads
+            - name: iis.w3scv_w3wp_requests_total
+              description: Maximum number of threads to which the thread pool can grow as needed.
+              unit: "requests"
+              chart_type: line
+              dimensions:
+                - name: requests
+            - name: iis.w3scv_w3wp_requests_active
+              description: Current number of requests being processed by the worker process.
+              unit: "requests"
+              chart_type: line
+              dimensions:
+                - name: requests
+            - name: iis.w3scv_w3wp_file_cache_mem_usage
+              description: Current memory usage by the worker process.
+              unit: "bytes/s"
+              chart_type: line
+              dimensions:
+                - name: used
path: src/collectors/windows.plugin/metadata.yaml
user: login: thiagoftsm
body: I missed updating the metadata for this, but the code was already correct.
created_at: 2025-05-08T13:52:07Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1206,6 +1206,92 @@ modules:
               chart_type: line
               dimensions:
                 - name: uptime
+        - name: IIS W3SCV W3MP
+          description: "These metrics refer to the World Wide Web Publishing Service, the service responsible for hosting and serving web content"
+          labels:
+            - name: app
+              description: The name of the Application running.
+            - name: pid
+              description: Current PID of the process.
+          metrics:
+            - name: iis.w3scv_w3wp_active_threads
+              description: Threads actively processing requests in the worker process.
+              unit: "threads"
+              chart_type: line
+              dimensions:
+                - name: threads
+            - name: iis.w3scv_w3wp_requests_total
+              description: Maximum number of threads to which the thread pool can grow as needed.
+              unit: "requests"
+              chart_type: line
+              dimensions:
+                - name: requests
+            - name: iis.w3scv_w3wp_requests_active
+              description: Current number of requests being processed by the worker process.
+              unit: "requests"
+              chart_type: line
+              dimensions:
+                - name: requests
+            - name: iis.w3scv_w3wp_file_cache_mem_usage
+              description: Current memory usage by the worker process.
+              unit: "bytes/s"
+              chart_type: line
+              dimensions:
+                - name: used
+            - name: iis.w3scv_w3wp_files_cache_total
+              description: Total number of files whose contents were ever added to the cache.
+              unit: "files/s"
+              chart_type: line
+              dimensions:
+                - name: files
+            - name: iis.w3scv_w3wp_files_flushed_total
+              description: Total number of file handles that have been removed from the cache.
+              unit: "files/s"
+              chart_type: line
+              dimensions:
+                - name: files
+            - name: iis.w3scv_w3wp_uri_cache_flushed
+              description: Total number of URI cache flushes.
+              unit: "flushes/s"
+              chart_type: line
+              dimensions:
+                - name: flushes
+            - name: iis.w3scv_w3wp_total_uri_cached
+              description: Total number of URI information blocks added to the cache.
+              unit: "blocks/s"
+              chart_type: line
+              dimensions:
+                - name: blocks
+            - name: iis.w3scv_w3wp_total_metadata_cache
+              description: Number of metadata information blocks currently present in user-mode cache.
+              unit: "blocks/s"
+              chart_type: line
+              dimensions:
+                - name: blocks
path: src/collectors/windows.plugin/metadata.yaml
user: login: thiagoftsm
body: For this specific case, I neglected to update both the data collection logic and metadata. The official description and implemented algorithms were unclear.
created_at: 2025-05-08T13:54:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1206,6 +1206,92 @@ modules:
               chart_type: line
               dimensions:
                 - name: uptime
+        - name: IIS W3SCV W3MP
+          description: "These metrics refer to the World Wide Web Publishing Service, the service responsible for hosting and serving web content"
+          labels:
+            - name: app
+              description: The name of the Application running.
+            - name: pid
+              description: Current PID of the process.
+          metrics:
+            - name: iis.w3scv_w3wp_active_threads
+              description: Threads actively processing requests in the worker process.
+              unit: "threads"
+              chart_type: line
+              dimensions:
+                - name: threads
+            - name: iis.w3scv_w3wp_requests_total
+              description: Maximum number of threads to which the thread pool can grow as needed.
+              unit: "requests"
+              chart_type: line
+              dimensions:
+                - name: requests
path: src/collectors/windows.plugin/metadata.yaml
user: login: thiagoftsm
body: The description you're seeing matches Microsoft's original specification:

```sh
 {
              "Counter": "Maximum Threads Count",
              "Value": {
                "data": 256,
                "time": 0,
                "type": 65536,
                "multi": 0,
                "frequency": 0
              },
              "Help": "Maximum number of threads to which the thread pool can grow as needed.",
              "Type": "PERF_COUNTER_RAWCOUNT",
              "Algorithm": "data0",
              "Description": "A counter which should not be time averaged on display (such as an error counter on a serial line). Display as is. No Display Suffix."
            }
```

Other software implementations also deliver this as `incremental`. I'll remove it for now, but we can restore it if requested.
created_at: 2025-05-08T14:02:14Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1206,6 +1206,92 @@ modules:
               chart_type: line
               dimensions:
                 - name: uptime
+        - name: IIS W3SCV W3MP
+          description: "These metrics refer to the World Wide Web Publishing Service, the service responsible for hosting and serving web content"
+          labels:
+            - name: app
+              description: The name of the Application running.
+            - name: pid
+              description: Current PID of the process.
+          metrics:
+            - name: iis.w3scv_w3wp_active_threads
+              description: Threads actively processing requests in the worker process.
+              unit: "threads"
+              chart_type: line
+              dimensions:
+                - name: threads
+            - name: iis.w3scv_w3wp_requests_total
+              description: Maximum number of threads to which the thread pool can grow as needed.
+              unit: "requests"
+              chart_type: line
+              dimensions:
+                - name: requests
path: src/collectors/windows.plugin/metadata.yaml
user: login: ilyam8
body: How is "Maximum number of threads to which the thread pool can grow as needed" incremental? Can you explain? What values do you get on your system?
created_at: 2025-05-15T07:40:03Z
author_association: MEMBER
diff_hunk: @@ -1206,6 +1206,92 @@ modules:
               chart_type: line
               dimensions:
                 - name: uptime
+        - name: IIS W3SCV W3MP
+          description: "These metrics refer to the World Wide Web Publishing Service, the service responsible for hosting and serving web content"
+          labels:
+            - name: app
+              description: The name of the Application running.
+            - name: pid
+              description: Current PID of the process.
+          metrics:
+            - name: iis.w3scv_w3wp_active_threads
+              description: Threads actively processing requests in the worker process.
+              unit: "threads"
+              chart_type: line
+              dimensions:
+                - name: threads
+            - name: iis.w3scv_w3wp_requests_total
+              description: Maximum number of threads to which the thread pool can grow as needed.
+              unit: "requests"
+              chart_type: line
+              dimensions:
+                - name: requests
path: src/collectors/windows.plugin/metadata.yaml
user: login: thiagoftsm
body: We currently have this data available only in our Exchange server, which is configured and maintained by our SRE team

![Screenshot_20250516_203543](https://github.com/user-attachments/assets/1b2979f2-d671-4b00-a074-a692e7ae469e)

We've shared the access permissions with you today.
created_at: 2025-05-16T20:39:07Z
author_association: CONTRIBUTOR

PR comments:
user: login: ilyam8
created_at: 2025-05-19T12:34:46Z
body: @thiagoftsm 

- Is it `W3SCV` or `W3SVC`?
- `w3wp_requests_active` keeps overflowing. I think it is because of the wrong dimension algorithm - must be "absolute". Please check other charts dimension algorithms too.
<img width="1276" alt="Screenshot 2025-05-19 at 15 32 16" src="https://github.com/user-attachments/assets/cb60d3a4-225e-4f8c-82f1-1a1f65275905" />

author_association: MEMBER
user: login: thiagoftsm
created_at: 2025-05-19T14:02:09Z
body: > * Is it `W3SCV` or `W3SVC`?

The metric name is W3SCV_W3MP

> w3wp_requests_active keeps overflowing. I think it is because of the wrong dimension algorithm - must be "absolute". Please check other charts dimension algorithms too.

I will check them. :handshake: 
author_association: CONTRIBUTOR
user: login: ilyam8
created_at: 2025-05-19T15:03:10Z
body: > The metric name is W3SCV_W3MP

It is. I am asking is it wrong or not? Google doesn't know about `w3scv` but knows about `w3csv`.

<img width="1397" alt="Screenshot 2025-05-19 at 18 02 47" src="https://github.com/user-attachments/assets/59be3916-89c5-4e08-80a5-dc9ea3c115f2" />
author_association: MEMBER
user: login: thiagoftsm
created_at: 2025-05-20T01:09:10Z
body: > > The metric name is W3SCV_W3MP
> 
> It is. I am asking is it wrong or not? Google doesn't know about `w3scv` but knows about `w3csv`.

Thank you. It was typo. I named the branch and perflib metric correctly, but I had this mistake during development.
author_association: CONTRIBUTOR