fix(go.d/mysql): handle Cpu_time in microseconds in v11.4.5+ (#19618)
fix(go.d/mysql): handle userstats v11.4.5+
Ilya Mashchenko committed
Feb 11, 2025 at 15:08 UTC
b81150bcd1103ce187263059d368ad67fcde7b21
4 files changed
+208
-1
src/go/plugin/go.d/collector/mysql/collect_user_statistics.go
+10
-1
@@ -4,6 +4,8 @@ package mysql
4
5
import (
6
"strings"
7
+
8
+ "github.com/blang/semver/v4"
9
)
10
11
const queryShowUserStatistics = "SHOW USER_STATISTICS;"
@@ -25,7 +27,14 @@ func (c *Collector) collectUserStatistics(mx map[string]int64) error {
27
c.addUserStatisticsCharts(user)
28
}
29
case "Cpu_time":
28
- mx[strings.ToLower(prefix+column)] = int64(parseFloat(value) * 1000)
30
+ if c.isMariaDB && c.version.GTE(semver.Version{Major: 11, Minor: 4, Patch: 5}) {
31
+ // TODO: theoretically should divide by 1e6 to convert to seconds,
32
+ // but empirically need 1e7 to match pre-11.4.5 values.
33
+ // Needs investigation - possible unit reporting inconsistency in MariaDB
34
+ mx[strings.ToLower(prefix+column)] = int64(parseFloat(value) / 1e7 * 1000)
35
+ } else {
36
+ mx[strings.ToLower(prefix+column)] = int64(parseFloat(value) * 1000)
37
+ }
38
case
39
"Total_connections",
40
"Lost_connections",
src/go/plugin/go.d/collector/mysql/collector_test.go
+186
@@ -57,6 +57,9 @@ var (
57
dataMariaGaleraClusterVer1084GlobalVariables, _ = os.ReadFile("testdata/mariadb/v10.8.4-galera-cluster/global_variables.txt")
58
dataMariaGaleraClusterVer1084UserStatistics, _ = os.ReadFile("testdata/mariadb/v10.8.4-galera-cluster/user_statistics.txt")
59
dataMariaGaleraClusterVer1084ProcessList, _ = os.ReadFile("testdata/mariadb/v10.8.4-galera-cluster/process_list.txt")
60
+
61
+ dataMariaVer1145Version, _ = os.ReadFile("testdata/mariadb/v11.4.5/version.txt")
62
+ dataMariaVer1145UserStatistics, _ = os.ReadFile("testdata/mariadb/v11.4.5/user_statistics.txt")
63
)
64
65
func Test_testDataIsValid(t *testing.T) {
@@ -90,6 +93,8 @@ func Test_testDataIsValid(t *testing.T) {
93
"dataMariaGaleraClusterVer1084GlobalVariables": dataMariaGaleraClusterVer1084GlobalVariables,
94
"dataMariaGaleraClusterVer1084UserStatistics": dataMariaGaleraClusterVer1084UserStatistics,
95
"dataMariaGaleraClusterVer1084ProcessList": dataMariaGaleraClusterVer1084ProcessList,
96
+ "dataMariaVer1145Version": dataMariaVer1145Version,
97
+ "dataMariaVer1145UserStatistics": dataMariaVer1145UserStatistics,
98
} {
99
require.NotNil(t, data, fmt.Sprintf("read data: %s", name))
100
_, err := prepareMockRows(data)
@@ -278,6 +283,187 @@ func TestCollector_Collect(t *testing.T) {
283
check func(t *testing.T, my *Collector)
284
}
285
tests := map[string][]testCaseStep{
286
+ "MariaDB-Standalone[v11.4.5]: success on all queries": {
287
+ {
288
+ prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
289
+ mockExpect(t, m, queryShowVersion, dataMariaVer1145Version)
290
+ mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
291
+ mockExpect(t, m, queryDisableSessionQueryLog, nil)
292
+ mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
293
+ mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
294
+ mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
295
+ mockExpect(t, m, queryShowAllSlavesStatus, nil)
296
+ mockExpect(t, m, queryShowUserStatistics, dataMariaVer1145UserStatistics)
297
+ mockExpect(t, m, queryShowProcessList, dataMariaVer1084ProcessList)
298
+ },
299
+ check: func(t *testing.T, collr *Collector) {
300
+ mx := collr.Collect(context.Background())
301
+
302
+ expected := map[string]int64{
303
+ "aborted_connects": 2,
304
+ "binlog_cache_disk_use": 0,
305
+ "binlog_cache_use": 0,
306
+ "binlog_stmt_cache_disk_use": 0,
307
+ "binlog_stmt_cache_use": 0,
308
+ "bytes_received": 81392,
309
+ "bytes_sent": 56794,
310
+ "com_delete": 0,
311
+ "com_insert": 0,
312
+ "com_replace": 0,
313
+ "com_select": 6,
314
+ "com_update": 0,
315
+ "connection_errors_accept": 0,
316
+ "connection_errors_internal": 0,
317
+ "connection_errors_max_connections": 0,
318
+ "connection_errors_peer_address": 0,
319
+ "connection_errors_select": 0,
320
+ "connection_errors_tcpwrap": 0,
321
+ "connections": 12,
322
+ "created_tmp_disk_tables": 0,
323
+ "created_tmp_files": 5,
324
+ "created_tmp_tables": 2,
325
+ "handler_commit": 30,
326
+ "handler_delete": 0,
327
+ "handler_prepare": 0,
328
+ "handler_read_first": 7,
329
+ "handler_read_key": 7,
330
+ "handler_read_next": 3,
331
+ "handler_read_prev": 0,
332
+ "handler_read_rnd": 0,
333
+ "handler_read_rnd_next": 626,
334
+ "handler_rollback": 0,
335
+ "handler_savepoint": 0,
336
+ "handler_savepoint_rollback": 0,
337
+ "handler_update": 3,
338
+ "handler_write": 13,
339
+ "innodb_buffer_pool_bytes_data": 5062656,
340
+ "innodb_buffer_pool_bytes_dirty": 475136,
341
+ "innodb_buffer_pool_pages_data": 309,
342
+ "innodb_buffer_pool_pages_dirty": 29,
343
+ "innodb_buffer_pool_pages_flushed": 0,
344
+ "innodb_buffer_pool_pages_free": 7755,
345
+ "innodb_buffer_pool_pages_misc": 0,
346
+ "innodb_buffer_pool_pages_total": 8064,
347
+ "innodb_buffer_pool_read_ahead": 0,
348
+ "innodb_buffer_pool_read_ahead_evicted": 0,
349
+ "innodb_buffer_pool_read_ahead_rnd": 0,
350
+ "innodb_buffer_pool_read_requests": 1911,
351
+ "innodb_buffer_pool_reads": 171,
352
+ "innodb_buffer_pool_wait_free": 0,
353
+ "innodb_buffer_pool_write_requests": 148,
354
+ "innodb_data_fsyncs": 17,
355
+ "innodb_data_pending_fsyncs": 0,
356
+ "innodb_data_pending_reads": 0,
357
+ "innodb_data_pending_writes": 0,
358
+ "innodb_data_read": 2801664,
359
+ "innodb_data_reads": 185,
360
+ "innodb_data_writes": 16,
361
+ "innodb_data_written": 0,
362
+ "innodb_deadlocks": 0,
363
+ "innodb_log_waits": 0,
364
+ "innodb_log_write_requests": 109,
365
+ "innodb_log_writes": 15,
366
+ "innodb_os_log_written": 6097,
367
+ "innodb_row_lock_current_waits": 0,
368
+ "innodb_rows_deleted": 0,
369
+ "innodb_rows_inserted": 0,
370
+ "innodb_rows_read": 0,
371
+ "innodb_rows_updated": 0,
372
+ "key_blocks_not_flushed": 0,
373
+ "key_blocks_unused": 107163,
374
+ "key_blocks_used": 0,
375
+ "key_read_requests": 0,
376
+ "key_reads": 0,
377
+ "key_write_requests": 0,
378
+ "key_writes": 0,
379
+ "max_connections": 151,
380
+ "max_used_connections": 1,
381
+ "open_files": 29,
382
+ "open_tables": 10,
383
+ "opened_files": 100,
384
+ "opened_tables": 16,
385
+ "process_list_fetch_query_duration": 0,
386
+ "process_list_longest_query_duration": 9,
387
+ "process_list_queries_count_system": 0,
388
+ "process_list_queries_count_user": 2,
389
+ "qcache_free_blocks": 1,
390
+ "qcache_free_memory": 1031272,
391
+ "qcache_hits": 0,
392
+ "qcache_inserts": 0,
393
+ "qcache_lowmem_prunes": 0,
394
+ "qcache_not_cached": 0,
395
+ "qcache_queries_in_cache": 0,
396
+ "qcache_total_blocks": 1,
397
+ "queries": 33,
398
+ "questions": 24,
399
+ "select_full_join": 0,
400
+ "select_full_range_join": 0,
401
+ "select_range": 0,
402
+ "select_range_check": 0,
403
+ "select_scan": 2,
404
+ "slow_queries": 0,
405
+ "sort_merge_passes": 0,
406
+ "sort_range": 0,
407
+ "sort_scan": 0,
408
+ "table_locks_immediate": 60,
409
+ "table_locks_waited": 0,
410
+ "table_open_cache": 2000,
411
+ "table_open_cache_overflows": 0,
412
+ "thread_cache_misses": 1666,
413
+ "threads_cached": 0,
414
+ "threads_connected": 1,
415
+ "threads_created": 2,
416
+ "threads_running": 3,
417
+ "userstats_netdata_access_denied": 33,
418
+ "userstats_netdata_binlog_bytes_written": 0,
419
+ "userstats_netdata_commit_transactions": 0,
420
+ "userstats_netdata_cpu_time": 40377,
421
+ "userstats_netdata_denied_connections": 49698,
422
+ "userstats_netdata_empty_queries": 66,
423
+ "userstats_netdata_lost_connections": 0,
424
+ "userstats_netdata_other_commands": 0,
425
+ "userstats_netdata_rollback_transactions": 0,
426
+ "userstats_netdata_rows_deleted": 0,
427
+ "userstats_netdata_rows_inserted": 0,
428
+ "userstats_netdata_rows_read": 0,
429
+ "userstats_netdata_rows_sent": 99,
430
+ "userstats_netdata_rows_updated": 0,
431
+ "userstats_netdata_select_commands": 33,
432
+ "userstats_netdata_total_connections": 1,
433
+ "userstats_netdata_update_commands": 0,
434
+ "userstats_root_access_denied": 0,
435
+ "userstats_root_binlog_bytes_written": 0,
436
+ "userstats_root_commit_transactions": 0,
437
+ "userstats_root_cpu_time": 20188,
438
+ "userstats_root_denied_connections": 0,
439
+ "userstats_root_empty_queries": 0,
440
+ "userstats_root_lost_connections": 0,
441
+ "userstats_root_other_commands": 0,
442
+ "userstats_root_rollback_transactions": 0,
443
+ "userstats_root_rows_deleted": 0,
444
+ "userstats_root_rows_inserted": 0,
445
+ "userstats_root_rows_read": 0,
446
+ "userstats_root_rows_sent": 2,
447
+ "userstats_root_rows_updated": 0,
448
+ "userstats_root_select_commands": 0,
449
+ "userstats_root_total_connections": 1,
450
+ "userstats_root_update_commands": 0,
451
+ "wsrep_cluster_size": 0,
452
+ "wsrep_cluster_status_disconnected": 1,
453
+ "wsrep_cluster_status_non_primary": 0,
454
+ "wsrep_cluster_status_primary": 0,
455
+ "wsrep_connected": 0,
456
+ "wsrep_local_bf_aborts": 0,
457
+ "wsrep_ready": 0,
458
+ "wsrep_thread_count": 0,
459
+ }
460
+
461
+ copyProcessListQueryDuration(mx, expected)
462
+ require.Equal(t, expected, mx)
463
+ ensureCollectedHasAllChartsDimsVarsIDs(t, collr, mx)
464
+ },
465
+ },
466
+ },
467
"MariaDB-Standalone[v5.5.64]: success on all queries": {
468
{
469
prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
src/go/plugin/go.d/collector/mysql/testdata/mariadb/v11.4.5/user_statistics.txt
new
+6
@@ -0,0 +1,6 @@
1
++---------+-------------------+------------------------+----------------+---------------------+---------------------+----------------+------------+----------------------+-----------+-----------+--------------+---------------+--------------+-----------------+-----------------+----------------+---------------------+-----------------------+--------------------+------------------+---------------+---------------+-----------------------+-----------------------------+
2
+| User | Total_connections | Concurrent_connections | Connected_time | Busy_time | Cpu_time | Bytes_received | Bytes_sent | Binlog_bytes_written | Rows_read | Rows_sent | Rows_deleted | Rows_inserted | Rows_updated | Select_commands | Update_commands | Other_commands | Commit_transactions | Rollback_transactions | Denied_connections | Lost_connections | Access_denied | Empty_queries | Total_ssl_connections | Max_statement_time_exceeded |
3
++---------+-------------------+------------------------+----------------+---------------------+---------------------+----------------+------------+----------------------+-----------+-----------+--------------+---------------+--------------+-----------------+-----------------+----------------+---------------------+-----------------------+--------------------+------------------+---------------+---------------+-----------------------+-----------------------------+
4
+| root | 1 | 0 | 9 | 201889318 | 201889318 | 25 | 2799 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
5
+| netdata | 1 | 0 | 32 | 403778636 | 403778636 | 13440 | 105432 | 0 | 0 | 99 | 0 | 0 | 0 | 33 | 0 | 0 | 0 | 0 | 49698 | 0 | 33 | 66 | 0 | 0 |
6
++---------+-------------------+------------------------+----------------+---------------------+---------------------+----------------+------------+----------------------+-----------+-----------+--------------+---------------+--------------+-----------------+-----------------+----------------+---------------------+-----------------------+--------------------+------------------+---------------+---------------+-----------------------+-----------------------------+
\ No newline at end of file
src/go/plugin/go.d/collector/mysql/testdata/mariadb/v11.4.5/version.txt
new
+6
@@ -0,0 +1,6 @@
1
++-----------------+---------------------+
2
+| Variable_name | Value |
3
++-----------------+---------------------+
4
+| version | 11.4.5-MariaDB |
5
+| version_comment | Source distribution |
6
++-----------------+---------------------+
\ No newline at end of file