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