@cryptotaxi247 / netdata / commits / 77ef22e05

Add more MSSQL metrics (windows.plugin) (#20788)

thiagoftsm committed Aug 12, 2025 at 16:42 UTC 77ef22e05e7f5a9bcb2614b9db32b878b5d9a55f
5 files changed +267 -14
src/collectors/windows.plugin/README.md
+1 -1
@@ -123,7 +123,7 @@ Additionally, enable the [Query Store](https://learn.microsoft.com/en-us/sql/rel
123 DECLARE @dbname NVARCHAR(max)
124 DECLARE nd_user_cursor CURSOR FOR SELECT name
125 FROM master.dbo.sysdatabases
126 - WHERE name NOT IN ('master', 'tempdb')
126 + WHERE name NOT IN ('master')
127
128 OPEN nd_user_cursor
129 FETCH NEXT FROM nd_user_cursor INTO @dbname
src/collectors/windows.plugin/metadata.yaml
+25 -1
@@ -1835,7 +1835,7 @@ modules:
1835 DECLARE @dbname NVARCHAR(max)
1836 DECLARE nd_user_cursor CURSOR FOR SELECT name
1837 FROM master.dbo.sysdatabases
1838 - WHERE name NOT IN ('master', 'tempdb')
1838 + WHERE name NOT IN ('master')
1839
1840 OPEN nd_user_cursor
1841 FETCH NEXT FROM nd_user_cursor INTO @dbname
@@ -2050,12 +2050,36 @@ modules:
2050 chart_type: line
2051 dimensions:
2052 - name: life_expectancy
2053 + - name: mssql.instance_bufman_lazy_write
2054 + description: Buffers written by buffer manager's lazy writer
2055 + unit: Lazy writes/sec
2056 + chart_type: line
2057 + dimensions:
2058 + - name: lazy_write
2059 + - name: mssql.instance_bufman_page_lookups
2060 + description: Requests to find a page in the buffer pool.
2061 + unit: Page lookups/sec
2062 + chart_type: line
2063 + dimensions:
2064 + - name: page_lookups
2065 - name: mssql.instance_memmgr_server_memory
2066 description: Memory committed
2067 unit: bytes
2068 chart_type: line
2069 dimensions:
2070 - name: memory
2071 + - name: mssql.database_readonly
2072 + description: Current database write status.
2073 + unit: boolean
2074 + chart_type: line
2075 + dimensions:
2076 + - name: readonly
2077 + - name: mssql.database_state
2078 + description: Current database state.
2079 + unit: boolean
2080 + chart_type: line
2081 + dimensions:
2082 + - name: state
2083 - name: mssql.instance_memmgr_connection_memory_bytes
2084 description: Amount of dynamic memory to maintain connections
2085 unit: bytes
src/collectors/windows.plugin/perflib-mssql-queries.h
+4 -1
@@ -19,11 +19,14 @@
19 "SELECT counter_name, cntr_value FROM %s.sys.dm_os_performance_counters WHERE instance_name = '%s' AND counter_name IN ('Active Transactions', 'Transactions/sec', 'Write Transactions/sec', 'Backup/Restore Throughput/sec', 'Log Bytes Flushed/sec', 'Log Flushes/sec', 'Number of Deadlocks/sec', 'Lock Waits/sec', 'Lock Timeouts/sec', 'Lock Requests/sec');"
20
21 #define NETDATA_QUERY_TRANSACTIONS_PER_INSTANCE_MASK \
22 - "SELECT counter_name, cntr_value FROM sys.dm_os_performance_counters WHERE (object_name like '%%Buffer Manager%%' or object_name like '%%SQL Statistics%%') AND counter_name IN ('Page reads/sec', 'Page writes/sec', 'Buffer cache hit ratio', 'Checkpoint pages/sec', 'Page life expectancy', 'SQL Compilations/sec', 'SQL Re-Compilations/sec');"
22 + "SELECT counter_name, cntr_value FROM sys.dm_os_performance_counters WHERE (object_name like '%%Buffer Manager%%' or object_name like '%%SQL Statistics%%') AND counter_name IN ('Page reads/sec', 'Page writes/sec', 'Buffer cache hit ratio', 'Checkpoint pages/sec', 'Page life expectancy', 'Lazy writes/sec', 'Page Lookups/sec', 'SQL Compilations/sec', 'SQL Re-Compilations/sec');"
23
24 #define NETDATA_QUERY_CHECK_PERM \
25 "SELECT CASE WHEN IS_SRVROLEMEMBER('sysadmin') = 1 OR HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE') = 1 THEN 1 ELSE 0 END AS has_permission;"
26
27 +#define NETDATA_DB_STATES (6)
28 +#define NETDATA_QUERY_DATABASE_STATUS "SELECT name, state, is_read_only FROM sys.databases;"
29 +
30 // https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-os-wait-stats-transact-sql?view=sql-server-ver16
31 #define NETDATA_QUERY_CHECK_WAITS \
32 "SELECT \
src/collectors/windows.plugin/perflib-mssql.c
+235 -11
@@ -40,6 +40,7 @@ struct netdata_mssql_conn {
40 SQLHSTMT dbInstanceTransactionSTMT;
41 SQLHSTMT dbWaitsSTMT;
42 SQLHSTMT dbLocksSTMT;
43 + SQLHSTMT dbSQLState;
44
45 BOOL is_connected;
46 };
@@ -177,12 +178,16 @@ struct mssql_db_instance {
178 RRDSET *st_db_write_transactions;
179 RRDSET *st_db_lockwait;
180 RRDSET *st_db_deadlock;
181 + RRDSET *st_db_readonly;
182 + RRDSET *st_db_state[NETDATA_DB_STATES];
183 RRDSET *st_lock_timeouts;
184 RRDSET *st_lock_requests;
185 RRDSET *st_buff_page_iops;
186 RRDSET *st_buff_cache_hits;
187 RRDSET *st_buff_checkpoint_pages;
188 RRDSET *st_buff_cache_page_life_expectancy;
189 + RRDSET *st_buff_lazy_write;
190 + RRDSET *st_buff_page_lookups;
191
192 RRDSET *st_stats_compilation;
193 RRDSET *st_stats_recompiles;
@@ -196,6 +201,8 @@ struct mssql_db_instance {
201 RRDDIM *rd_db_write_transactions;
202 RRDDIM *rd_db_lockwait;
203 RRDDIM *rd_db_deadlock;
204 + RRDDIM *rd_db_readonly;
205 + RRDDIM *rd_db_state[NETDATA_DB_STATES];
206 RRDDIM *rd_lock_timeouts;
207 RRDDIM *rd_lock_requests;
208 RRDDIM *rd_buff_page_reads;
@@ -203,6 +210,8 @@ struct mssql_db_instance {
210 RRDDIM *rd_buff_cache_hits;
211 RRDDIM *rd_buff_checkpoint_pages;
212 RRDDIM *rd_buff_cache_page_life_expectancy;
213 + RRDDIM *rd_buff_lazy_write;
214 + RRDDIM *rd_buff_page_lookups;
215
216 RRDDIM *rd_stats_compilation;
217 RRDDIM *rd_stats_recompiles;
@@ -227,10 +236,15 @@ struct mssql_db_instance {
236 COUNTER_DATA MSSQLBufferCacheHits;
237 COUNTER_DATA MSSQLBufferCheckpointPages;
238 COUNTER_DATA MSSQLBufferPageLifeExpectancy;
239 + COUNTER_DATA MSSQLBufferLazyWrite;
240 + COUNTER_DATA MSSQLBufferPageLookups;
241
242 COUNTER_DATA MSSQLCompilations;
243 COUNTER_DATA MSSQLRecompilations;
244
245 + COUNTER_DATA MSSQLDBIsReadonly;
246 + COUNTER_DATA MSSQLDBState;
247 +
248 uint32_t updated;
249 };
250
@@ -339,6 +353,8 @@ static ULONGLONG netdata_MSSQL_fill_long_value(SQLHSTMT *stmt, const char *mask,
353 #define NETDATA_MSSQL_BUFFER_PAGE_CACHE_METRIC "Buffer cache hit ratio"
354 #define NETDATA_MSSQL_BUFFER_CHECKPOINT_METRIC "Checkpoint pages/sec"
355 #define NETDATA_MSSQL_BUFFER_PAGE_LIFE_METRIC "Page life expectancy"
356 +#define NETDATA_MSSQL_BUFFER_LAZY_WRITES_METRIC "Lazy writes/sec"
357 +#define NETDATA_MSSQL_BUFFER_PAGE_LOOKUPS_METRIC "Page Lookups/sec"
358
359 #define NETDATA_MSSQL_STATS_COMPILATIONS_METRIC "SQL Compilations/sec"
360 #define NETDATA_MSSQL_STATS_RECOMPILATIONS_METRIC "SQL Re-Compilations/sec"
@@ -406,6 +422,12 @@ void dict_mssql_fill_instance_transactions(struct mssql_db_instance *mdi)
422 else if (!strncmp(
423 object_name, NETDATA_MSSQL_BUFFER_PAGE_LIFE_METRIC, sizeof(NETDATA_MSSQL_BUFFER_PAGE_LIFE_METRIC) - 1))
424 mdi->MSSQLBufferPageLifeExpectancy.current.Data = (ULONGLONG)value;
425 + else if (!strncmp(
426 + object_name, NETDATA_MSSQL_BUFFER_LAZY_WRITES_METRIC, sizeof(NETDATA_MSSQL_BUFFER_LAZY_WRITES_METRIC) - 1))
427 + mdi->MSSQLBufferLazyWrite.current.Data = (ULONGLONG)value;
428 + else if (!strncmp(
429 + object_name, NETDATA_MSSQL_BUFFER_PAGE_LOOKUPS_METRIC, sizeof(NETDATA_MSSQL_BUFFER_PAGE_LOOKUPS_METRIC) - 1))
430 + mdi->MSSQLBufferPageLookups.current.Data = (ULONGLONG)value;
431 else if (!strncmp(
432 object_name, NETDATA_MSSQL_STATS_COMPILATIONS_METRIC, sizeof(NETDATA_MSSQL_STATS_COMPILATIONS_METRIC) - 1))
433 mdi->MSSQLCompilations.current.Data = (ULONGLONG)value;
@@ -752,6 +774,59 @@ endperm:
774 return perm;
775 }
776
777 +void metdata_mssql_fill_mssql_status(struct mssql_instance *mi)
778 +{
779 + char dbname[SQLSERVER_MAX_NAME_LENGTH + 1];
780 + int readonly = 0;
781 + BYTE state = 0;
782 + SQLLEN col_data_len = 0;
783 +
784 + static int next_try = NETDATA_MSSQL_NEXT_TRY - 1;
785 +
786 + if (++next_try != NETDATA_MSSQL_NEXT_TRY)
787 + return;
788 +
789 + next_try = 0;
790 +
791 + SQLRETURN ret;
792 +
793 + ret = SQLExecDirect(mi->conn->dbSQLState, (SQLCHAR *)NETDATA_QUERY_DATABASE_STATUS, SQL_NTS);
794 + if (ret != SQL_SUCCESS) {
795 + netdata_MSSQL_error(SQL_HANDLE_STMT, mi->conn->dbSQLState, NETDATA_MSSQL_ODBC_QUERY, mi->instanceID);
796 + goto enddbstate;
797 + }
798 +
799 + ret = SQLBindCol(mi->conn->dbSQLState, 1, SQL_C_TINYINT, &state, sizeof(state), &col_data_len);
800 + if (ret != SQL_SUCCESS) {
801 + netdata_MSSQL_error(SQL_HANDLE_STMT, mi->conn->dbSQLState, NETDATA_MSSQL_ODBC_PREPARE, mi->instanceID);
802 + goto enddbstate;
803 + }
804 +
805 + ret = SQLBindCol(mi->conn->dbSQLState, 3, SQL_C_BIT, &readonly, sizeof(readonly), &col_data_len);
806 + if (ret != SQL_SUCCESS) {
807 + netdata_MSSQL_error(SQL_HANDLE_STMT, mi->conn->dbWaitsSTMT, NETDATA_MSSQL_ODBC_PREPARE, mi->instanceID);
808 + goto enddbstate;
809 + }
810 +
811 + int i = 0;
812 + do {
813 + ret = SQLFetch(mi->conn->dbSQLState);
814 + if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
815 + goto enddbstate;
816 + }
817 +
818 + struct mssql_db_instance *mdi = dictionary_set(mi->databases, dbname, NULL, sizeof(*mdi));
819 + if (!mdi)
820 + continue;
821 +
822 + mdi->MSSQLDBState.current.Data = (ULONGLONG)state;
823 + mdi->MSSQLDBIsReadonly.current.Data = (ULONGLONG)readonly;
824 + } while (true);
825 +
826 +enddbstate:
827 + netdata_MSSQL_release_results(mi->conn->dbSQLState);
828 +}
829 +
830 void metdata_mssql_fill_dictionary_from_db(struct mssql_instance *mi)
831 {
832 char dbname[SQLSERVER_MAX_NAME_LENGTH + 1];
@@ -880,6 +955,10 @@ static bool netdata_MSSQL_initialize_conection(struct netdata_mssql_conn *nmc)
955 ret = SQLAllocHandle(SQL_HANDLE_STMT, nmc->netdataSQLHDBc, &nmc->dbWaitsSTMT);
956 if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
957 retConn = FALSE;
958 +
959 + ret = SQLAllocHandle(SQL_HANDLE_STMT, nmc->netdataSQLHDBc, &nmc->dbSQLState);
960 + if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
961 + retConn = FALSE;
962 }
963
964 return retConn;
@@ -1222,6 +1301,7 @@ int dict_mssql_query_cb(const DICTIONARY_ITEM *item __maybe_unused, void *value,
1301 mi->instanceID);
1302 } else {
1303 metdata_mssql_fill_dictionary_from_db(mi);
1304 + metdata_mssql_fill_mssql_status(mi);
1305 dictionary_sorted_walkthrough_read(mi->databases, dict_mssql_databases_run_queries, NULL);
1306 }
1307
@@ -1953,6 +2033,73 @@ void mssql_buffman_page_life_expectancy_chart(struct mssql_db_instance *mdi, str
2033 rrdset_done(mdi->st_buff_cache_page_life_expectancy);
2034 }
2035
2036 +void mssql_buffman_lazy_write_chart(struct mssql_db_instance *mdi, struct mssql_instance *mi)
2037 +{
2038 + if (!mdi->st_buff_lazy_write) {
2039 + char id[RRD_ID_LENGTH_MAX + 1];
2040 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_bufman_lazy_write", mi->instanceID);
2041 + netdata_fix_chart_name(id);
2042 + mdi->st_buff_lazy_write = rrdset_create_localhost(
2043 + "mssql",
2044 + id,
2045 + NULL,
2046 + "buffer cache",
2047 + "mssql.instance_bufman_lazy_write",
2048 + "Buffers written by buffer manager's lazy writer",
2049 + "Lazy writes/sec",
2050 + PLUGIN_WINDOWS_NAME,
2051 + "PerflibMSSQL",
2052 + PRIO_MSSQL_BUFF_LAZY_WRITE,
2053 + mi->update_every,
2054 + RRDSET_TYPE_LINE);
2055 +
2056 + mdi->rd_buff_lazy_write = rrddim_add(
2057 + mdi->st_buff_lazy_write, "lazy_write", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
2058 +
2059 + rrdlabels_add(
2060 + mdi->st_buff_lazy_write->rrdlabels, "mssql_instance", mi->instanceID, RRDLABEL_SRC_AUTO);
2061 + }
2062 +
2063 + rrddim_set_by_pointer(
2064 + mdi->st_buff_lazy_write,
2065 + mdi->rd_buff_lazy_write,
2066 + (collected_number)mdi->MSSQLBufferLazyWrite.current.Data);
2067 + rrdset_done(mdi->st_buff_lazy_write);
2068 +}
2069 +
2070 +void mssql_buffman_page_lookups_chart(struct mssql_db_instance *mdi, struct mssql_instance *mi) {
2071 + if (!mdi->st_buff_page_lookups) {
2072 + char id[RRD_ID_LENGTH_MAX + 1];
2073 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_bufman_page_lookups", mi->instanceID);
2074 + netdata_fix_chart_name(id);
2075 + mdi->st_buff_page_lookups = rrdset_create_localhost(
2076 + "mssql",
2077 + id,
2078 + NULL,
2079 + "buffer cache",
2080 + "mssql.instance_bufman_page_lookups",
2081 + "Requests to find a page in the buffer pool.",
2082 + "Page lookups/sec",
2083 + PLUGIN_WINDOWS_NAME,
2084 + "PerflibMSSQL",
2085 + PRIO_MSSQL_BUFF_PAGE_LOOKUPS,
2086 + mi->update_every,
2087 + RRDSET_TYPE_LINE);
2088 +
2089 + mdi->rd_buff_page_lookups = rrddim_add(
2090 + mdi->st_buff_page_lookups, "page_lookups", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
2091 +
2092 + rrdlabels_add(
2093 + mdi->st_buff_page_lookups->rrdlabels, "mssql_instance", mi->instanceID, RRDLABEL_SRC_AUTO);
2094 + }
2095 +
2096 + rrddim_set_by_pointer(
2097 + mdi->st_buff_page_lookups,
2098 + mdi->rd_buff_page_lookups,
2099 + (collected_number) mdi->MSSQLBufferPageLookups.current.Data);
2100 + rrdset_done(mdi->st_buff_page_lookups);
2101 +}
2102 +
2103 static void netdata_mssql_compilations(struct mssql_db_instance *mdi, struct mssql_instance *mi) {
2104 if (!mdi->st_stats_compilation) {
2105 char id[RRD_ID_LENGTH_MAX + 1];
@@ -2027,6 +2174,9 @@ int dict_mssql_buffman_stats_charts_cb(const DICTIONARY_ITEM *item __maybe_unuse
2174 mssql_buffman_cache_hit_ratio_chart(mdi, mi);
2175 mssql_buffman_checkpoints_pages_chart(mdi, mi);
2176 mssql_buffman_page_life_expectancy_chart(mdi, mi);
2177 + mssql_buffman_lazy_write_chart(mdi, mi);
2178 + mssql_buffman_page_lookups_chart(mdi, mi);
2179 +
2180 netdata_mssql_compilations(mdi, mi);
2181 netdata_mssql_recompilations(mdi, mi);
2182
@@ -2285,6 +2435,78 @@ static void mssql_deadlock_chart(struct mssql_db_instance *mdi, const char *db,
2435 rrdset_done(mdi->st_db_deadlock);
2436 }
2437
2438 +static void mssql_is_readonly_chart(struct mssql_db_instance *mdi, const char *db, int update_every)
2439 +{
2440 + if (!mdi->st_db_readonly) {
2441 + char id[RRD_ID_LENGTH_MAX + 1];
2442 + snprintfz(id, RRD_ID_LENGTH_MAX, "db_%s_instance_%s_readonly", db, mdi->parent->instanceID);
2443 + netdata_fix_chart_name(id);
2444 + mdi->st_db_readonly = rrdset_create_localhost(
2445 + "mssql",
2446 + id,
2447 + NULL,
2448 + "locks",
2449 + "mssql.database_readonly",
2450 + "Current database write status.",
2451 + "boolean",
2452 + PLUGIN_WINDOWS_NAME,
2453 + "PerflibMSSQL",
2454 + PRIO_MSSQL_DATABASE_DEADLOCKS_PER_SECOND,
2455 + update_every,
2456 + RRDSET_TYPE_LINE);
2457 +
2458 + rrdlabels_add(mdi->st_db_readonly->rrdlabels, "mssql_instance", mdi->parent->instanceID, RRDLABEL_SRC_AUTO);
2459 + rrdlabels_add(mdi->st_db_readonly->rrdlabels, "database", db, RRDLABEL_SRC_AUTO);
2460 +
2461 + mdi->rd_db_readonly = rrddim_add(mdi->st_db_readonly, "readonly", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
2462 + }
2463 +
2464 + rrddim_set_by_pointer(
2465 + mdi->st_db_readonly, mdi->rd_db_readonly, (collected_number)mdi->MSSQLDBIsReadonly.current.Data);
2466 +
2467 + rrdset_done(mdi->st_db_readonly);
2468 +}
2469 +
2470 +static void mssql_db_states_chart(struct mssql_db_instance *mdi, const char *db, int update_every, const char *str_state, int idx, collected_number state)
2471 +{
2472 + if (!mdi->st_db_state[idx]) {
2473 + char id[RRD_ID_LENGTH_MAX + 1];
2474 + snprintfz(id, RRD_ID_LENGTH_MAX, "db_%s_instance_%s_resource_%s_state", db, mdi->parent->instanceID, str_state);
2475 + netdata_fix_chart_name(id);
2476 + mdi->st_db_state[idx] = rrdset_create_localhost(
2477 + "mssql",
2478 + id,
2479 + NULL,
2480 + "locks",
2481 + "mssql.database_state",
2482 + "Current database state.",
2483 + "boolean",
2484 + PLUGIN_WINDOWS_NAME,
2485 + "PerflibMSSQL",
2486 + PRIO_MSSQL_DATABASE_DEADLOCKS_PER_SECOND,
2487 + update_every,
2488 + RRDSET_TYPE_LINE);
2489 +
2490 + rrdlabels_add(mdi->st_db_state[idx]->rrdlabels, "mssql_instance", mdi->parent->instanceID, RRDLABEL_SRC_AUTO);
2491 + rrdlabels_add(mdi->st_db_state[idx]->rrdlabels, "database", db, RRDLABEL_SRC_AUTO);
2492 +
2493 + mdi->rd_db_state[idx] = rrddim_add(mdi->st_db_state[idx], "state", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
2494 + }
2495 +
2496 + rrddim_set_by_pointer(mdi->st_db_state[idx], mdi->rd_db_state[idx], state);
2497 +
2498 + rrdset_done(mdi->st_db_state[idx]);
2499 +}
2500 +
2501 +static void mssql_db_state_chart_loop(struct mssql_db_instance *mdi, const char *db, int update_every)
2502 +{
2503 + static const char *state[NETDATA_DB_STATES] = { "ONLINE", "RESTORING", "RECOVERING", "RECOVERY_PENDING", "SUSPECT", "OFFLINE"};
2504 + collected_number set_value = (mdi->MSSQLDBState.current.Data < 5) ? (collected_number) mdi->MSSQLDBState.current.Data : 5;
2505 + for (collected_number i; i < NETDATA_DB_STATES; i++) {
2506 + mssql_db_states_chart(mdi, db, update_every, state[i], i, i == set_value);
2507 + }
2508 +}
2509 +
2510 static void mssql_lock_request_chart(struct mssql_db_instance *mdi, const char *db, int update_every)
2511 {
2512 char id[RRD_ID_LENGTH_MAX + 1];
@@ -2434,17 +2656,19 @@ int dict_mssql_databases_charts_cb(const DICTIONARY_ITEM *item __maybe_unused, v
2656 int *update_every = data;
2657
2658 void (*transaction_chart[])(struct mssql_db_instance *, const char *, int) = {
2437 - mssql_data_file_size_chart,
2438 - mssql_transactions_chart,
2439 - mssql_database_backup_restore_chart,
2440 - mssql_database_log_flushed_chart,
2441 - mssql_database_log_flushes_chart,
2442 - mssql_active_transactions_chart,
2443 - mssql_write_transactions_chart,
2444 - mssql_lockwait_chart,
2445 - mssql_deadlock_chart,
2446 - mssql_lock_timeout_chart,
2447 - mssql_lock_request_chart,
2659 + mssql_data_file_size_chart,
2660 + mssql_transactions_chart,
2661 + mssql_database_backup_restore_chart,
2662 + mssql_database_log_flushed_chart,
2663 + mssql_database_log_flushes_chart,
2664 + mssql_active_transactions_chart,
2665 + mssql_write_transactions_chart,
2666 + mssql_lockwait_chart,
2667 + mssql_deadlock_chart,
2668 + mssql_is_readonly_chart,
2669 + mssql_db_state_chart_loop,
2670 + mssql_lock_timeout_chart,
2671 + mssql_lock_request_chart,
2672
2673 // Last function pointer must be NULL
2674 NULL};
src/collectors/windows.plugin/windows_plugin.h
+2
@@ -115,6 +115,8 @@ enum PERFLIB_PRIO {
115 PRIO_MSSQL_BUFF_CHECKPOINT_PAGES,
116 PRIO_MSSQL_BUFF_METHODS_PAGE_SPLIT,
117 PRIO_MSSQL_BUFF_PAGE_LIFE_EXPECTANCY,
118 + PRIO_MSSQL_BUFF_LAZY_WRITE,
119 + PRIO_MSSQL_BUFF_PAGE_LOOKUPS,
120
121 PRIO_MSSQL_MEMMGR_CONNECTION_MEMORY_BYTES,
122 PRIO_MSSQL_MEMMGR_TOTAL_SERVER,