Skip to content

Commit a6f8246

Browse files
committed
Fix #905: use SUM_LOCK_TIME and SUM_CPU_TIME with mysql >= 8.0.28
Fix issue introduced in #862 Only query SUM_LOCK_TIME and SUM_CPU_TIME when using MySQL >= 8.0.28.
1 parent c6a1d2b commit a6f8246

File tree

1 file changed

+28
-8
lines changed

1 file changed

+28
-8
lines changed

collector/perf_schema_events_statements.go

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"log/slog"
2222

2323
"github.com/alecthomas/kingpin/v2"
24+
"github.com/blang/semver/v4"
2425
"github.com/prometheus/client_golang/prometheus"
2526
)
2627

@@ -31,8 +32,6 @@ const perfEventsStatementsQuery = `
3132
LEFT(DIGEST_TEXT, %d) as DIGEST_TEXT,
3233
COUNT_STAR,
3334
SUM_TIMER_WAIT,
34-
SUM_LOCK_TIME,
35-
SUM_CPU_TIME,
3635
SUM_ERRORS,
3736
SUM_WARNINGS,
3837
SUM_ROWS_AFFECTED,
@@ -46,6 +45,7 @@ const perfEventsStatementsQuery = `
4645
QUANTILE_95,
4746
QUANTILE_99,
4847
QUANTILE_999
48+
%s
4949
FROM (
5050
SELECT *
5151
FROM performance_schema.events_statements_summary_by_digest
@@ -59,8 +59,6 @@ const perfEventsStatementsQuery = `
5959
Q.DIGEST_TEXT,
6060
Q.COUNT_STAR,
6161
Q.SUM_TIMER_WAIT,
62-
Q.SUM_LOCK_TIME,
63-
Q.SUM_CPU_TIME,
6462
Q.SUM_ERRORS,
6563
Q.SUM_WARNINGS,
6664
Q.SUM_ROWS_AFFECTED,
@@ -74,6 +72,7 @@ const perfEventsStatementsQuery = `
7472
Q.QUANTILE_95,
7573
Q.QUANTILE_99,
7674
Q.QUANTILE_999
75+
%s
7776
ORDER BY SUM_TIMER_WAIT DESC
7877
LIMIT %d
7978
`
@@ -193,12 +192,24 @@ func (ScrapePerfEventsStatements) Version() float64 {
193192

194193
// Scrape collects data from database connection and sends it over channel as prometheus metric.
195194
func (ScrapePerfEventsStatements) Scrape(ctx context.Context, instance *instance, ch chan<- prometheus.Metric, logger *slog.Logger) error {
195+
additionalColumns := ""
196+
additionalGroupBy := ""
197+
useAdditionalColumns := false
198+
if instance.flavor == FlavorMySQL && instance.version.GTE(semver.MustParse("8.0.28")) {
199+
additionalColumns = ", SUM_LOCK_TIME, SUM_CPU_TIME"
200+
additionalGroupBy = ", Q.SUM_LOCK_TIME, Q.SUM_CPU_TIME"
201+
useAdditionalColumns = true
202+
}
203+
196204
perfQuery := fmt.Sprintf(
197205
perfEventsStatementsQuery,
198206
*perfEventsStatementsDigestTextLimit,
207+
additionalColumns,
199208
*perfEventsStatementsTimeLimit,
209+
additionalGroupBy,
200210
*perfEventsStatementsLimit,
201211
)
212+
202213
db := instance.getDB()
203214
// Timers here are returned in picoseconds.
204215
perfSchemaEventsStatementsRows, err := db.QueryContext(ctx, perfQuery)
@@ -209,18 +220,27 @@ func (ScrapePerfEventsStatements) Scrape(ctx context.Context, instance *instance
209220

210221
var (
211222
schemaName, digest, digestText string
212-
count, queryTime, lockTime, cpuTime uint64
223+
count, queryTime uint64
213224
errors, warnings uint64
214225
rowsAffected, rowsSent, rowsExamined uint64
215226
tmpTables, tmpDiskTables uint64
216227
sortMergePasses, sortRows uint64
217228
noIndexUsed uint64
218229
quantile95, quantile99, quantile999 uint64
230+
lockTime, cpuTime uint64
219231
)
220232
for perfSchemaEventsStatementsRows.Next() {
221-
if err := perfSchemaEventsStatementsRows.Scan(
222-
&schemaName, &digest, &digestText, &count, &queryTime, &lockTime, &cpuTime, &errors, &warnings, &rowsAffected, &rowsSent, &rowsExamined, &tmpDiskTables, &tmpTables, &sortMergePasses, &sortRows, &noIndexUsed, &quantile95, &quantile99, &quantile999,
223-
); err != nil {
233+
var err error
234+
if useAdditionalColumns {
235+
err = perfSchemaEventsStatementsRows.Scan(
236+
&schemaName, &digest, &digestText, &count, &queryTime, &errors, &warnings, &rowsAffected, &rowsSent, &rowsExamined, &tmpDiskTables, &tmpTables, &sortMergePasses, &sortRows, &noIndexUsed, &quantile95, &quantile99, &quantile999, &lockTime, &cpuTime,
237+
)
238+
} else {
239+
err = perfSchemaEventsStatementsRows.Scan(
240+
&schemaName, &digest, &digestText, &count, &queryTime, &errors, &warnings, &rowsAffected, &rowsSent, &rowsExamined, &tmpDiskTables, &tmpTables, &sortMergePasses, &sortRows, &noIndexUsed, &quantile95, &quantile99, &quantile999,
241+
)
242+
}
243+
if err != nil {
224244
return err
225245
}
226246
ch <- prometheus.MustNewConstMetric(

0 commit comments

Comments
 (0)