@cryptotaxi247 / netdata-1 / commits / d4ea873e5

go.d: mysql: disable session query log and slow query log (#17219)

Ilya Mashchenko committed Mar 21, 2024 at 20:42 UTC d4ea873e5751c2063a0a10dce234c1d5baee6617
5 files changed +114
src/go/collectors/go.d.plugin/modules/mysql/collect.go
+2
@@ -28,6 +28,8 @@ func (m *MySQL) collect() (map[string]int64, error) {
28 m.doUserStatistics = m.isPercona || m.isMariaDB && m.version.GTE(semver.Version{Major: 10, Minor: 1, Patch: 1})
29 }
30
31 + m.disableSessionQueryLog()
32 +
33 mx := make(map[string]int64)
34
35 if err := m.collectGlobalStatus(mx); err != nil {
src/go/collectors/go.d.plugin/modules/mysql/disable_logging.go new
+58
@@ -0,0 +1,58 @@
1 +// SPDX-License-Identifier: GPL-3.0-or-later
2 +
3 +package mysql
4 +
5 +const (
6 + queryShowSessionVariables = `
7 +SHOW SESSION VARIABLES
8 +WHERE
9 + Variable_name LIKE 'sql_log_off'
10 + OR Variable_name LIKE 'slow_query_log';`
11 +)
12 +
13 +const (
14 + queryDisableSessionQueryLog = "SET SESSION sql_log_off='ON';"
15 + queryDisableSessionSlowQueryLog = "SET SESSION slow_query_log='OFF';"
16 +)
17 +
18 +func (m *MySQL) disableSessionQueryLog() {
19 + q := queryShowSessionVariables
20 + m.Debugf("executing query: '%s'", q)
21 +
22 + var sqlLogOff, slowQueryLog string
23 + var name string
24 + _, err := m.collectQuery(q, func(column, value string, _ bool) {
25 + switch column {
26 + case "Variable_name":
27 + name = value
28 + case "Value":
29 + switch name {
30 + case "sql_log_off":
31 + sqlLogOff = value
32 + case "slow_query_log":
33 + slowQueryLog = value
34 + }
35 + }
36 + })
37 + if err != nil {
38 + m.Debug(err)
39 + return
40 + }
41 +
42 + if sqlLogOff == "OFF" && m.doDisableSessionQueryLog {
43 + // requires SUPER privileges
44 + q = queryDisableSessionQueryLog
45 + m.Debugf("executing query: '%s'", q)
46 + if _, err := m.collectQuery(q, func(_, _ string, _ bool) {}); err != nil {
47 + m.Infof("failed to disable session query log (sql_log_off): %v", err)
48 + m.doDisableSessionQueryLog = false
49 + }
50 + }
51 + if slowQueryLog == "ON" {
52 + q = queryDisableSessionSlowQueryLog
53 + m.Debugf("executing query: '%s'", q)
54 + if _, err := m.collectQuery(q, func(_, _ string, _ bool) {}); err != nil {
55 + m.Debugf("failed to disable session slow query log (slow_query_log): %v", err)
56 + }
57 + }
58 +}
src/go/collectors/go.d.plugin/modules/mysql/mysql.go
+3
@@ -43,6 +43,7 @@ func New() *MySQL {
43 addGaleraOnce: &sync.Once{},
44 addQCacheOnce: &sync.Once{},
45 addTableOpenCacheOverflowsOnce: &sync.Once{},
46 + doDisableSessionQueryLog: true,
47 doSlaveStatus: true,
48 doUserStatistics: true,
49 collectedReplConns: make(map[string]bool),
@@ -79,6 +80,8 @@ type MySQL struct {
80 isMariaDB bool
81 isPercona bool
82
83 + doDisableSessionQueryLog bool
84 +
85 doSlaveStatus bool
86 collectedReplConns map[string]bool
87 doUserStatistics bool
src/go/collectors/go.d.plugin/modules/mysql/mysql_test.go
+45
@@ -24,6 +24,8 @@ var (
24 dataConfigJSON, _ = os.ReadFile("testdata/config.json")
25 dataConfigYAML, _ = os.ReadFile("testdata/config.yaml")
26
27 + dataSessionVariables, _ = os.ReadFile("testdata/session_variables.txt")
28 +
29 dataMySQLVer8030Version, _ = os.ReadFile("testdata/mysql/v8.0.30/version.txt")
30 dataMySQLVer8030GlobalStatus, _ = os.ReadFile("testdata/mysql/v8.0.30/global_status.txt")
31 dataMySQLVer8030GlobalVariables, _ = os.ReadFile("testdata/mysql/v8.0.30/global_variables.txt")
@@ -60,6 +62,7 @@ func Test_testDataIsValid(t *testing.T) {
62 for name, data := range map[string][]byte{
63 "dataConfigJSON": dataConfigJSON,
64 "dataConfigYAML": dataConfigYAML,
65 + "dataSessionVariables": dataSessionVariables,
66 "dataMySQLVer8030Version": dataMySQLVer8030Version,
67 "dataMySQLVer8030GlobalStatus": dataMySQLVer8030GlobalStatus,
68 "dataMySQLVer8030GlobalVariables": dataMySQLVer8030GlobalVariables,
@@ -164,6 +167,9 @@ func TestMySQL_Check(t *testing.T) {
167 wantFail: false,
168 prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
169 mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
170 + mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
171 + mockExpect(t, m, queryDisableSessionQueryLog, nil)
172 + mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
173 mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
174 mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
175 mockExpect(t, m, queryShowAllSlavesStatus, dataMariaVer1084AllSlavesStatusMultiSource)
@@ -181,6 +187,9 @@ func TestMySQL_Check(t *testing.T) {
187 wantFail: true,
188 prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
189 mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
190 + mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
191 + mockExpect(t, m, queryDisableSessionQueryLog, nil)
192 + mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
193 mockExpectErr(m, queryShowGlobalStatus)
194 },
195 },
@@ -188,6 +197,9 @@ func TestMySQL_Check(t *testing.T) {
197 wantFail: true,
198 prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
199 mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
200 + mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
201 + mockExpect(t, m, queryDisableSessionQueryLog, nil)
202 + mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
203 mockExpectErr(m, queryShowGlobalStatus)
204 },
205 },
@@ -195,6 +207,9 @@ func TestMySQL_Check(t *testing.T) {
207 wantFail: false,
208 prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
209 mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
210 + mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
211 + mockExpect(t, m, queryDisableSessionQueryLog, nil)
212 + mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
213 mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
214 mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
215 mockExpectErr(m, queryShowAllSlavesStatus)
@@ -206,6 +221,9 @@ func TestMySQL_Check(t *testing.T) {
221 wantFail: false,
222 prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
223 mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
224 + mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
225 + mockExpect(t, m, queryDisableSessionQueryLog, nil)
226 + mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
227 mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
228 mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
229 mockExpect(t, m, queryShowAllSlavesStatus, dataMariaVer1084AllSlavesStatusMultiSource)
@@ -217,6 +235,9 @@ func TestMySQL_Check(t *testing.T) {
235 wantFail: false,
236 prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
237 mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
238 + mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
239 + mockExpect(t, m, queryDisableSessionQueryLog, nil)
240 + mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
241 mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
242 mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
243 mockExpect(t, m, queryShowAllSlavesStatus, dataMariaVer1084AllSlavesStatusMultiSource)
@@ -260,6 +281,9 @@ func TestMySQL_Collect(t *testing.T) {
281 {
282 prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
283 mockExpect(t, m, queryShowVersion, dataMariaVer5564Version)
284 + mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
285 + mockExpect(t, m, queryDisableSessionQueryLog, nil)
286 + mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
287 mockExpect(t, m, queryShowGlobalStatus, dataMariaVer5564GlobalStatus)
288 mockExpect(t, m, queryShowGlobalVariables, dataMariaVer5564GlobalVariables)
289 mockExpect(t, m, queryShowSlaveStatus, nil)
@@ -391,6 +415,9 @@ func TestMySQL_Collect(t *testing.T) {
415 {
416 prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
417 mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
418 + mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
419 + mockExpect(t, m, queryDisableSessionQueryLog, nil)
420 + mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
421 mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
422 mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
423 mockExpect(t, m, queryShowAllSlavesStatus, nil)
@@ -570,6 +597,9 @@ func TestMySQL_Collect(t *testing.T) {
597 {
598 prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
599 mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
600 + mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
601 + mockExpect(t, m, queryDisableSessionQueryLog, nil)
602 + mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
603 mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
604 mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
605 mockExpect(t, m, queryShowAllSlavesStatus, dataMariaVer1084AllSlavesStatusSingleSource)
@@ -751,6 +781,9 @@ func TestMySQL_Collect(t *testing.T) {
781 {
782 prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
783 mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
784 + mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
785 + mockExpect(t, m, queryDisableSessionQueryLog, nil)
786 + mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
787 mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
788 mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
789 mockExpect(t, m, queryShowAllSlavesStatus, dataMariaVer1084AllSlavesStatusMultiSource)
@@ -935,6 +968,9 @@ func TestMySQL_Collect(t *testing.T) {
968 {
969 prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
970 mockExpect(t, m, queryShowVersion, dataMariaVer1084Version)
971 + mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
972 + mockExpect(t, m, queryDisableSessionQueryLog, nil)
973 + mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
974 mockExpect(t, m, queryShowGlobalStatus, dataMariaVer1084GlobalStatus)
975 mockExpect(t, m, queryShowGlobalVariables, dataMariaVer1084GlobalVariables)
976 mockExpectErr(m, queryShowAllSlavesStatus)
@@ -1113,6 +1149,9 @@ func TestMySQL_Collect(t *testing.T) {
1149 {
1150 prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
1151 mockExpect(t, m, queryShowVersion, dataMariaGaleraClusterVer1084Version)
1152 + mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
1153 + mockExpect(t, m, queryDisableSessionQueryLog, nil)
1154 + mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
1155 mockExpect(t, m, queryShowGlobalStatus, dataMariaGaleraClusterVer1084GlobalStatus)
1156 mockExpect(t, m, queryShowGlobalVariables, dataMariaGaleraClusterVer1084GlobalVariables)
1157 mockExpect(t, m, queryShowAllSlavesStatus, nil)
@@ -1307,6 +1346,9 @@ func TestMySQL_Collect(t *testing.T) {
1346 {
1347 prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
1348 mockExpect(t, m, queryShowVersion, dataMySQLVer8030Version)
1349 + mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
1350 + mockExpect(t, m, queryDisableSessionQueryLog, nil)
1351 + mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
1352 mockExpect(t, m, queryShowGlobalStatus, dataMySQLVer8030GlobalStatus)
1353 mockExpect(t, m, queryShowGlobalVariables, dataMySQLVer8030GlobalVariables)
1354 mockExpect(t, m, queryShowReplicaStatus, dataMySQLVer8030ReplicaStatusMultiSource)
@@ -1442,6 +1484,9 @@ func TestMySQL_Collect(t *testing.T) {
1484 {
1485 prepareMock: func(t *testing.T, m sqlmock.Sqlmock) {
1486 mockExpect(t, m, queryShowVersion, dataPerconaVer8029Version)
1487 + mockExpect(t, m, queryShowSessionVariables, dataSessionVariables)
1488 + mockExpect(t, m, queryDisableSessionQueryLog, nil)
1489 + mockExpect(t, m, queryDisableSessionSlowQueryLog, nil)
1490 mockExpect(t, m, queryShowGlobalStatus, dataPerconaVer8029GlobalStatus)
1491 mockExpect(t, m, queryShowGlobalVariables, dataPerconaVer8029GlobalVariables)
1492 mockExpect(t, m, queryShowReplicaStatus, nil)
src/go/collectors/go.d.plugin/modules/mysql/testdata/session_variables.txt new
+6
@@ -0,0 +1,6 @@
1 ++----------------+-------+
2 +| Variable_name | Value |
3 ++----------------+-------+
4 +| sql_log_off | OFF |
5 +| slow_query_log | ON |
6 ++----------------+-------+
\ No newline at end of file