@cryptotaxi247 / netdata-1 / commits / 092e1a831

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,