@cryptotaxi247 / netdata-1 / commits / b81150bcd

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