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,