Merge MSSQL Queries (windows.plugin) (#21491)
thiagoftsm committed
Jan 8, 2026 at 15:19 UTC
c97bc7edf7e7a3dcf1db873041e7eea335deca73
2 files changed
+183
-209
src/collectors/windows.plugin/MonitorSQL.c
+180
-203
@@ -122,117 +122,6 @@ static ULONGLONG netdata_MSSQL_fill_long_value(SQLHSTMT stmt, const char *mask,
122
#define NETDATA_MSSQL_STATS_COMPILATIONS_METRIC "SQL Compilations/sec"
123
#define NETDATA_MSSQL_STATS_RECOMPILATIONS_METRIC "SQL Re-Compilations/sec"
124
125
-void dict_mssql_fill_instance_transactions(struct mssql_db_instance *mdi)
126
-{
127
- if (unlikely(!mdi || !mdi->parent || !mdi->parent->conn || !mdi->parent->conn->collect_buffer))
128
- return;
129
-
130
- char object_name[NETDATA_MAX_INSTANCE_OBJECT + 1] = {};
131
- long value = 0;
132
- SQLLEN col_object_len = 0, col_value_len = 0;
133
-
134
- SQLRETURN ret =
135
- SQLExecDirect(mdi->parent->conn->dbInstanceTransactionSTMT, (SQLCHAR *)NETDATA_QUERY_BUFFER_STATS, SQL_NTS);
136
- if (likely(netdata_mssql_check_result(ret))) {
137
- mdi->collecting_data = false;
138
- netdata_MSSQL_error(
139
- SQL_HANDLE_STMT,
140
- mdi->parent->conn->dbInstanceTransactionSTMT,
141
- NETDATA_MSSQL_ODBC_QUERY,
142
- mdi->parent->instanceID);
143
- goto enditransactions;
144
- }
145
-
146
- ret = SQLBindCol(
147
- mdi->parent->conn->dbInstanceTransactionSTMT, 1, SQL_C_CHAR, object_name, sizeof(object_name), &col_object_len);
148
- if (likely(netdata_mssql_check_result(ret))) {
149
- netdata_MSSQL_error(
150
- SQL_HANDLE_STMT,
151
- mdi->parent->conn->dbInstanceTransactionSTMT,
152
- NETDATA_MSSQL_ODBC_PREPARE,
153
- mdi->parent->instanceID);
154
- goto enditransactions;
155
- }
156
-
157
- ret =
158
- SQLBindCol(mdi->parent->conn->dbInstanceTransactionSTMT, 2, SQL_C_LONG, &value, sizeof(value), &col_value_len);
159
- if (likely(netdata_mssql_check_result(ret))) {
160
- netdata_MSSQL_error(
161
- SQL_HANDLE_STMT,
162
- mdi->parent->conn->dbInstanceTransactionSTMT,
163
- NETDATA_MSSQL_ODBC_PREPARE,
164
- mdi->parent->instanceID);
165
- goto enditransactions;
166
- }
167
-
168
- do {
169
- ret = SQLFetch(mdi->parent->conn->dbInstanceTransactionSTMT);
170
- switch (ret) {
171
- case SQL_SUCCESS:
172
- case SQL_SUCCESS_WITH_INFO:
173
- break;
174
- case SQL_NO_DATA:
175
- default:
176
- goto enditransactions;
177
- }
178
-
179
- if (col_object_len == SQL_NULL_DATA)
180
- object_name[0] = '\0';
181
- if (col_value_len == SQL_NULL_DATA)
182
- value = 0;
183
-
184
- // We cannot use strcmp, because buffer is filled with spaces instead NULL.
185
- if (unlikely(!strncmp(
186
- object_name,
187
- NETDATA_MSSQL_BUFFER_PAGE_READS_METRIC,
188
- sizeof(NETDATA_MSSQL_BUFFER_PAGE_READS_METRIC) - 1)))
189
- mdi->MSSQLBufferPageReads.current.Data = (ULONGLONG)value;
190
- else if (unlikely(!strncmp(
191
- object_name,
192
- NETDATA_MSSQL_BUFFER_PAGE_WRITES_METRIC,
193
- sizeof(NETDATA_MSSQL_BUFFER_PAGE_WRITES_METRIC) - 1)))
194
- mdi->MSSQLBufferPageWrites.current.Data = (ULONGLONG)value;
195
- else if (unlikely(!strncmp(
196
- object_name,
197
- NETDATA_MSSQL_BUFFER_PAGE_CACHE_METRIC,
198
- sizeof(NETDATA_MSSQL_BUFFER_PAGE_CACHE_METRIC) - 1)))
199
- mdi->MSSQLBufferCacheHits.current.Data = (ULONGLONG)value;
200
- else if (unlikely(!strncmp(
201
- object_name,
202
- NETDATA_MSSQL_BUFFER_CHECKPOINT_METRIC,
203
- sizeof(NETDATA_MSSQL_BUFFER_CHECKPOINT_METRIC) - 1)))
204
- mdi->MSSQLBufferCheckpointPages.current.Data = (ULONGLONG)value;
205
- else if (unlikely(!strncmp(
206
- object_name,
207
- NETDATA_MSSQL_BUFFER_PAGE_LIFE_METRIC,
208
- sizeof(NETDATA_MSSQL_BUFFER_PAGE_LIFE_METRIC) - 1)))
209
- mdi->MSSQLBufferPageLifeExpectancy.current.Data = (ULONGLONG)value;
210
- else if (unlikely(!strncmp(
211
- object_name,
212
- NETDATA_MSSQL_BUFFER_LAZY_WRITES_METRIC,
213
- sizeof(NETDATA_MSSQL_BUFFER_LAZY_WRITES_METRIC) - 1)))
214
- mdi->MSSQLBufferLazyWrite.current.Data = (ULONGLONG)value;
215
- else if (unlikely(!strncmp(
216
- object_name,
217
- NETDATA_MSSQL_BUFFER_PAGE_LOOKUPS_METRIC,
218
- sizeof(NETDATA_MSSQL_BUFFER_PAGE_LOOKUPS_METRIC) - 1)))
219
- mdi->MSSQLBufferPageLookups.current.Data = (ULONGLONG)value;
220
- else if (unlikely(!strncmp(
221
- object_name,
222
- NETDATA_MSSQL_STATS_COMPILATIONS_METRIC,
223
- sizeof(NETDATA_MSSQL_STATS_COMPILATIONS_METRIC) - 1)))
224
- mdi->MSSQLCompilations.current.Data = (ULONGLONG)value;
225
- else if (unlikely(!strncmp(
226
- object_name,
227
- NETDATA_MSSQL_STATS_RECOMPILATIONS_METRIC,
228
- sizeof(NETDATA_MSSQL_STATS_RECOMPILATIONS_METRIC) - 1)))
229
- mdi->MSSQLRecompilations.current.Data = (ULONGLONG)value;
230
- } while (true);
231
-
232
-enditransactions:
233
- netdata_MSSQL_release_results(mdi->parent->conn->dbInstanceTransactionSTMT);
234
-}
235
-
125
#define NETDATA_MSSQL_ACTIVE_TRANSACTIONS_METRIC "Active Transactions"
126
#define NETDATA_MSSQL_TRANSACTION_PER_SEC_METRIC "Transactions/sec"
127
#define NETDATA_MSSQL_WRITE_TRANSACTIONS_METRIC "Write Transactions/sec"
@@ -244,58 +133,180 @@ enditransactions:
133
#define NETDATA_MSSQL_LOCK_TIMEOUTS_METRIC "Lock Timeouts/sec"
134
#define NETDATA_MSSQL_LOCK_REQUESTS_METRIC "Lock Requests/sec"
135
247
-void dict_mssql_fill_transactions(struct mssql_db_instance *mdi, const char *dbname)
136
+bool netdata_mssql_counter_buffer(struct mssql_db_instance *mdi, char *inst_obj, long value)
137
+{
138
+ bool ret = false;
139
+ if (!strncmp(
140
+ inst_obj, NETDATA_MSSQL_STATS_COMPILATIONS_METRIC, sizeof(NETDATA_MSSQL_STATS_COMPILATIONS_METRIC) - 1)) {
141
+ mdi->MSSQLCompilations.current.Data = (ULONGLONG)value;
142
+ ret = true;
143
+ } else if (!strncmp(
144
+ inst_obj,
145
+ NETDATA_MSSQL_STATS_RECOMPILATIONS_METRIC,
146
+ sizeof(NETDATA_MSSQL_STATS_RECOMPILATIONS_METRIC) - 1)) {
147
+ mdi->MSSQLRecompilations.current.Data = (ULONGLONG)value;
148
+ ret = true;
149
+ } else if (!strncmp(
150
+ inst_obj,
151
+ NETDATA_MSSQL_BUFFER_PAGE_READS_METRIC,
152
+ sizeof(NETDATA_MSSQL_BUFFER_PAGE_READS_METRIC) - 1)) {
153
+ mdi->MSSQLBufferPageReads.current.Data = (ULONGLONG)value;
154
+ ret = true;
155
+ } else if (!strncmp(
156
+ inst_obj,
157
+ NETDATA_MSSQL_BUFFER_PAGE_WRITES_METRIC,
158
+ sizeof(NETDATA_MSSQL_BUFFER_PAGE_WRITES_METRIC) - 1)) {
159
+ mdi->MSSQLBufferPageWrites.current.Data = (ULONGLONG)value;
160
+ ret = true;
161
+ } else if (!strncmp(
162
+ inst_obj,
163
+ NETDATA_MSSQL_BUFFER_PAGE_CACHE_METRIC,
164
+ sizeof(NETDATA_MSSQL_BUFFER_PAGE_CACHE_METRIC) - 1)) {
165
+ mdi->MSSQLBufferCacheHits.current.Data = (ULONGLONG)value;
166
+ ret = true;
167
+ } else if (!strncmp(
168
+ inst_obj,
169
+ NETDATA_MSSQL_BUFFER_CHECKPOINT_METRIC,
170
+ sizeof(NETDATA_MSSQL_BUFFER_CHECKPOINT_METRIC) - 1)) {
171
+ mdi->MSSQLBufferCheckpointPages.current.Data = (ULONGLONG)value;
172
+ ret = true;
173
+ } else if (!strncmp(
174
+ inst_obj, NETDATA_MSSQL_BUFFER_PAGE_LIFE_METRIC, sizeof(NETDATA_MSSQL_BUFFER_PAGE_LIFE_METRIC) - 1)) {
175
+ mdi->MSSQLBufferPageLifeExpectancy.current.Data = (ULONGLONG)value;
176
+ ret = true;
177
+ } else if (!strncmp(
178
+ inst_obj,
179
+ NETDATA_MSSQL_BUFFER_LAZY_WRITES_METRIC,
180
+ sizeof(NETDATA_MSSQL_BUFFER_LAZY_WRITES_METRIC) - 1)) {
181
+ mdi->MSSQLBufferLazyWrite.current.Data = (ULONGLONG)value;
182
+ ret = true;
183
+ } else if (!strncmp(
184
+ inst_obj,
185
+ NETDATA_MSSQL_BUFFER_PAGE_LOOKUPS_METRIC,
186
+ sizeof(NETDATA_MSSQL_BUFFER_PAGE_LOOKUPS_METRIC) - 1)) {
187
+ mdi->MSSQLBufferPageLookups.current.Data = (ULONGLONG)value;
188
+ ret = true;
189
+ }
190
+
191
+ return ret;
192
+}
193
+
194
+bool netdata_mssql_counter_transaction(struct mssql_db_instance *mdi, char *object_name, long value)
195
+{
196
+ bool ret = false;
197
+ if (unlikely(!strncmp(
198
+ object_name,
199
+ NETDATA_MSSQL_ACTIVE_TRANSACTIONS_METRIC,
200
+ sizeof(NETDATA_MSSQL_ACTIVE_TRANSACTIONS_METRIC) - 1))) {
201
+ mdi->MSSQLDatabaseActiveTransactions.current.Data = (ULONGLONG)value;
202
+ ret = true;
203
+ } else if (unlikely(!strncmp(
204
+ object_name,
205
+ NETDATA_MSSQL_TRANSACTION_PER_SEC_METRIC,
206
+ sizeof(NETDATA_MSSQL_TRANSACTION_PER_SEC_METRIC) - 1))) {
207
+ mdi->MSSQLDatabaseTransactions.current.Data = (ULONGLONG)value;
208
+ ret = true;
209
+ } else if (unlikely(!strncmp(
210
+ object_name,
211
+ NETDATA_MSSQL_WRITE_TRANSACTIONS_METRIC,
212
+ sizeof(NETDATA_MSSQL_WRITE_TRANSACTIONS_METRIC) - 1))) {
213
+ mdi->MSSQLDatabaseWriteTransactions.current.Data = (ULONGLONG)value;
214
+ ret = true;
215
+ }
216
+
217
+ return ret;
218
+}
219
+
220
+bool netdata_mssql_counter_lock_and_log(struct mssql_db_instance *mdi, char *object_name, long value)
221
+{
222
+ bool ret = false;
223
+ if (unlikely(!strncmp(
224
+ object_name, NETDATA_MSSQL_BACKUP_RESTORE_METRIC, sizeof(NETDATA_MSSQL_BACKUP_RESTORE_METRIC) - 1))) {
225
+ mdi->MSSQLDatabaseBackupRestoreOperations.current.Data = (ULONGLONG)value;
226
+ ret = true;
227
+ } else if (unlikely(!strncmp(
228
+ object_name, NETDATA_MSSQL_LOG_FLUSHED_METRIC, sizeof(NETDATA_MSSQL_LOG_FLUSHED_METRIC) - 1))) {
229
+ mdi->MSSQLDatabaseLogFlushed.current.Data = (ULONGLONG)value;
230
+ ret = true;
231
+ } else if (unlikely(!strncmp(
232
+ object_name, NETDATA_MSSQL_LOG_FLUSHES_METRIC, sizeof(NETDATA_MSSQL_LOG_FLUSHES_METRIC) - 1))) {
233
+ mdi->MSSQLDatabaseLogFlushes.current.Data = (ULONGLONG)value;
234
+ ret = true;
235
+ } else if (unlikely(!strncmp(
236
+ object_name,
237
+ NETDATA_MSSQL_NUMBER_DEADLOCKS_METRIC,
238
+ sizeof(NETDATA_MSSQL_NUMBER_DEADLOCKS_METRIC) - 1))) {
239
+ mdi->MSSQLDatabaseDeadLockSec.current.Data = (ULONGLONG)value;
240
+ ret = true;
241
+ } else if (unlikely(!strncmp(
242
+ object_name, NETDATA_MSSQL_LOCK_WAITS_METRIC, sizeof(NETDATA_MSSQL_LOCK_WAITS_METRIC) - 1))) {
243
+ mdi->MSSQLDatabaseLockWaitSec.current.Data = (ULONGLONG)value;
244
+ ret = true;
245
+ } else if (unlikely(!strncmp(
246
+ object_name, NETDATA_MSSQL_LOCK_TIMEOUTS_METRIC, sizeof(NETDATA_MSSQL_LOCK_TIMEOUTS_METRIC) - 1))) {
247
+ mdi->MSSQLDatabaseLockTimeoutsSec.current.Data = (ULONGLONG)value;
248
+ ret = true;
249
+ } else if (unlikely(!strncmp(
250
+ object_name, NETDATA_MSSQL_LOCK_REQUESTS_METRIC, sizeof(NETDATA_MSSQL_LOCK_REQUESTS_METRIC) - 1))) {
251
+ mdi->MSSQLDatabaseLockRequestsSec.current.Data = (ULONGLONG)value;
252
+ ret = true;
253
+ }
254
+
255
+ return ret;
256
+}
257
+
258
+void dict_mssql_fill_performance_counters(struct mssql_db_instance *mdi, const char *dbname)
259
{
260
char object_name[NETDATA_MAX_INSTANCE_OBJECT + 1] = {};
261
long value = 0;
262
SQLLEN col_object_len = 0, col_value_len = 0;
263
253
- if (unlikely(!mdi->parent->conn->collect_transactions))
254
- goto endtransactions;
255
-
256
- if (likely(mdi->collect_instance))
257
- dict_mssql_fill_instance_transactions(mdi);
264
+ if (unlikely(
265
+ !mdi->parent->conn->collect_transactions && !mdi->parent->conn->collect_buffer && !mdi->collect_instance))
266
+ return;
267
259
- SQLCHAR query[sizeof(NETDATA_QUERY_TRANSACTIONS_MASK) + 2 * NETDATA_MAX_INSTANCE_OBJECT + 1];
268
+ SQLCHAR query[sizeof(NETDATA_QUERY_PERFORMANCE_COUNTER) + 2 * NETDATA_MAX_INSTANCE_OBJECT + 1];
269
+ // We are using the database name instead of the instance name because, on Windows, the instance name having the metrics
270
+ // is often the same as the database name.
271
snprintfz(
272
(char *)query,
262
- sizeof(NETDATA_QUERY_TRANSACTIONS_MASK) + 2 * NETDATA_MAX_INSTANCE_OBJECT,
263
- NETDATA_QUERY_TRANSACTIONS_MASK,
273
+ sizeof(NETDATA_QUERY_PERFORMANCE_COUNTER) + 2 * NETDATA_MAX_INSTANCE_OBJECT,
274
+ NETDATA_QUERY_PERFORMANCE_COUNTER,
275
dbname,
276
dbname);
277
267
- SQLRETURN ret = SQLExecDirect(mdi->parent->conn->dbTransactionSTMT, (SQLCHAR *)query, SQL_NTS);
278
+ SQLRETURN ret = SQLExecDirect(mdi->parent->conn->dbPerfCounterSTMT, (SQLCHAR *)query, SQL_NTS);
279
if (likely(netdata_mssql_check_result(ret))) {
280
mdi->collecting_data = false;
281
netdata_MSSQL_error(
271
- SQL_HANDLE_STMT, mdi->parent->conn->dbTransactionSTMT, NETDATA_MSSQL_ODBC_QUERY, mdi->parent->instanceID);
272
- goto endtransactions;
282
+ SQL_HANDLE_STMT, mdi->parent->conn->dbPerfCounterSTMT, NETDATA_MSSQL_ODBC_QUERY, mdi->parent->instanceID);
283
+ goto endcounters;
284
}
285
286
ret = SQLBindCol(
276
- mdi->parent->conn->dbTransactionSTMT, 1, SQL_C_CHAR, object_name, sizeof(object_name), &col_object_len);
287
+ mdi->parent->conn->dbPerfCounterSTMT, 1, SQL_C_CHAR, object_name, sizeof(object_name), &col_object_len);
288
if (likely(netdata_mssql_check_result(ret))) {
289
netdata_MSSQL_error(
279
- SQL_HANDLE_STMT, mdi->parent->conn->dbTransactionSTMT, NETDATA_MSSQL_ODBC_PREPARE, mdi->parent->instanceID);
280
- goto endtransactions;
290
+ SQL_HANDLE_STMT, mdi->parent->conn->dbPerfCounterSTMT, NETDATA_MSSQL_ODBC_PREPARE, mdi->parent->instanceID);
291
+ goto endcounters;
292
}
293
283
- ret = SQLBindCol(mdi->parent->conn->dbTransactionSTMT, 2, SQL_C_LONG, &value, sizeof(value), &col_value_len);
294
+ ret = SQLBindCol(mdi->parent->conn->dbPerfCounterSTMT, 2, SQL_C_LONG, &value, sizeof(value), &col_value_len);
295
if (likely(netdata_mssql_check_result(ret))) {
296
netdata_MSSQL_error(
286
- SQL_HANDLE_STMT, mdi->parent->conn->dbTransactionSTMT, NETDATA_MSSQL_ODBC_PREPARE, mdi->parent->instanceID);
287
- goto endtransactions;
297
+ SQL_HANDLE_STMT, mdi->parent->conn->dbPerfCounterSTMT, NETDATA_MSSQL_ODBC_PREPARE, mdi->parent->instanceID);
298
+ goto endcounters;
299
}
300
301
do {
291
- ret = SQLFetch(mdi->parent->conn->dbTransactionSTMT);
302
+ ret = SQLFetch(mdi->parent->conn->dbPerfCounterSTMT);
303
switch (ret) {
304
case SQL_SUCCESS:
305
case SQL_SUCCESS_WITH_INFO:
306
break;
307
case SQL_NO_DATA:
308
default:
298
- goto endtransactions;
309
+ goto endcounters;
310
}
311
312
if (col_object_len == SQL_NULL_DATA)
@@ -303,50 +314,19 @@ void dict_mssql_fill_transactions(struct mssql_db_instance *mdi, const char *dbn
314
if (col_value_len == SQL_NULL_DATA)
315
value = 0;
316
306
- // We cannot use strcmp, because buffer is filled with spaces instead NULL.
307
- if (unlikely(!strncmp(
308
- object_name,
309
- NETDATA_MSSQL_ACTIVE_TRANSACTIONS_METRIC,
310
- sizeof(NETDATA_MSSQL_ACTIVE_TRANSACTIONS_METRIC) - 1)))
311
- mdi->MSSQLDatabaseActiveTransactions.current.Data = (ULONGLONG)value;
312
- else if (unlikely(!strncmp(
313
- object_name,
314
- NETDATA_MSSQL_TRANSACTION_PER_SEC_METRIC,
315
- sizeof(NETDATA_MSSQL_TRANSACTION_PER_SEC_METRIC) - 1)))
316
- mdi->MSSQLDatabaseTransactions.current.Data = (ULONGLONG)value;
317
- else if (unlikely(!strncmp(
318
- object_name,
319
- NETDATA_MSSQL_WRITE_TRANSACTIONS_METRIC,
320
- sizeof(NETDATA_MSSQL_WRITE_TRANSACTIONS_METRIC) - 1)))
321
- mdi->MSSQLDatabaseWriteTransactions.current.Data = (ULONGLONG)value;
322
- else if (unlikely(!strncmp(
323
- object_name, NETDATA_MSSQL_BACKUP_RESTORE_METRIC, sizeof(NETDATA_MSSQL_BACKUP_RESTORE_METRIC) - 1)))
324
- mdi->MSSQLDatabaseBackupRestoreOperations.current.Data = (ULONGLONG)value;
325
- else if (unlikely(!strncmp(
326
- object_name, NETDATA_MSSQL_LOG_FLUSHED_METRIC, sizeof(NETDATA_MSSQL_LOG_FLUSHED_METRIC) - 1)))
327
- mdi->MSSQLDatabaseLogFlushed.current.Data = (ULONGLONG)value;
328
- else if (unlikely(!strncmp(
329
- object_name, NETDATA_MSSQL_LOG_FLUSHES_METRIC, sizeof(NETDATA_MSSQL_LOG_FLUSHES_METRIC) - 1)))
330
- mdi->MSSQLDatabaseLogFlushes.current.Data = (ULONGLONG)value;
331
- else if (unlikely(!strncmp(
332
- object_name,
333
- NETDATA_MSSQL_NUMBER_DEADLOCKS_METRIC,
334
- sizeof(NETDATA_MSSQL_NUMBER_DEADLOCKS_METRIC) - 1)))
335
- mdi->MSSQLDatabaseDeadLockSec.current.Data = (ULONGLONG)value;
336
- else if (unlikely(!strncmp(
337
- object_name, NETDATA_MSSQL_LOCK_WAITS_METRIC, sizeof(NETDATA_MSSQL_LOCK_WAITS_METRIC) - 1)))
338
- mdi->MSSQLDatabaseLockWaitSec.current.Data = (ULONGLONG)value;
339
- else if (unlikely(!strncmp(
340
- object_name, NETDATA_MSSQL_LOCK_TIMEOUTS_METRIC, sizeof(NETDATA_MSSQL_LOCK_TIMEOUTS_METRIC) - 1)))
341
- mdi->MSSQLDatabaseLockTimeoutsSec.current.Data = (ULONGLONG)value;
342
- else if (unlikely(!strncmp(
343
- object_name, NETDATA_MSSQL_LOCK_REQUESTS_METRIC, sizeof(NETDATA_MSSQL_LOCK_REQUESTS_METRIC) - 1)))
344
- mdi->MSSQLDatabaseLockRequestsSec.current.Data = (ULONGLONG)value;
317
+ if (netdata_mssql_counter_buffer(mdi, object_name, value))
318
+ continue;
319
+
320
+ if (netdata_mssql_counter_transaction(mdi, object_name, value))
321
+ continue;
322
+
323
+ if (netdata_mssql_counter_lock_and_log(mdi, object_name, value))
324
+ continue;
325
326
} while (true);
327
348
-endtransactions:
349
- netdata_MSSQL_release_results(mdi->parent->conn->dbTransactionSTMT);
328
+endcounters:
329
+ netdata_MSSQL_release_results(mdi->parent->conn->dbPerfCounterSTMT);
330
}
331
332
void dict_mssql_fill_locks(struct mssql_db_instance *mdi, const char *dbname)
@@ -453,8 +433,8 @@ int dict_mssql_fill_waits(struct mssql_instance *mi)
433
goto endwait;
434
}
435
456
- ret =
457
- SQLBindCol(mi->conn->dbWaitsSTMT, 3, SQL_C_SBIGINT, &resource_wait, sizeof(resource_wait), &col_resource_wait_len);
436
+ ret = SQLBindCol(
437
+ mi->conn->dbWaitsSTMT, 3, SQL_C_SBIGINT, &resource_wait, sizeof(resource_wait), &col_resource_wait_len);
438
if (likely(netdata_mssql_check_result(ret))) {
439
netdata_MSSQL_error(SQL_HANDLE_STMT, mi->conn->dbWaitsSTMT, NETDATA_MSSQL_ODBC_PREPARE, mi->instanceID);
440
goto endwait;
@@ -472,8 +452,8 @@ int dict_mssql_fill_waits(struct mssql_instance *mi)
452
goto endwait;
453
}
454
475
- ret =
476
- SQLBindCol(mi->conn->dbWaitsSTMT, 6, SQL_C_SBIGINT, &waiting_tasks, sizeof(waiting_tasks), &col_waiting_tasks_len);
455
+ ret = SQLBindCol(
456
+ mi->conn->dbWaitsSTMT, 6, SQL_C_SBIGINT, &waiting_tasks, sizeof(waiting_tasks), &col_waiting_tasks_len);
457
if (likely(netdata_mssql_check_result(ret))) {
458
netdata_MSSQL_error(SQL_HANDLE_STMT, mi->conn->dbWaitsSTMT, NETDATA_MSSQL_ODBC_PREPARE, mi->instanceID);
459
goto endwait;
@@ -747,7 +727,7 @@ void dict_mssql_fill_replication(struct mssql_db_instance *mdi)
727
if (publisher_len == SQL_NULL_DATA)
728
publisher[0] = '\0';
729
750
- if(unlikely(!publisher_db[0] || !publication[0]))
730
+ if (unlikely(!publisher_db[0] || !publication[0]))
731
continue;
732
733
snprintfz(key, sizeof(key) - 1, "%s:%s", publisher_db, publication);
@@ -783,6 +763,7 @@ endreplication:
763
(void)netdata_select_db(mdi->parent->conn->netdataSQLHDBc, "master");
764
netdata_MSSQL_release_results(mdi->parent->conn->dbReplicationPublisher);
765
}
766
+
767
int dict_mssql_databases_run_queries(const DICTIONARY_ITEM *item __maybe_unused, void *value, void *data __maybe_unused)
768
{
769
struct mssql_db_instance *mdi = value;
@@ -802,7 +783,7 @@ int dict_mssql_databases_run_queries(const DICTIONARY_ITEM *item __maybe_unused,
783
goto enddrunquery;
784
}
785
805
- dict_mssql_fill_transactions(mdi, dbname);
786
+ dict_mssql_fill_performance_counters(mdi, dbname);
787
dict_mssql_fill_locks(mdi, dbname);
788
789
if (likely(mdi->running_replication && mdi->parent->conn->collect_replication))
@@ -1046,14 +1027,10 @@ static void netdata_mssql_fill_blocked_processes_query(struct mssql_instance *mi
1027
}
1028
1029
ret = SQLBindCol(
1049
- mi->conn->dbSQLBlockedProcesses,
1050
- 1,
1051
- SQL_C_LONG,
1052
- &blocked_processes,
1053
- sizeof(blocked_processes),
1054
- &col_len);
1030
+ mi->conn->dbSQLBlockedProcesses, 1, SQL_C_LONG, &blocked_processes, sizeof(blocked_processes), &col_len);
1031
if (likely(netdata_mssql_check_result(ret))) {
1056
- netdata_MSSQL_error(SQL_HANDLE_STMT, mi->conn->dbSQLBlockedProcesses, NETDATA_MSSQL_ODBC_PREPARE, mi->instanceID);
1032
+ netdata_MSSQL_error(
1033
+ SQL_HANDLE_STMT, mi->conn->dbSQLBlockedProcesses, NETDATA_MSSQL_ODBC_PREPARE, mi->instanceID);
1034
goto end_blocked_processes;
1035
}
1036
@@ -1195,7 +1172,7 @@ static bool netdata_MSSQL_initialize_connection(struct netdata_mssql_conn *nmc)
1172
goto endMSSQLInitializationConnection;
1173
}
1174
1198
- ret = SQLAllocHandle(SQL_HANDLE_STMT, nmc->netdataSQLHDBc, &nmc->dbTransactionSTMT);
1175
+ ret = SQLAllocHandle(SQL_HANDLE_STMT, nmc->netdataSQLHDBc, &nmc->dbPerfCounterSTMT);
1176
if (likely(netdata_mssql_check_result(ret))) {
1177
retConn = FALSE;
1178
goto endMSSQLInitializationConnection;
@@ -1477,8 +1454,8 @@ static void netdata_read_config_options()
1454
dbconn->collect_data_size = inicfg_get_boolean(&netdata_config, section_name, "collect database size", true);
1455
dbconn->collect_user_connections =
1456
inicfg_get_boolean(&netdata_config, section_name, "collect user connections", true);
1480
- dbconn->collect_blocked_processes = inicfg_get_boolean(
1481
- &netdata_config, section_name, "collect blocked processes", true);
1457
+ dbconn->collect_blocked_processes =
1458
+ inicfg_get_boolean(&netdata_config, section_name, "collect blocked processes", true);
1459
dbconn->is_connected = FALSE;
1460
1461
netdata_mount_mssql_connection_string(dbconn);
@@ -1527,7 +1504,6 @@ void dict_mssql_insert_cb(const DICTIONARY_ITEM *item __maybe_unused, void *valu
1504
mssql_fill_initial_instances(mi);
1505
}
1506
1530
-
1507
if (unlikely(!mi->databases)) {
1508
mi->databases = dictionary_create_advanced(
1509
DICT_OPTION_DONT_OVERWRITE_VALUE | DICT_OPTION_FIXED_SIZE, NULL, sizeof(struct mssql_db_instance));
@@ -1701,18 +1677,18 @@ void netdata_mssql_blocked_processes_chart(struct mssql_instance *mi, int update
1677
snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_blocked_process", mi->instanceID);
1678
netdata_fix_chart_name(id);
1679
mi->st_process_blocked = rrdset_create_localhost(
1704
- "mssql",
1705
- id,
1706
- NULL,
1707
- "processes",
1708
- "mssql.instance_blocked_processes",
1709
- "Blocked processes",
1710
- "process",
1711
- PLUGIN_WINDOWS_NAME,
1712
- "PerflibMSSQL",
1713
- PRIO_MSSQL_BLOCKED_PROCESSES,
1714
- update_every,
1715
- RRDSET_TYPE_LINE);
1680
+ "mssql",
1681
+ id,
1682
+ NULL,
1683
+ "processes",
1684
+ "mssql.instance_blocked_processes",
1685
+ "Blocked processes",
1686
+ "process",
1687
+ PLUGIN_WINDOWS_NAME,
1688
+ "PerflibMSSQL",
1689
+ PRIO_MSSQL_BLOCKED_PROCESSES,
1690
+ update_every,
1691
+ RRDSET_TYPE_LINE);
1692
1693
mi->rd_process_blocked = rrddim_add(mi->st_process_blocked, "blocked", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1694
@@ -1720,11 +1696,12 @@ void netdata_mssql_blocked_processes_chart(struct mssql_instance *mi, int update
1696
}
1697
1698
rrddim_set_by_pointer(
1723
- mi->st_process_blocked, mi->rd_process_blocked, (collected_number)mi->MSSQLBlockedProcesses.current.Data);
1699
+ mi->st_process_blocked, mi->rd_process_blocked, (collected_number)mi->MSSQLBlockedProcesses.current.Data);
1700
rrdset_done(mi->st_process_blocked);
1701
}
1702
1727
-static void do_mssql_blocked_processes(PERF_DATA_BLOCK *pDataBlock __maybe_unused, struct mssql_instance *mi, int update_every)
1703
+static void
1704
+do_mssql_blocked_processes(PERF_DATA_BLOCK *pDataBlock __maybe_unused, struct mssql_instance *mi, int update_every)
1705
{
1706
if (unlikely(!mi || !mi->conn || !mi->conn->collect_blocked_processes))
1707
return;
src/collectors/windows.plugin/perflib-mssql-queries.h
+3
-6
@@ -23,11 +23,8 @@
23
// https://learn.microsoft.com/en-us/sql/relational-databases/system-compatibility-views/sys-sysprocesses-transact-sql?view=sql-server-ver16
24
// SQL SERVER BEFORE 2008 DOES NOT HAVE DATA IN THIS TABLE
25
// https://github.com/influxdata/telegraf/blob/081dfa26e80d8764fb7f9aac5230e81584b62b56/plugins/inputs/sqlserver/sqlqueriesV2.go#L1259
26
-#define NETDATA_QUERY_TRANSACTIONS_MASK \
27
- "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');"
28
-
29
-#define NETDATA_QUERY_BUFFER_STATS \
30
- "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');"
26
+#define NETDATA_QUERY_PERFORMANCE_COUNTER \
27
+ "SELECT counter_name, cntr_value FROM %s.sys.dm_os_performance_counters WHERE ltrim(rtrim(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', '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');"
28
29
#define NETDATA_QUERY_CHECK_PERM \
30
"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;"
@@ -669,7 +666,7 @@ struct netdata_mssql_conn {
666
SQLHSTMT checkPermSTMT;
667
SQLHSTMT databaseListSTMT;
668
SQLHSTMT dataFileSizeSTMT;
672
- SQLHSTMT dbTransactionSTMT;
669
+ SQLHSTMT dbPerfCounterSTMT;
670
SQLHSTMT dbInstanceTransactionSTMT;
671
SQLHSTMT dbWaitsSTMT;
672
SQLHSTMT dbLocksSTMT;