@cryptotaxi247 / netdata-1 / commits / 29ac15950

Fix MSSQL algorithm (Windows.plugin) (#19035)

Co-authored-by: ilyam8 <ilya@netdata.cloud>

thiagoftsm committed Nov 20, 2024 at 22:33 UTC 29ac1595004db35053dc0d586c7143d03a58cf3b
1 file changed +259 -205
src/collectors/windows.plugin/perflib-mssql.c
+259 -205
@@ -71,13 +71,6 @@ struct mssql_instance {
71 RRDSET *st_deadLocks;
72 DICTIONARY *locks_instances;
73
74 - RRDSET *st_db_data_file_size;
75 - RRDSET *st_db_active_transactions;
76 - RRDSET *st_db_backup_restore_operations;
77 - RRDSET *st_db_log_flushed;
78 - RRDSET *st_db_log_flushes;
79 - RRDSET *st_db_transactions;
80 - RRDSET *st_db_write_transactions;
74 DICTIONARY *databases;
75
76 RRDSET *st_conn_memory;
@@ -112,6 +105,13 @@ struct mssql_instance {
105 COUNTER_DATA MSSQLRecompilations;
106 };
107
108 +enum lock_instance_idx {
109 + NETDATA_MSSQL_ENUM_MLI_IDX_WAIT,
110 + NETDATA_MSSQL_ENUM_MLI_IDX_DEAD_LOCKS,
111 +
112 + NETDATA_MSSQL_ENUM_MLI_IDX_END
113 +};
114 +
115 struct mssql_lock_instance {
116 struct mssql_instance *parent;
117
@@ -120,18 +120,32 @@ struct mssql_lock_instance {
120
121 RRDDIM *rd_lockWait;
122 RRDDIM *rd_deadLocks;
123 +
124 + uint32_t updated;
125 +};
126 +
127 +enum db_instance_idx {
128 + NETDATA_MSSQL_ENUM_MDI_IDX_FILE_SIZE,
129 + NETDATA_MSSQL_ENUM_MDI_IDX_ACTIVE_TRANSACTIONS,
130 + NETDATA_MSSQL_ENUM_MDI_IDX_BACKUP_RESTORE_OP,
131 + NETDATA_MSSQL_ENUM_MDI_IDX_LOG_FLUSHED,
132 + NETDATA_MSSQL_ENUM_MDI_IDX_LOG_FLUSHES,
133 + NETDATA_MSSQL_ENUM_MDI_IDX_TRANSACTIONS,
134 + NETDATA_MSSQL_ENUM_MDI_IDX_WRITE_TRANSACTIONS,
135 +
136 + NETDATA_MSSQL_ENUM_MDI_IDX_END
137 };
138
139 struct mssql_db_instance {
140 struct mssql_instance *parent;
141
128 - COUNTER_DATA MSSQLDatabaseActiveTransactions;
129 - COUNTER_DATA MSSQLDatabaseBackupRestoreOperations;
130 - COUNTER_DATA MSSQLDatabaseDataFileSize;
131 - COUNTER_DATA MSSQLDatabaseLogFlushed;
132 - COUNTER_DATA MSSQLDatabaseLogFlushes;
133 - COUNTER_DATA MSSQLDatabaseTransactions;
134 - COUNTER_DATA MSSQLDatabaseWriteTransactions;
142 + RRDSET *st_db_data_file_size;
143 + RRDSET *st_db_active_transactions;
144 + RRDSET *st_db_backup_restore_operations;
145 + RRDSET *st_db_log_flushed;
146 + RRDSET *st_db_log_flushes;
147 + RRDSET *st_db_transactions;
148 + RRDSET *st_db_write_transactions;
149
150 RRDDIM *rd_db_data_file_size;
151 RRDDIM *rd_db_active_transactions;
@@ -140,6 +154,16 @@ struct mssql_db_instance {
154 RRDDIM *rd_db_log_flushes;
155 RRDDIM *rd_db_transactions;
156 RRDDIM *rd_db_write_transactions;
157 +
158 + COUNTER_DATA MSSQLDatabaseActiveTransactions;
159 + COUNTER_DATA MSSQLDatabaseBackupRestoreOperations;
160 + COUNTER_DATA MSSQLDatabaseDataFileSize;
161 + COUNTER_DATA MSSQLDatabaseLogFlushed;
162 + COUNTER_DATA MSSQLDatabaseLogFlushes;
163 + COUNTER_DATA MSSQLDatabaseTransactions;
164 + COUNTER_DATA MSSQLDatabaseWriteTransactions;
165 +
166 + uint32_t updated;
167 };
168
169 static DICTIONARY *mssql_instances = NULL;
@@ -182,7 +206,6 @@ static void initialize_mssql_objects(struct mssql_instance *p, const char *insta
206 p->objectName[NETDATA_MSSQL_ACCESS_METHODS] = strdup(name);
207
208 p->instanceID = strdup(instance);
185 - netdata_fix_chart_name(p->instanceID);
209 }
210
211 static inline void initialize_mssql_keys(struct mssql_instance *p) {
@@ -226,7 +249,6 @@ void dict_mssql_insert_databases_cb(const DICTIONARY_ITEM *item __maybe_unused,
249 struct mssql_db_instance *ptr = value;
250
251 ptr->MSSQLDatabaseDataFileSize.key = "Data File(s) Size (KB)";
229 -
252 ptr->MSSQLDatabaseActiveTransactions.key = "Active Transactions";
253 ptr->MSSQLDatabaseBackupRestoreOperations.key = "Backup/Restore Throughput/sec";
254 ptr->MSSQLDatabaseLogFlushed.key = "Log Bytes Flushed/sec";
@@ -315,19 +337,21 @@ static int initialize(void) {
337
338 static void do_mssql_general_stats(PERF_DATA_BLOCK *pDataBlock, struct mssql_instance *p, int update_every) {
339 char id[RRD_ID_LENGTH_MAX + 1];
340 +
341 PERF_OBJECT_TYPE *pObjectType = perflibFindObjectTypeByName(pDataBlock, p->objectName[NETDATA_MSSQL_GENERAL_STATS]);
342 if (!pObjectType)
343 return;
344
345 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->MSSQLUserConnections)) {
323 - snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_user_connection", p->instanceID);
346 if (!p->st_user_connections) {
347 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_user_connections", p->instanceID);
348 + netdata_fix_chart_name(id);
349 p->st_user_connections = rrdset_create_localhost(
350 "mssql",
351 id,
352 NULL,
353 "connections",
330 - "mssql.instance_user_connection",
354 + "mssql.instance_user_connections",
355 "User connections",
356 "connections",
357 PLUGIN_WINDOWS_NAME,
@@ -336,8 +360,7 @@ static void do_mssql_general_stats(PERF_DATA_BLOCK *pDataBlock, struct mssql_ins
360 update_every,
361 RRDSET_TYPE_LINE);
362
339 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_genstats_user_connections", p->instanceID);
340 - p->rd_user_connections = rrddim_add(p->st_user_connections, id, "user", 1, 1, RRD_ALGORITHM_ABSOLUTE);
363 + p->rd_user_connections = rrddim_add(p->st_user_connections, "user", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
364
365 rrdlabels_add(p->st_user_connections->rrdlabels, "mssql_instance", p->instanceID, RRDLABEL_SRC_AUTO);
366 }
@@ -348,8 +371,9 @@ static void do_mssql_general_stats(PERF_DATA_BLOCK *pDataBlock, struct mssql_ins
371 }
372
373 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->MSSQLBlockedProcesses)) {
351 - snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_blocked_process", p->instanceID);
374 if (!p->st_process_blocked) {
375 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_blocked_process", p->instanceID);
376 + netdata_fix_chart_name(id);
377 p->st_process_blocked = rrdset_create_localhost(
378 "mssql",
379 id,
@@ -364,8 +388,7 @@ static void do_mssql_general_stats(PERF_DATA_BLOCK *pDataBlock, struct mssql_ins
388 update_every,
389 RRDSET_TYPE_LINE);
390
367 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_genstats_blocked_processes", p->instanceID);
368 - p->rd_process_blocked = rrddim_add(p->st_process_blocked, id, "blocked", 1, 1, RRD_ALGORITHM_ABSOLUTE);
391 + p->rd_process_blocked = rrddim_add(p->st_process_blocked, "blocked", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
392
393 rrdlabels_add(p->st_process_blocked->rrdlabels, "mssql_instance", p->instanceID, RRDLABEL_SRC_AUTO);
394 }
@@ -378,13 +401,15 @@ static void do_mssql_general_stats(PERF_DATA_BLOCK *pDataBlock, struct mssql_ins
401
402 static void do_mssql_sql_statistics(PERF_DATA_BLOCK *pDataBlock, struct mssql_instance *p, int update_every) {
403 char id[RRD_ID_LENGTH_MAX + 1];
404 +
405 PERF_OBJECT_TYPE *pObjectType = perflibFindObjectTypeByName(pDataBlock, p->objectName[NETDATA_MSSQL_SQL_STATS]);
406 if (!pObjectType)
407 return;
408
409 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->MSSQLStatsAutoParameterization)) {
386 - snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_sqlstats_auto_parameterization_attempts", p->instanceID);
410 if (!p->st_stats_auto_param) {
411 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_sqlstats_auto_parameterization_attempts", p->instanceID);
412 + netdata_fix_chart_name(id);
413 p->st_stats_auto_param = rrdset_create_localhost(
414 "mssql",
415 id,
@@ -399,9 +424,8 @@ static void do_mssql_sql_statistics(PERF_DATA_BLOCK *pDataBlock, struct mssql_in
424 update_every,
425 RRDSET_TYPE_LINE);
426
402 - snprintfz(
403 - id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_sqlstats_auto_parameterization_attempts", p->instanceID);
404 - p->rd_stats_auto_param = rrddim_add(p->st_stats_auto_param, id, "failed", 1, 1, RRD_ALGORITHM_INCREMENTAL);
427 + p->rd_stats_auto_param =
428 + rrddim_add(p->st_stats_auto_param, "failed", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
429
430 rrdlabels_add(p->st_stats_auto_param->rrdlabels, "mssql_instance", p->instanceID, RRDLABEL_SRC_AUTO);
431 }
@@ -414,8 +438,9 @@ static void do_mssql_sql_statistics(PERF_DATA_BLOCK *pDataBlock, struct mssql_in
438 }
439
440 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->MSSQLStatsBatchRequests)) {
417 - snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_sqlstats_batch_requests", p->instanceID);
441 if (!p->st_stats_batch_request) {
442 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_sqlstats_batch_requests", p->instanceID);
443 + netdata_fix_chart_name(id);
444 p->st_stats_batch_request = rrdset_create_localhost(
445 "mssql",
446 id,
@@ -430,9 +455,8 @@ static void do_mssql_sql_statistics(PERF_DATA_BLOCK *pDataBlock, struct mssql_in
455 update_every,
456 RRDSET_TYPE_LINE);
457
433 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_sqlstats_batch_requests", p->instanceID);
458 p->rd_stats_batch_request =
435 - rrddim_add(p->st_stats_batch_request, id, "batch", 1, 1, RRD_ALGORITHM_INCREMENTAL);
459 + rrddim_add(p->st_stats_batch_request, "batch", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
460
461 rrdlabels_add(p->st_stats_batch_request->rrdlabels, "mssql_instance", p->instanceID, RRDLABEL_SRC_AUTO);
462 }
@@ -445,8 +469,9 @@ static void do_mssql_sql_statistics(PERF_DATA_BLOCK *pDataBlock, struct mssql_in
469 }
470
471 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->MSSQLStatSafeAutoParameterization)) {
448 - snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_sqlstats_safe_auto_parameterization_attempts", p->instanceID);
472 if (!p->st_stats_safe_auto) {
473 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_sqlstats_safe_auto_parameterization_attempts", p->instanceID);
474 + netdata_fix_chart_name(id);
475 p->st_stats_safe_auto = rrdset_create_localhost(
476 "mssql",
477 id,
@@ -461,9 +486,7 @@ static void do_mssql_sql_statistics(PERF_DATA_BLOCK *pDataBlock, struct mssql_in
486 update_every,
487 RRDSET_TYPE_LINE);
488
464 - snprintfz(
465 - id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_sqlstats_safe_auto_parameterization_attempts", p->instanceID);
466 - p->rd_stats_safe_auto = rrddim_add(p->st_stats_safe_auto, id, "safe", 1, 1, RRD_ALGORITHM_INCREMENTAL);
489 + p->rd_stats_safe_auto = rrddim_add(p->st_stats_safe_auto, "safe", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
490
491 rrdlabels_add(p->st_stats_safe_auto->rrdlabels, "mssql_instance", p->instanceID, RRDLABEL_SRC_AUTO);
492 }
@@ -476,8 +499,9 @@ static void do_mssql_sql_statistics(PERF_DATA_BLOCK *pDataBlock, struct mssql_in
499 }
500
501 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->MSSQLCompilations)) {
479 - snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_sqlstats_sql_compilations", p->instanceID);
502 if (!p->st_stats_compilation) {
503 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_sqlstats_sql_compilations", p->instanceID);
504 + netdata_fix_chart_name(id);
505 p->st_stats_compilation = rrdset_create_localhost(
506 "mssql",
507 id,
@@ -492,9 +516,8 @@ static void do_mssql_sql_statistics(PERF_DATA_BLOCK *pDataBlock, struct mssql_in
516 update_every,
517 RRDSET_TYPE_LINE);
518
495 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_sqlstats_sql_compilations", p->instanceID);
519 p->rd_stats_compilation =
497 - rrddim_add(p->st_stats_compilation, id, "compilations", 1, 1, RRD_ALGORITHM_INCREMENTAL);
520 + rrddim_add(p->st_stats_compilation, "compilations", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
521
522 rrdlabels_add(p->st_stats_compilation->rrdlabels, "mssql_instance", p->instanceID, RRDLABEL_SRC_AUTO);
523 }
@@ -505,8 +528,9 @@ static void do_mssql_sql_statistics(PERF_DATA_BLOCK *pDataBlock, struct mssql_in
528 }
529
530 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->MSSQLRecompilations)) {
508 - snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_sqlstats_sql_recompilations", p->instanceID);
531 if (!p->st_stats_recompiles) {
532 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_sqlstats_sql_recompilations", p->instanceID);
533 + netdata_fix_chart_name(id);
534 p->st_stats_recompiles = rrdset_create_localhost(
535 "mssql",
536 id,
@@ -521,9 +545,8 @@ static void do_mssql_sql_statistics(PERF_DATA_BLOCK *pDataBlock, struct mssql_in
545 update_every,
546 RRDSET_TYPE_LINE);
547
524 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_sqlstats_sql_recompilations", p->instanceID);
548 p->rd_stats_recompiles =
526 - rrddim_add(p->st_stats_recompiles, id, "recompiles", 1, 1, RRD_ALGORITHM_INCREMENTAL);
549 + rrddim_add(p->st_stats_recompiles, "recompiles", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
550
551 rrdlabels_add(p->st_stats_recompiles->rrdlabels, "mssql_instance", p->instanceID, RRDLABEL_SRC_AUTO);
552 }
@@ -536,14 +559,16 @@ static void do_mssql_sql_statistics(PERF_DATA_BLOCK *pDataBlock, struct mssql_in
559
560 static void do_mssql_buffer_management(PERF_DATA_BLOCK *pDataBlock, struct mssql_instance *p, int update_every) {
561 char id[RRD_ID_LENGTH_MAX + 1];
562 +
563 PERF_OBJECT_TYPE *pObjectType =
564 perflibFindObjectTypeByName(pDataBlock, p->objectName[NETDATA_MSSQL_BUFFER_MANAGEMENT]);
565 if (!pObjectType)
566 return;
567
568 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->MSSQLBufferCacheHits)) {
545 - snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_cache_hit_ratio", p->instanceID);
569 if (!p->st_buff_cache_hits) {
570 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_cache_hit_ratio", p->instanceID);
571 + netdata_fix_chart_name(id);
572 p->st_buff_cache_hits = rrdset_create_localhost(
573 "mssql",
574 id,
@@ -558,8 +583,7 @@ static void do_mssql_buffer_management(PERF_DATA_BLOCK *pDataBlock, struct mssql
583 update_every,
584 RRDSET_TYPE_LINE);
585
561 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_cache_hit_ratio", p->instanceID);
562 - p->rd_buff_cache_hits = rrddim_add(p->st_buff_cache_hits, id, "hit_ratio", 1, 1, RRD_ALGORITHM_ABSOLUTE);
586 + p->rd_buff_cache_hits = rrddim_add(p->st_buff_cache_hits, "hit_ratio", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
587
588 rrdlabels_add(p->st_buff_cache_hits->rrdlabels, "mssql_instance", p->instanceID, RRDLABEL_SRC_AUTO);
589 }
@@ -570,8 +594,9 @@ static void do_mssql_buffer_management(PERF_DATA_BLOCK *pDataBlock, struct mssql
594 }
595
596 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->MSSQLBufferCheckpointPages)) {
573 - snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_bufman_checkpoint_pages", p->instanceID);
597 if (!p->st_buff_checkpoint_pages) {
598 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_bufman_checkpoint_pages", p->instanceID);
599 + netdata_fix_chart_name(id);
600 p->st_buff_checkpoint_pages = rrdset_create_localhost(
601 "mssql",
602 id,
@@ -586,9 +611,8 @@ static void do_mssql_buffer_management(PERF_DATA_BLOCK *pDataBlock, struct mssql
611 update_every,
612 RRDSET_TYPE_LINE);
613
589 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_bufman_checkpoint_pages", p->instanceID);
614 p->rd_buff_checkpoint_pages =
591 - rrddim_add(p->st_buff_checkpoint_pages, id, "log", 1, 1, RRD_ALGORITHM_INCREMENTAL);
615 + rrddim_add(p->st_buff_checkpoint_pages, "log", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
616
617 rrdlabels_add(p->st_buff_checkpoint_pages->rrdlabels, "mssql_instance", p->instanceID, RRDLABEL_SRC_AUTO);
618 }
@@ -601,8 +625,9 @@ static void do_mssql_buffer_management(PERF_DATA_BLOCK *pDataBlock, struct mssql
625 }
626
627 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->MSSQLBufferPageLifeExpectancy)) {
604 - snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_bufman_page_life_expectancy", p->instanceID);
628 if (!p->st_buff_cache_page_life_expectancy) {
629 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_bufman_page_life_expectancy", p->instanceID);
630 + netdata_fix_chart_name(id);
631 p->st_buff_cache_page_life_expectancy = rrdset_create_localhost(
632 "mssql",
633 id,
@@ -617,9 +642,8 @@ static void do_mssql_buffer_management(PERF_DATA_BLOCK *pDataBlock, struct mssql
642 update_every,
643 RRDSET_TYPE_LINE);
644
620 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_bufman_page_life_expectancy_seconds", p->instanceID);
621 - p->rd_buff_cache_page_life_expectancy =
622 - rrddim_add(p->st_buff_cache_page_life_expectancy, id, "life_expectancy", 1, 1, RRD_ALGORITHM_ABSOLUTE);
645 + p->rd_buff_cache_page_life_expectancy = rrddim_add(
646 + p->st_buff_cache_page_life_expectancy, "life_expectancy", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
647
648 rrdlabels_add(
649 p->st_buff_cache_page_life_expectancy->rrdlabels, "mssql_instance", p->instanceID, RRDLABEL_SRC_AUTO);
@@ -634,8 +658,9 @@ static void do_mssql_buffer_management(PERF_DATA_BLOCK *pDataBlock, struct mssql
658
659 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->MSSQLBufferPageReads) &&
660 perflibGetObjectCounter(pDataBlock, pObjectType, &p->MSSQLBufferPageWrites)) {
637 - snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_bufman_iops", p->instanceID);
661 if (!p->st_buff_page_iops) {
662 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_bufman_iops", p->instanceID);
663 + netdata_fix_chart_name(id);
664 p->st_buff_page_iops = rrdset_create_localhost(
665 "mssql",
666 id,
@@ -650,34 +675,34 @@ static void do_mssql_buffer_management(PERF_DATA_BLOCK *pDataBlock, struct mssql
675 update_every,
676 RRDSET_TYPE_LINE);
677
653 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_bufman_page_reads", p->instanceID);
654 - p->rd_buff_page_reads = rrddim_add(p->st_buff_page_iops, id, "read", 1, 1, RRD_ALGORITHM_INCREMENTAL);
655 -
656 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_bufman_page_writes", p->instanceID);
657 - p->rd_buff_page_writes = rrddim_add(p->st_buff_page_iops, id, "written", -1, 1, RRD_ALGORITHM_INCREMENTAL);
678 + p->rd_buff_page_reads = rrddim_add(p->st_buff_page_iops, "read", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
679 + p->rd_buff_page_writes =
680 + rrddim_add(p->st_buff_page_iops, "written", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
681
682 rrdlabels_add(p->st_buff_page_iops->rrdlabels, "mssql_instance", p->instanceID, RRDLABEL_SRC_AUTO);
683 }
684
685 rrddim_set_by_pointer(
686 p->st_buff_page_iops, p->rd_buff_page_reads, (collected_number)p->MSSQLBufferPageReads.current.Data);
664 -
687 rrddim_set_by_pointer(
688 p->st_buff_page_iops, p->rd_buff_page_writes, (collected_number)p->MSSQLBufferPageWrites.current.Data);
689 +
690 rrdset_done(p->st_buff_page_iops);
691 }
692 }
693
694 static void do_mssql_access_methods(PERF_DATA_BLOCK *pDataBlock, struct mssql_instance *p, int update_every) {
695 char id[RRD_ID_LENGTH_MAX + 1];
696 +
697 PERF_OBJECT_TYPE *pObjectType =
698 perflibFindObjectTypeByName(pDataBlock, p->objectName[NETDATA_MSSQL_ACCESS_METHODS]);
699 if (!pObjectType)
700 return;
701
702 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->MSSQLAccessMethodPageSplits)) {
679 - snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_accessmethods_page_splits", p->instanceID);
703 if (!p->st_access_method_page_splits) {
704 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_accessmethods_page_splits", p->instanceID);
705 + netdata_fix_chart_name(id);
706 p->st_access_method_page_splits = rrdset_create_localhost(
707 "mssql",
708 id,
@@ -692,9 +717,8 @@ static void do_mssql_access_methods(PERF_DATA_BLOCK *pDataBlock, struct mssql_in
717 update_every,
718 RRDSET_TYPE_LINE);
719
695 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_accessmethods_page_splits", p->instanceID);
720 p->rd_access_method_page_splits =
697 - rrddim_add(p->st_access_method_page_splits, id, "page", 1, 1, RRD_ALGORITHM_INCREMENTAL);
721 + rrddim_add(p->st_access_method_page_splits, "page", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
722
723 rrdlabels_add(
724 p->st_access_method_page_splits->rrdlabels, "mssql_instance", p->instanceID, RRDLABEL_SRC_AUTO);
@@ -710,20 +734,22 @@ static void do_mssql_access_methods(PERF_DATA_BLOCK *pDataBlock, struct mssql_in
734
735 static void do_mssql_errors(PERF_DATA_BLOCK *pDataBlock, struct mssql_instance *p, int update_every) {
736 char id[RRD_ID_LENGTH_MAX + 1];
737 +
738 PERF_OBJECT_TYPE *pObjectType = perflibFindObjectTypeByName(pDataBlock, p->objectName[NETDATA_MSSQL_SQL_ERRORS]);
739 if (!pObjectType)
740 return;
741
742 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->MSSQLSQLErrorsTotal)) {
718 - snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_sql_errors_total", p->instanceID);
743 if (!p->st_sql_errors) {
744 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_sql_errors_total", p->instanceID);
745 + netdata_fix_chart_name(id);
746 p->st_sql_errors = rrdset_create_localhost(
747 "mssql",
748 id,
749 NULL,
724 - "Errors",
725 - "mssql.instance_sql_errors",
750 "errors",
751 + "mssql.instance_sql_errors",
752 + "Errors",
753 "errors/s",
754 PLUGIN_WINDOWS_NAME,
755 "PerflibMSSQL",
@@ -731,8 +757,7 @@ static void do_mssql_errors(PERF_DATA_BLOCK *pDataBlock, struct mssql_instance *
757 update_every,
758 RRDSET_TYPE_LINE);
759
734 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_sql_errors_total", p->instanceID);
735 - p->rd_sql_errors = rrddim_add(p->st_sql_errors, id, "errors", 1, 1, RRD_ALGORITHM_INCREMENTAL);
760 + p->rd_sql_errors = rrddim_add(p->st_sql_errors, "errors", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
761
762 rrdlabels_add(p->st_sql_errors->rrdlabels, "mssql_instance", p->instanceID, RRDLABEL_SRC_AUTO);
763 }
@@ -745,6 +770,7 @@ static void do_mssql_errors(PERF_DATA_BLOCK *pDataBlock, struct mssql_instance *
770
771 int dict_mssql_locks_charts_cb(const DICTIONARY_ITEM *item __maybe_unused, void *value, void *data __maybe_unused) {
772 char id[RRD_ID_LENGTH_MAX + 1];
773 +
774 struct mssql_lock_instance *mli = value;
775 const char *instance = dictionary_acquired_item_name((DICTIONARY_ITEM *)item);
776
@@ -752,6 +778,7 @@ int dict_mssql_locks_charts_cb(const DICTIONARY_ITEM *item __maybe_unused, void
778
779 if (!mli->parent->st_lockWait) {
780 snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_locks_lock_wait", mli->parent->instanceID);
781 + netdata_fix_chart_name(id);
782 mli->parent->st_lockWait = rrdset_create_localhost(
783 "mssql",
784 id,
@@ -766,24 +793,22 @@ int dict_mssql_locks_charts_cb(const DICTIONARY_ITEM *item __maybe_unused, void
793 *update_every,
794 RRDSET_TYPE_LINE);
795
769 - rrdlabels_add(mli->parent->st_lockWait->rrdlabels, "mssql_instance", instance, RRDLABEL_SRC_AUTO);
796 + rrdlabels_add(
797 + mli->parent->st_lockWait->rrdlabels, "mssql_instance", mli->parent->instanceID, RRDLABEL_SRC_AUTO);
798 }
799
800 if (!mli->rd_lockWait) {
773 - snprintfz(
774 - id,
775 - RRD_ID_LENGTH_MAX,
776 - "mssql_instance_%s_resource_%s_locks_lock_wait_seconds",
777 - mli->parent->instanceID,
778 - instance);
779 -
780 - mli->rd_lockWait = rrddim_add(mli->parent->st_lockWait, id, instance, 1, 1, RRD_ALGORITHM_INCREMENTAL);
801 + mli->rd_lockWait = rrddim_add(mli->parent->st_lockWait, instance, NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
802 }
803
783 - rrddim_set_by_pointer(mli->parent->st_lockWait, mli->rd_lockWait, (collected_number)mli->lockWait.current.Data);
804 + if (mli->updated & (1 << NETDATA_MSSQL_ENUM_MLI_IDX_WAIT)) {
805 + rrddim_set_by_pointer(
806 + mli->parent->st_lockWait, mli->rd_lockWait, (collected_number)(mli->lockWait.current.Data));
807 + }
808
809 if (!mli->parent->st_deadLocks) {
810 snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_locks_deadlocks", mli->parent->instanceID);
811 + netdata_fix_chart_name(id);
812 mli->parent->st_deadLocks = rrdset_create_localhost(
813 "mssql",
814 id,
@@ -791,23 +816,25 @@ int dict_mssql_locks_charts_cb(const DICTIONARY_ITEM *item __maybe_unused, void
816 "locks",
817 "mssql.instance_locks_deadlocks",
818 "Lock requests that resulted in deadlock.",
794 - "locks/s",
819 + "deadlocks/s",
820 PLUGIN_WINDOWS_NAME,
821 "PerflibMSSQL",
822 PRIO_MSSQL_LOCKS_DEADLOCK,
823 *update_every,
824 RRDSET_TYPE_LINE);
800 - rrdlabels_add(mli->parent->st_deadLocks->rrdlabels, "mssql_instance", instance, RRDLABEL_SRC_AUTO);
825 +
826 + rrdlabels_add(
827 + mli->parent->st_deadLocks->rrdlabels, "mssql_instance", mli->parent->instanceID, RRDLABEL_SRC_AUTO);
828 }
829
830 if (!mli->rd_deadLocks) {
804 - snprintfz(
805 - id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_resource_%s_locks_deadlocks", mli->parent->instanceID, instance);
806 -
807 - mli->rd_deadLocks = rrddim_add(mli->parent->st_deadLocks, id, instance, 1, 1, RRD_ALGORITHM_INCREMENTAL);
831 + mli->rd_deadLocks = rrddim_add(mli->parent->st_deadLocks, instance, NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
832 }
833
810 - rrddim_set_by_pointer(mli->parent->st_deadLocks, mli->rd_deadLocks, (collected_number)mli->deadLocks.current.Data);
834 + if (mli->updated & (1 << NETDATA_MSSQL_ENUM_MLI_IDX_DEAD_LOCKS)) {
835 + rrddim_set_by_pointer(
836 + mli->parent->st_deadLocks, mli->rd_deadLocks, (collected_number)mli->deadLocks.current.Data);
837 + }
838
839 return 1;
840 }
@@ -829,7 +856,6 @@ static void do_mssql_locks(PERF_DATA_BLOCK *pDataBlock, struct mssql_instance *p
856 if (!strcasecmp(windows_shared_buffer, "_Total"))
857 continue;
858
832 - netdata_fix_chart_name(windows_shared_buffer);
859 struct mssql_lock_instance *mli = dictionary_set(p->locks_instances, windows_shared_buffer, NULL, sizeof(*mli));
860 if (!mli)
861 continue;
@@ -838,8 +864,11 @@ static void do_mssql_locks(PERF_DATA_BLOCK *pDataBlock, struct mssql_instance *p
864 mli->parent = p;
865 }
866
841 - perflibGetObjectCounter(pDataBlock, pObjectType, &mli->lockWait);
842 - perflibGetObjectCounter(pDataBlock, pObjectType, &mli->deadLocks);
867 + if (perflibGetObjectCounter(pDataBlock, pObjectType, &mli->lockWait))
868 + mli->updated |= (1 << NETDATA_MSSQL_ENUM_MLI_IDX_WAIT);
869 +
870 + if (perflibGetObjectCounter(pDataBlock, pObjectType, &mli->deadLocks))
871 + mli->updated |= (1 << NETDATA_MSSQL_ENUM_MLI_IDX_DEAD_LOCKS);
872 }
873
874 dictionary_sorted_walkthrough_read(p->locks_instances, dict_mssql_locks_charts_cb, &update_every);
@@ -849,9 +878,11 @@ static void do_mssql_locks(PERF_DATA_BLOCK *pDataBlock, struct mssql_instance *p
878
879 static void mssql_database_backup_restore_chart(struct mssql_db_instance *mli, const char *db, int update_every) {
880 char id[RRD_ID_LENGTH_MAX + 1];
852 - if (!mli->parent->st_db_backup_restore_operations) {
881 +
882 + if (!mli->st_db_backup_restore_operations) {
883 snprintfz(id, RRD_ID_LENGTH_MAX, "db_%s_instance_%s_backup_restore_operations", db, mli->parent->instanceID);
854 - mli->parent->st_db_backup_restore_operations = rrdset_create_localhost(
884 + netdata_fix_chart_name(id);
885 + mli->st_db_backup_restore_operations = rrdset_create_localhost(
886 "mssql",
887 id,
888 NULL,
@@ -866,33 +897,35 @@ static void mssql_database_backup_restore_chart(struct mssql_db_instance *mli, c
897 RRDSET_TYPE_LINE);
898
899 rrdlabels_add(
869 - mli->parent->st_db_backup_restore_operations->rrdlabels,
900 + mli->st_db_backup_restore_operations->rrdlabels,
901 "mssql_instance",
902 mli->parent->instanceID,
903 RRDLABEL_SRC_AUTO);
873 -
874 - rrdlabels_add(mli->parent->st_db_backup_restore_operations->rrdlabels, "database", db, RRDLABEL_SRC_AUTO);
904 + rrdlabels_add(mli->st_db_backup_restore_operations->rrdlabels, "database", db, RRDLABEL_SRC_AUTO);
905 }
906
907 if (!mli->rd_db_backup_restore_operations) {
878 - snprintfz(
879 - id, RRD_ID_LENGTH_MAX, "mssql_db_%s_instance_%s_backup_restore_operations", db, mli->parent->instanceID);
880 -
908 mli->rd_db_backup_restore_operations =
882 - rrddim_add(mli->parent->st_db_backup_restore_operations, id, db, 1, 1, RRD_ALGORITHM_INCREMENTAL);
909 + rrddim_add(mli->st_db_backup_restore_operations, "backup", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
910 }
911
885 - rrddim_set_by_pointer(
886 - mli->parent->st_db_backup_restore_operations,
887 - mli->rd_db_backup_restore_operations,
888 - (collected_number)mli->MSSQLDatabaseBackupRestoreOperations.current.Data);
912 + if (mli->updated & (1 << NETDATA_MSSQL_ENUM_MDI_IDX_BACKUP_RESTORE_OP)) {
913 + rrddim_set_by_pointer(
914 + mli->st_db_backup_restore_operations,
915 + mli->rd_db_backup_restore_operations,
916 + (collected_number)mli->MSSQLDatabaseBackupRestoreOperations.current.Data);
917 + }
918 +
919 + rrdset_done(mli->st_db_backup_restore_operations);
920 }
921
922 static void mssql_database_log_flushes_chart(struct mssql_db_instance *mli, const char *db, int update_every) {
923 char id[RRD_ID_LENGTH_MAX + 1];
893 - if (!mli->parent->st_db_log_flushes) {
924 +
925 + if (!mli->st_db_log_flushes) {
926 snprintfz(id, RRD_ID_LENGTH_MAX, "db_%s_instance_%s_log_flushes", db, mli->parent->instanceID);
895 - mli->parent->st_db_log_flushes = rrdset_create_localhost(
927 + netdata_fix_chart_name(id);
928 + mli->st_db_log_flushes = rrdset_create_localhost(
929 "mssql",
930 id,
931 NULL,
@@ -906,29 +939,31 @@ static void mssql_database_log_flushes_chart(struct mssql_db_instance *mli, cons
939 update_every,
940 RRDSET_TYPE_LINE);
941
909 - rrdlabels_add(
910 - mli->parent->st_db_log_flushes->rrdlabels, "mssql_instance", mli->parent->instanceID, RRDLABEL_SRC_AUTO);
911 -
912 - rrdlabels_add(mli->parent->st_db_log_flushes->rrdlabels, "database", db, RRDLABEL_SRC_AUTO);
942 + rrdlabels_add(mli->st_db_log_flushes->rrdlabels, "mssql_instance", mli->parent->instanceID, RRDLABEL_SRC_AUTO);
943 + rrdlabels_add(mli->st_db_log_flushes->rrdlabels, "database", db, RRDLABEL_SRC_AUTO);
944 }
945
946 if (!mli->rd_db_log_flushes) {
916 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_db_%s_instance_%s_log_flushes_bytes", db, mli->parent->instanceID);
947 + mli->rd_db_log_flushes = rrddim_add(mli->st_db_log_flushes, "flushes", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
948 + }
949
918 - mli->rd_db_log_flushes = rrddim_add(mli->parent->st_db_log_flushes, id, db, 1, 1, RRD_ALGORITHM_INCREMENTAL);
950 + if (mli->updated & (1 << NETDATA_MSSQL_ENUM_MDI_IDX_LOG_FLUSHES)) {
951 + rrddim_set_by_pointer(
952 + mli->st_db_log_flushes,
953 + mli->rd_db_log_flushes,
954 + (collected_number)mli->MSSQLDatabaseLogFlushes.current.Data);
955 }
956
921 - rrddim_set_by_pointer(
922 - mli->parent->st_db_log_flushes,
923 - mli->rd_db_log_flushes,
924 - (collected_number)mli->MSSQLDatabaseLogFlushes.current.Data);
957 + rrdset_done(mli->st_db_log_flushes);
958 }
959
960 static void mssql_database_log_flushed_chart(struct mssql_db_instance *mli, const char *db, int update_every) {
961 char id[RRD_ID_LENGTH_MAX + 1];
929 - if (!mli->parent->st_db_log_flushed) {
962 +
963 + if (!mli->st_db_log_flushed) {
964 snprintfz(id, RRD_ID_LENGTH_MAX, "db_%s_instance_%s_log_flushed", db, mli->parent->instanceID);
931 - mli->parent->st_db_log_flushed = rrdset_create_localhost(
965 + netdata_fix_chart_name(id);
966 + mli->st_db_log_flushed = rrdset_create_localhost(
967 "mssql",
968 id,
969 NULL,
@@ -942,29 +977,31 @@ static void mssql_database_log_flushed_chart(struct mssql_db_instance *mli, cons
977 update_every,
978 RRDSET_TYPE_LINE);
979
945 - rrdlabels_add(
946 - mli->parent->st_db_log_flushed->rrdlabels, "mssql_instance", mli->parent->instanceID, RRDLABEL_SRC_AUTO);
947 -
948 - rrdlabels_add(mli->parent->st_db_log_flushed->rrdlabels, "database", db, RRDLABEL_SRC_AUTO);
980 + rrdlabels_add(mli->st_db_log_flushed->rrdlabels, "mssql_instance", mli->parent->instanceID, RRDLABEL_SRC_AUTO);
981 + rrdlabels_add(mli->st_db_log_flushed->rrdlabels, "database", db, RRDLABEL_SRC_AUTO);
982 }
983
984 if (!mli->rd_db_log_flushed) {
952 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_db_%s_instance_%s_log_flushed_bytes", db, mli->parent->instanceID);
985 + mli->rd_db_log_flushed = rrddim_add(mli->st_db_log_flushed, "flushed", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
986 + }
987
954 - mli->rd_db_log_flushed = rrddim_add(mli->parent->st_db_log_flushed, id, db, 1, 1, RRD_ALGORITHM_INCREMENTAL);
988 + if (mli->updated & (1 << NETDATA_MSSQL_ENUM_MDI_IDX_LOG_FLUSHED)) {
989 + rrddim_set_by_pointer(
990 + mli->st_db_log_flushed,
991 + mli->rd_db_log_flushed,
992 + (collected_number)mli->MSSQLDatabaseLogFlushed.current.Data);
993 }
994
957 - rrddim_set_by_pointer(
958 - mli->parent->st_db_log_flushed,
959 - mli->rd_db_log_flushed,
960 - (collected_number)mli->MSSQLDatabaseLogFlushed.current.Data);
995 + rrdset_done(mli->st_db_log_flushed);
996 }
997
998 static void mssql_transactions_chart(struct mssql_db_instance *mli, const char *db, int update_every) {
999 char id[RRD_ID_LENGTH_MAX + 1];
965 - if (!mli->parent->st_db_transactions) {
1000 +
1001 + if (!mli->st_db_transactions) {
1002 snprintfz(id, RRD_ID_LENGTH_MAX, "db_%s_instance_%s_transactions", db, mli->parent->instanceID);
967 - mli->parent->st_db_transactions = rrdset_create_localhost(
1003 + netdata_fix_chart_name(id);
1004 + mli->st_db_transactions = rrdset_create_localhost(
1005 "mssql",
1006 id,
1007 NULL,
@@ -978,29 +1015,32 @@ static void mssql_transactions_chart(struct mssql_db_instance *mli, const char *
1015 update_every,
1016 RRDSET_TYPE_LINE);
1017
981 - rrdlabels_add(
982 - mli->parent->st_db_transactions->rrdlabels, "mssql_instance", mli->parent->instanceID, RRDLABEL_SRC_AUTO);
983 -
984 - rrdlabels_add(mli->parent->st_db_transactions->rrdlabels, "database", db, RRDLABEL_SRC_AUTO);
1018 + rrdlabels_add(mli->st_db_transactions->rrdlabels, "mssql_instance", mli->parent->instanceID, RRDLABEL_SRC_AUTO);
1019 + rrdlabels_add(mli->st_db_transactions->rrdlabels, "database", db, RRDLABEL_SRC_AUTO);
1020 }
1021
1022 if (!mli->rd_db_transactions) {
988 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_db_%s_instance_%s_transactions", db, mli->parent->instanceID);
1023 + mli->rd_db_transactions =
1024 + rrddim_add(mli->st_db_transactions, "transactions", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1025 + }
1026
990 - mli->rd_db_transactions = rrddim_add(mli->parent->st_db_transactions, id, db, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1027 + if (mli->updated & (1 << NETDATA_MSSQL_ENUM_MDI_IDX_TRANSACTIONS)) {
1028 + rrddim_set_by_pointer(
1029 + mli->st_db_transactions,
1030 + mli->rd_db_transactions,
1031 + (collected_number)mli->MSSQLDatabaseTransactions.current.Data);
1032 }
1033
993 - rrddim_set_by_pointer(
994 - mli->parent->st_db_transactions,
995 - mli->rd_db_transactions,
996 - (collected_number)mli->MSSQLDatabaseTransactions.current.Data);
1034 + rrdset_done(mli->st_db_transactions);
1035 }
1036
1037 static void mssql_write_transactions_chart(struct mssql_db_instance *mli, const char *db, int update_every) {
1038 char id[RRD_ID_LENGTH_MAX + 1];
1001 - if (!mli->parent->st_db_write_transactions) {
1039 +
1040 + if (!mli->st_db_write_transactions) {
1041 snprintfz(id, RRD_ID_LENGTH_MAX, "db_%s_instance_%s_write_transactions", db, mli->parent->instanceID);
1003 - mli->parent->st_db_write_transactions = rrdset_create_localhost(
1042 + netdata_fix_chart_name(id);
1043 + mli->st_db_write_transactions = rrdset_create_localhost(
1044 "mssql",
1045 id,
1046 NULL,
@@ -1015,32 +1055,32 @@ static void mssql_write_transactions_chart(struct mssql_db_instance *mli, const
1055 RRDSET_TYPE_LINE);
1056
1057 rrdlabels_add(
1018 - mli->parent->st_db_write_transactions->rrdlabels,
1019 - "mssql_instance",
1020 - mli->parent->instanceID,
1021 - RRDLABEL_SRC_AUTO);
1022 -
1023 - rrdlabels_add(mli->parent->st_db_write_transactions->rrdlabels, "database", db, RRDLABEL_SRC_AUTO);
1058 + mli->st_db_write_transactions->rrdlabels, "mssql_instance", mli->parent->instanceID, RRDLABEL_SRC_AUTO);
1059 + rrdlabels_add(mli->st_db_write_transactions->rrdlabels, "database", db, RRDLABEL_SRC_AUTO);
1060 }
1061
1062 if (!mli->rd_db_write_transactions) {
1027 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_db_%s_instance_%s_write_transactions", db, mli->parent->instanceID);
1028 -
1063 mli->rd_db_write_transactions =
1030 - rrddim_add(mli->parent->st_db_write_transactions, id, db, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1064 + rrddim_add(mli->st_db_write_transactions, "write", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1065 + }
1066 +
1067 + if (mli->updated & (1 << NETDATA_MSSQL_ENUM_MDI_IDX_WRITE_TRANSACTIONS)) {
1068 + rrddim_set_by_pointer(
1069 + mli->st_db_write_transactions,
1070 + mli->rd_db_write_transactions,
1071 + (collected_number)mli->MSSQLDatabaseWriteTransactions.current.Data);
1072 }
1073
1033 - rrddim_set_by_pointer(
1034 - mli->parent->st_db_write_transactions,
1035 - mli->rd_db_write_transactions,
1036 - (collected_number)mli->MSSQLDatabaseWriteTransactions.current.Data);
1074 + rrdset_done(mli->st_db_write_transactions);
1075 }
1076
1077 static void mssql_active_transactions_chart(struct mssql_db_instance *mli, const char *db, int update_every) {
1078 char id[RRD_ID_LENGTH_MAX + 1];
1041 - if (!mli->parent->st_db_active_transactions) {
1079 +
1080 + if (!mli->st_db_active_transactions) {
1081 snprintfz(id, RRD_ID_LENGTH_MAX, "db_%s_instance_%s_active_transactions", db, mli->parent->instanceID);
1043 - mli->parent->st_db_active_transactions = rrdset_create_localhost(
1082 + netdata_fix_chart_name(id);
1083 + mli->st_db_active_transactions = rrdset_create_localhost(
1084 "mssql",
1085 id,
1086 NULL,
@@ -1055,32 +1095,32 @@ static void mssql_active_transactions_chart(struct mssql_db_instance *mli, const
1095 RRDSET_TYPE_LINE);
1096
1097 rrdlabels_add(
1058 - mli->parent->st_db_active_transactions->rrdlabels,
1059 - "mssql_instance",
1060 - mli->parent->instanceID,
1061 - RRDLABEL_SRC_AUTO);
1062 -
1063 - rrdlabels_add(mli->parent->st_db_active_transactions->rrdlabels, "database", db, RRDLABEL_SRC_AUTO);
1098 + mli->st_db_active_transactions->rrdlabels, "mssql_instance", mli->parent->instanceID, RRDLABEL_SRC_AUTO);
1099 + rrdlabels_add(mli->st_db_active_transactions->rrdlabels, "database", db, RRDLABEL_SRC_AUTO);
1100 }
1101
1102 if (!mli->rd_db_active_transactions) {
1067 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_db_%s_instance_%s_active_transactions", db, mli->parent->instanceID);
1068 -
1103 mli->rd_db_active_transactions =
1070 - rrddim_add(mli->parent->st_db_active_transactions, id, db, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1104 + rrddim_add(mli->st_db_active_transactions, "active", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1105 }
1106
1073 - rrddim_set_by_pointer(
1074 - mli->parent->st_db_active_transactions,
1075 - mli->rd_db_active_transactions,
1076 - (collected_number)mli->MSSQLDatabaseActiveTransactions.current.Data);
1107 + if (mli->updated & (1 << NETDATA_MSSQL_ENUM_MDI_IDX_ACTIVE_TRANSACTIONS)) {
1108 + rrddim_set_by_pointer(
1109 + mli->st_db_active_transactions,
1110 + mli->rd_db_active_transactions,
1111 + (collected_number)mli->MSSQLDatabaseActiveTransactions.current.Data);
1112 + }
1113 +
1114 + rrdset_done(mli->st_db_active_transactions);
1115 }
1116
1117 static void mssql_data_file_size_chart(struct mssql_db_instance *mli, const char *db, int update_every) {
1118 char id[RRD_ID_LENGTH_MAX + 1];
1081 - if (!mli->parent->st_db_data_file_size) {
1119 +
1120 + if (!mli->st_db_data_file_size) {
1121 snprintfz(id, RRD_ID_LENGTH_MAX, "db_%s_instance_%s_data_files_size", db, mli->parent->instanceID);
1083 - mli->parent->st_db_data_file_size = rrdset_create_localhost(
1122 + netdata_fix_chart_name(id);
1123 + mli->st_db_data_file_size = rrdset_create_localhost(
1124 "mssql",
1125 id,
1126 NULL,
@@ -1095,21 +1135,20 @@ static void mssql_data_file_size_chart(struct mssql_db_instance *mli, const char
1135 RRDSET_TYPE_LINE);
1136
1137 rrdlabels_add(
1098 - mli->parent->st_db_data_file_size->rrdlabels, "mssql_instance", mli->parent->instanceID, RRDLABEL_SRC_AUTO);
1099 -
1100 - rrdlabels_add(mli->parent->st_db_data_file_size->rrdlabels, "database", db, RRDLABEL_SRC_AUTO);
1138 + mli->st_db_data_file_size->rrdlabels, "mssql_instance", mli->parent->instanceID, RRDLABEL_SRC_AUTO);
1139 + rrdlabels_add(mli->st_db_data_file_size->rrdlabels, "database", db, RRDLABEL_SRC_AUTO);
1140 }
1141
1142 if (!mli->rd_db_data_file_size) {
1104 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_db_%s_instance_%s_data_files_size_bytes", db, mli->parent->instanceID);
1105 -
1106 - mli->rd_db_data_file_size = rrddim_add(mli->parent->st_db_data_file_size, id, db, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1143 + mli->rd_db_data_file_size = rrddim_add(mli->st_db_data_file_size, "size", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1144 }
1145
1109 - rrddim_set_by_pointer(
1110 - mli->parent->st_db_data_file_size,
1111 - mli->rd_db_data_file_size,
1112 - (collected_number)mli->MSSQLDatabaseDataFileSize.current.Data * 1024);
1146 + // FIXME: If the value cannot be retrieved, remove the chart instead of displaying a 0 value.
1147 + collected_number data =
1148 + (mli->updated & (1 << NETDATA_MSSQL_ENUM_MDI_IDX_FILE_SIZE)) ? mli->MSSQLDatabaseDataFileSize.current.Data : 0;
1149 + rrddim_set_by_pointer(mli->st_db_data_file_size, mli->rd_db_data_file_size, data);
1150 +
1151 + rrdset_done(mli->st_db_data_file_size);
1152 }
1153
1154 int dict_mssql_databases_charts_cb(const DICTIONARY_ITEM *item __maybe_unused, void *value, void *data __maybe_unused) {
@@ -1119,7 +1158,9 @@ int dict_mssql_databases_charts_cb(const DICTIONARY_ITEM *item __maybe_unused, v
1158 int *update_every = data;
1159
1160 void (*transaction_chart[])(struct mssql_db_instance *, const char *, int) = {
1122 - mssql_data_file_size_chart,
1161 + // FIXME: allegedly Netdata collects negative values (MSSQLDatabaseDataFileSize).
1162 + // something is wrong, perflibdump shows correct values.
1163 + // mssql_data_file_size_chart,
1164 mssql_transactions_chart,
1165 mssql_database_backup_restore_chart,
1166 mssql_database_log_flushed_chart,
@@ -1155,43 +1196,54 @@ static void do_mssql_databases(PERF_DATA_BLOCK *pDataBlock, struct mssql_instanc
1196 if (!strcasecmp(windows_shared_buffer, "_Total"))
1197 continue;
1198
1158 - netdata_fix_chart_name(windows_shared_buffer);
1199 struct mssql_db_instance *mdi = dictionary_set(p->databases, windows_shared_buffer, NULL, sizeof(*mdi));
1200 if (!mdi)
1201 continue;
1202
1203 + mdi->updated = 0;
1204 if (!mdi->parent) {
1205 mdi->parent = p;
1206 }
1207
1167 - perflibGetObjectCounter(pDataBlock, pObjectType, &mdi->MSSQLDatabaseDataFileSize);
1168 - perflibGetObjectCounter(pDataBlock, pObjectType, &mdi->MSSQLDatabaseActiveTransactions);
1169 - perflibGetObjectCounter(pDataBlock, pObjectType, &mdi->MSSQLDatabaseBackupRestoreOperations);
1170 - perflibGetObjectCounter(pDataBlock, pObjectType, &mdi->MSSQLDatabaseLogFlushed);
1171 - perflibGetObjectCounter(pDataBlock, pObjectType, &mdi->MSSQLDatabaseLogFlushes);
1172 - perflibGetObjectCounter(pDataBlock, pObjectType, &mdi->MSSQLDatabaseTransactions);
1173 - perflibGetObjectCounter(pDataBlock, pObjectType, &mdi->MSSQLDatabaseWriteTransactions);
1208 + if (perflibGetObjectCounter(pDataBlock, pObjectType, &mdi->MSSQLDatabaseDataFileSize)) {
1209 + LONGLONG value = (LONGLONG)mdi->MSSQLDatabaseDataFileSize.current.Data;
1210 + if (value > 0)
1211 + mdi->updated |= (1 << NETDATA_MSSQL_ENUM_MDI_IDX_FILE_SIZE);
1212 + }
1213 +
1214 + if (perflibGetObjectCounter(pDataBlock, pObjectType, &mdi->MSSQLDatabaseActiveTransactions))
1215 + mdi->updated |= (1 << NETDATA_MSSQL_ENUM_MDI_IDX_ACTIVE_TRANSACTIONS);
1216 +
1217 + if (perflibGetObjectCounter(pDataBlock, pObjectType, &mdi->MSSQLDatabaseBackupRestoreOperations))
1218 + mdi->updated |= (1 << NETDATA_MSSQL_ENUM_MDI_IDX_BACKUP_RESTORE_OP);
1219 +
1220 + if (perflibGetObjectCounter(pDataBlock, pObjectType, &mdi->MSSQLDatabaseLogFlushed))
1221 + mdi->updated |= (1 << NETDATA_MSSQL_ENUM_MDI_IDX_LOG_FLUSHED);
1222 +
1223 + if (perflibGetObjectCounter(pDataBlock, pObjectType, &mdi->MSSQLDatabaseLogFlushes))
1224 + mdi->updated |= (1 << NETDATA_MSSQL_ENUM_MDI_IDX_LOG_FLUSHES);
1225 +
1226 + if (perflibGetObjectCounter(pDataBlock, pObjectType, &mdi->MSSQLDatabaseTransactions))
1227 + mdi->updated |= (1 << NETDATA_MSSQL_ENUM_MDI_IDX_TRANSACTIONS);
1228 +
1229 + if (perflibGetObjectCounter(pDataBlock, pObjectType, &mdi->MSSQLDatabaseWriteTransactions))
1230 + mdi->updated |= (1 << NETDATA_MSSQL_ENUM_MDI_IDX_WRITE_TRANSACTIONS);
1231 }
1232
1233 dictionary_sorted_walkthrough_read(p->databases, dict_mssql_databases_charts_cb, &update_every);
1177 - rrdset_done(p->st_db_data_file_size);
1178 - rrdset_done(p->st_db_active_transactions);
1179 - rrdset_done(p->st_db_backup_restore_operations);
1180 - rrdset_done(p->st_db_log_flushed);
1181 - rrdset_done(p->st_db_log_flushes);
1182 - rrdset_done(p->st_db_transactions);
1183 - rrdset_done(p->st_db_write_transactions);
1234 }
1235
1236 static void do_mssql_memory_mgr(PERF_DATA_BLOCK *pDataBlock, struct mssql_instance *p, int update_every) {
1237 char id[RRD_ID_LENGTH_MAX + 1];
1238 +
1239 PERF_OBJECT_TYPE *pObjectType = perflibFindObjectTypeByName(pDataBlock, p->objectName[NETDATA_MSSQL_MEMORY]);
1240 if (!pObjectType)
1241 return;
1242
1243 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->MSSQLConnectionMemoryBytes)) {
1193 - snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_memmgr_connection_memory_bytes", p->instanceID);
1244 if (!p->st_conn_memory) {
1245 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_memmgr_connection_memory_bytes", p->instanceID);
1246 + netdata_fix_chart_name(id);
1247 p->st_conn_memory = rrdset_create_localhost(
1248 "mssql",
1249 id,
@@ -1206,8 +1258,7 @@ static void do_mssql_memory_mgr(PERF_DATA_BLOCK *pDataBlock, struct mssql_instan
1258 update_every,
1259 RRDSET_TYPE_LINE);
1260
1209 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_memmgr_connection_memory_bytes", p->instanceID);
1210 - p->rd_conn_memory = rrddim_add(p->st_conn_memory, id, "memory", 1, 1, RRD_ALGORITHM_ABSOLUTE);
1261 + p->rd_conn_memory = rrddim_add(p->st_conn_memory, "memory", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1262
1263 rrdlabels_add(p->st_conn_memory->rrdlabels, "mssql_instance", p->instanceID, RRDLABEL_SRC_AUTO);
1264 }
@@ -1220,8 +1271,9 @@ static void do_mssql_memory_mgr(PERF_DATA_BLOCK *pDataBlock, struct mssql_instan
1271 }
1272
1273 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->MSSQLExternalBenefitOfMemory)) {
1223 - snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_memmgr_external_benefit_of_memory", p->instanceID);
1274 if (!p->st_ext_benefit_mem) {
1275 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_memmgr_external_benefit_of_memory", p->instanceID);
1276 + netdata_fix_chart_name(id);
1277 p->st_ext_benefit_mem = rrdset_create_localhost(
1278 "mssql",
1279 id,
@@ -1236,8 +1288,7 @@ static void do_mssql_memory_mgr(PERF_DATA_BLOCK *pDataBlock, struct mssql_instan
1288 update_every,
1289 RRDSET_TYPE_LINE);
1290
1239 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_memmgr_external_benefit_of_memory", p->instanceID);
1240 - p->rd_ext_benefit_mem = rrddim_add(p->st_ext_benefit_mem, id, "benefit", 1, 1, RRD_ALGORITHM_INCREMENTAL);
1291 + p->rd_ext_benefit_mem = rrddim_add(p->st_ext_benefit_mem, "benefit", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1292
1293 rrdlabels_add(p->st_ext_benefit_mem->rrdlabels, "mssql_instance", p->instanceID, RRDLABEL_SRC_AUTO);
1294 }
@@ -1250,8 +1301,9 @@ static void do_mssql_memory_mgr(PERF_DATA_BLOCK *pDataBlock, struct mssql_instan
1301 }
1302
1303 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->MSSQLPendingMemoryGrants)) {
1253 - snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_memmgr_pending_memory_grants", p->instanceID);
1304 if (!p->st_pending_mem_grant) {
1305 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_memmgr_pending_memory_grants", p->instanceID);
1306 + netdata_fix_chart_name(id);
1307 p->st_pending_mem_grant = rrdset_create_localhost(
1308 "mssql",
1309 id,
@@ -1259,15 +1311,15 @@ static void do_mssql_memory_mgr(PERF_DATA_BLOCK *pDataBlock, struct mssql_instan
1311 "memory",
1312 "mssql.instance_memmgr_pending_memory_grants",
1313 "Process waiting for memory grant",
1262 - "process",
1314 + "processes",
1315 PLUGIN_WINDOWS_NAME,
1316 "PerflibMSSQL",
1317 PRIO_MSSQL_MEMMGR_PENDING_MEMORY_GRANTS,
1318 update_every,
1319 RRDSET_TYPE_LINE);
1320
1269 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_memmgr_pending_memory_grants", p->instanceID);
1270 - p->rd_pending_mem_grant = rrddim_add(p->st_pending_mem_grant, id, "pending", 1, 1, RRD_ALGORITHM_ABSOLUTE);
1321 + p->rd_pending_mem_grant =
1322 + rrddim_add(p->st_pending_mem_grant, "pending", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1323
1324 rrdlabels_add(p->st_pending_mem_grant->rrdlabels, "mssql_instance", p->instanceID, RRDLABEL_SRC_AUTO);
1325 }
@@ -1276,12 +1328,14 @@ static void do_mssql_memory_mgr(PERF_DATA_BLOCK *pDataBlock, struct mssql_instan
1328 p->st_pending_mem_grant,
1329 p->rd_pending_mem_grant,
1330 (collected_number)p->MSSQLPendingMemoryGrants.current.Data);
1331 +
1332 rrdset_done(p->st_pending_mem_grant);
1333 }
1334
1335 if (perflibGetObjectCounter(pDataBlock, pObjectType, &p->MSSQLTotalServerMemory)) {
1283 - snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_memmgr_server_memory", p->instanceID);
1336 if (!p->st_mem_tot_server) {
1337 + snprintfz(id, RRD_ID_LENGTH_MAX, "instance_%s_memmgr_server_memory", p->instanceID);
1338 + netdata_fix_chart_name(id);
1339 p->st_mem_tot_server = rrdset_create_localhost(
1340 "mssql",
1341 id,
@@ -1296,8 +1350,7 @@ static void do_mssql_memory_mgr(PERF_DATA_BLOCK *pDataBlock, struct mssql_instan
1350 update_every,
1351 RRDSET_TYPE_LINE);
1352
1299 - snprintfz(id, RRD_ID_LENGTH_MAX, "mssql_instance_%s_memmgr_total_server_memory_bytes", p->instanceID);
1300 - p->rd_mem_tot_server = rrddim_add(p->st_mem_tot_server, id, "memory", 1, 1, RRD_ALGORITHM_ABSOLUTE);
1353 + p->rd_mem_tot_server = rrddim_add(p->st_mem_tot_server, "memory", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1354
1355 rrdlabels_add(p->st_mem_tot_server->rrdlabels, "mssql_instance", p->instanceID, RRDLABEL_SRC_AUTO);
1356 }
@@ -1306,6 +1359,7 @@ static void do_mssql_memory_mgr(PERF_DATA_BLOCK *pDataBlock, struct mssql_instan
1359 p->st_mem_tot_server,
1360 p->rd_mem_tot_server,
1361 (collected_number)(p->MSSQLTotalServerMemory.current.Data * 1024));
1362 +
1363 rrdset_done(p->st_mem_tot_server);
1364 }
1365 }