Session connections (MSSQL Plugin) (#21350)
thiagoftsm committed
Nov 27, 2025 at 01:09 UTC
092e1a831a7ecd59e224015c8333261c997334cc
5 files changed
+69
-10
src/collectors/windows.plugin/MonitorSQL.c
+23
-8
@@ -887,34 +887,48 @@ void netdata_mssql_fill_user_connection(struct mssql_instance *mi)
887
if (unlikely(!mi->conn->collect_user_connections))
888
return;
889
890
+ mi->MSSQLUserConnections.current.Data = 0;
891
+ mi->MSSQLSessionConnections.current.Data = 0;
892
+
893
collected_number connections = 0;
894
+ unsigned char is_user;
895
SQLLEN col_user_connections_len = 0;
896
+ SQLLEN col_user_bit_len = 0;
897
898
SQLRETURN ret;
899
895
- ret = SQLExecDirect(mi->conn->dbSQLUserConnections, (SQLCHAR *)NETDATA_QUERY_USER_CONNECTIONS, SQL_NTS);
900
+ ret = SQLExecDirect(mi->conn->dbSQLConnections, (SQLCHAR *)NETDATA_QUERY_CONNECTIONS, SQL_NTS);
901
+ if (likely(netdata_mssql_check_result(ret))) {
902
+ netdata_MSSQL_error(SQL_HANDLE_STMT, mi->conn->dbSQLConnections, NETDATA_MSSQL_ODBC_QUERY, mi->instanceID);
903
+ goto enduserconn;
904
+ }
905
+
906
+ ret = SQLBindCol(mi->conn->dbSQLConnections, 1, SQL_C_LONG, &connections, sizeof(connections), &col_user_connections_len);
907
if (likely(netdata_mssql_check_result(ret))) {
897
- netdata_MSSQL_error(SQL_HANDLE_STMT, mi->conn->dbSQLUserConnections, NETDATA_MSSQL_ODBC_QUERY, mi->instanceID);
908
+ netdata_MSSQL_error(SQL_HANDLE_STMT, mi->conn->dbSQLConnections, NETDATA_MSSQL_ODBC_PREPARE, mi->instanceID);
909
goto enduserconn;
910
}
911
901
- ret = SQLBindCol(mi->conn->dbSQLUserConnections, 1, SQL_C_LONG, &connections, sizeof(connections), &col_user_connections_len);
912
+ ret = SQLBindCol(mi->conn->dbSQLConnections, 2, SQL_C_BIT, &is_user, sizeof(is_user), &col_user_bit_len);
913
if (likely(netdata_mssql_check_result(ret))) {
903
- netdata_MSSQL_error(SQL_HANDLE_STMT, mi->conn->dbSQLUserConnections, NETDATA_MSSQL_ODBC_PREPARE, mi->instanceID);
914
+ netdata_MSSQL_error(SQL_HANDLE_STMT, mi->conn->dbSQLConnections, NETDATA_MSSQL_ODBC_PREPARE, mi->instanceID);
915
goto enduserconn;
916
}
917
918
do {
908
- ret = SQLFetch(mi->conn->dbSQLUserConnections);
919
+ ret = SQLFetch(mi->conn->dbSQLConnections);
920
if (likely(netdata_mssql_check_result(ret))) {
921
goto enduserconn;
922
}
923
913
- mi->MSSQLUserConnections.current.Data = (ULONGLONG)connections;
924
+ if (is_user)
925
+ mi->MSSQLUserConnections.current.Data = (ULONGLONG)connections;
926
+ else
927
+ mi->MSSQLSessionConnections.current.Data = (ULONGLONG)connections;
928
} while (true);
929
930
enduserconn:
917
- netdata_MSSQL_release_results(mi->conn->dbSQLUserConnections);
931
+ netdata_MSSQL_release_results(mi->conn->dbSQLConnections);
932
}
933
934
void netdata_mssql_fill_dictionary_from_db(struct mssql_instance *mi)
@@ -1078,7 +1092,7 @@ static bool netdata_MSSQL_initialize_connection(struct netdata_mssql_conn *nmc)
1092
goto endMSSQLInitializationConnection;
1093
}
1094
1081
- ret = SQLAllocHandle(SQL_HANDLE_STMT, nmc->netdataSQLHDBc, &nmc->dbSQLUserConnections);
1095
+ ret = SQLAllocHandle(SQL_HANDLE_STMT, nmc->netdataSQLHDBc, &nmc->dbSQLConnections);
1096
if (likely(netdata_mssql_check_result(ret))) {
1097
retConn = FALSE;
1098
goto endMSSQLInitializationConnection;
@@ -2187,6 +2201,7 @@ static void do_mssql_user_connection(PERF_DATA_BLOCK *pDataBlock, struct mssql_i
2201
return;
2202
2203
do_mssql_user_connections(mi, update_every);
2204
+ do_mssql_sessions_connections(mi, update_every);
2205
}
2206
2207
void dict_mssql_replication_status(struct mssql_publisher_publication *mpp, int update_every)
src/collectors/windows.plugin/metadata.yaml
+6
@@ -2345,6 +2345,12 @@ modules:
2345
chart_type: line
2346
dimensions:
2347
- name: user
2348
+ - name: mssql.instance_sessions_connections
2349
+ description: Session connections
2350
+ unit: connections
2351
+ chart_type: line
2352
+ dimensions:
2353
+ - name: session
2354
- name: mssql.instance_sqlstats_batch_requests
2355
description: Total of batches requests
2356
unit: requests/s
src/collectors/windows.plugin/perflib-mssql-queries.h
+7
-2
@@ -37,7 +37,7 @@
37
38
#define NETDATA_QUERY_JOBS_STATUS "SELECT name, enabled FROM msdb.dbo.sysjobs;"
39
40
-#define NETDATA_QUERY_USER_CONNECTIONS "SELECT COUNT(*) AS user_connections FROM sys.dm_exec_sessions WHERE is_user_process = 1;"
40
+#define NETDATA_QUERY_CONNECTIONS "SELECT COUNT(*), is_user_process FROM sys.dm_exec_sessions GROUP BY is_user_process;"
41
42
// https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-os-wait-stats-transact-sql?view=sql-server-ver16
43
#define NETDATA_QUERY_CHECK_WAITS \
@@ -672,7 +672,7 @@ struct netdata_mssql_conn {
672
SQLHSTMT dbLocksSTMT;
673
SQLHSTMT dbSQLState;
674
SQLHSTMT dbSQLJobs;
675
- SQLHSTMT dbSQLUserConnections;
675
+ SQLHSTMT dbSQLConnections;
676
SQLHSTMT dbReplicationPublisher;
677
678
BOOL collect_transactions;
@@ -797,6 +797,9 @@ struct mssql_instance {
797
RRDSET *st_user_connections;
798
RRDDIM *rd_user_connections;
799
800
+ RRDSET *st_session_connections;
801
+ RRDDIM *rd_session_connections;
802
+
803
RRDSET *st_process_blocked;
804
RRDDIM *rd_process_blocked;
805
@@ -838,6 +841,7 @@ struct mssql_instance {
841
COUNTER_DATA MSSQLAccessMethodPageSplits;
842
COUNTER_DATA MSSQLBlockedProcesses;
843
COUNTER_DATA MSSQLUserConnections;
844
+ COUNTER_DATA MSSQLSessionConnections;
845
COUNTER_DATA MSSQLConnectionMemoryBytes;
846
COUNTER_DATA MSSQLExternalBenefitOfMemory;
847
COUNTER_DATA MSSQLPendingMemoryGrants;
@@ -993,4 +997,5 @@ extern void do_mssql_memory_mgr(PERF_DATA_BLOCK *pDataBlock, struct mssql_instan
997
extern void do_mssql_statistics_perflib(PERF_DATA_BLOCK *pDataBlock, struct mssql_instance *mi, int update_every);
998
extern void do_mssql_access_methods(PERF_DATA_BLOCK *pDataBlock, struct mssql_instance *mi, int update_every);
999
extern void do_mssql_user_connections(struct mssql_instance *mi, int update_every);
1000
+extern void do_mssql_sessions_connections(struct mssql_instance *mi, int update_every);
1001
#endif
src/collectors/windows.plugin/perflib-mssql.c
+32
@@ -383,6 +383,38 @@ void do_mssql_user_connections(struct mssql_instance *mi, int update_every)
383
rrdset_done(mi->st_user_connections);
384
}
385
386
+void do_mssql_sessions_connections(struct mssql_instance *mi, int update_every)
387
+{
388
+ if (unlikely(!mi->st_session_connections)) {
389
+ char id[RRD_ID_LENGTH_MAX + 1];
390
+ snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_sessions_connections", mi->instanceID);
391
+ netdata_fix_chart_name(id);
392
+ mi->st_session_connections = rrdset_create_localhost(
393
+ "mssql",
394
+ id,
395
+ NULL,
396
+ "connections",
397
+ "mssql.instance_sessions_connections",
398
+ "Session connections",
399
+ "connections",
400
+ PLUGIN_WINDOWS_NAME,
401
+ "PerflibMSSQL",
402
+ PRIO_MSSQL_SESSIONS_CONNECTIONS,
403
+ update_every,
404
+ RRDSET_TYPE_LINE);
405
+
406
+ mi->rd_session_connections = rrddim_add(mi->st_session_connections, "session", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
407
+
408
+ rrdlabels_add(mi->st_session_connections->rrdlabels, "mssql_instance", mi->instanceID, RRDLABEL_SRC_AUTO);
409
+ }
410
+
411
+ rrddim_set_by_pointer(
412
+ mi->st_session_connections,
413
+ mi->rd_session_connections,
414
+ (collected_number)mi->MSSQLSessionConnections.current.Data);
415
+ rrdset_done(mi->st_session_connections);
416
+}
417
+
418
void do_mssql_blocked_processes(struct mssql_instance *mi, int update_every)
419
{
420
if (unlikely(!mi->st_process_blocked)) {
src/collectors/windows.plugin/windows_plugin.h
+1
@@ -107,6 +107,7 @@ enum PERFLIB_PRIO {
107
PRIO_W3SVC_W3WP_OUTPUT_CACHE_FLUSHED_TOTAL,
108
109
PRIO_MSSQL_USER_CONNECTIONS,
110
+ PRIO_MSSQL_SESSIONS_CONNECTIONS,
111
112
PRIO_MSSQL_DATABASE_TRANSACTIONS,
113
PRIO_MSSQL_DATABASE_ACTIVE_TRANSACTIONS,