master
go 64 lines 1.64 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package mysql
4
5 import (
6 "context"
7 "strings"
8
9 "github.com/blang/semver/v4"
10 )
11
12 const queryShowUserStatistics = "SHOW USER_STATISTICS;"
13
14 func mustDivideMariaDBUserStatsCPUTime(version *semver.Version, isMariaDB bool) bool {
15 if !isMariaDB || version == nil {
16 return false
17 }
18 return version.EQ(semver.Version{Major: 10, Minor: 11, Patch: 11}) ||
19 version.EQ(semver.Version{Major: 11, Minor: 4, Patch: 5})
20 }
21
22 func (c *Collector) collectUserStatistics(ctx context.Context) error {
23 // https://mariadb.com/kb/en/user-statistics/
24 // https://mariadb.com/kb/en/information-schema-user_statistics-table/
25 q := queryShowUserStatistics
26 c.Debugf("executing query: '%s'", q)
27
28 var user string
29 _, err := c.collectQuery(ctx, q, func(column, value string, _ bool) {
30 switch column {
31 case "User":
32 user = value
33 case "Cpu_time":
34 // https://jira.mariadb.org/browse/MDEV-36586
35 needsDivision := mustDivideMariaDBUserStatsCPUTime(c.version, c.isMariaDB)
36
37 if needsDivision {
38 c.mx.setUser("userstats_cpu_time", user, int64(parseFloat(value)/1e7*1000))
39 } else {
40 c.mx.setUser("userstats_cpu_time", user, int64(parseFloat(value)*1000))
41 }
42 case
43 "Total_connections",
44 "Lost_connections",
45 "Denied_connections",
46 "Empty_queries",
47 "Binlog_bytes_written",
48 "Rows_read",
49 "Rows_sent",
50 "Rows_deleted",
51 "Rows_inserted",
52 "Rows_updated",
53 "Rows_fetched", // Percona
54 "Select_commands",
55 "Update_commands",
56 "Other_commands",
57 "Access_denied",
58 "Commit_transactions",
59 "Rollback_transactions":
60 c.mx.setUser("userstats_"+strings.ToLower(column), user, parseInt(value))
61 }
62 })
63 return err
64 }