@@ -21,10 +21,55 @@ 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
2728const perfEventsStatementsQuery = `
29+ SELECT
30+ ifnull(SCHEMA_NAME, 'NONE') as SCHEMA_NAME,
31+ DIGEST,
32+ LEFT(DIGEST_TEXT, %d) as DIGEST_TEXT,
33+ COUNT_STAR,
34+ SUM_TIMER_WAIT,
35+ SUM_ERRORS,
36+ SUM_WARNINGS,
37+ SUM_ROWS_AFFECTED,
38+ SUM_ROWS_SENT,
39+ SUM_ROWS_EXAMINED,
40+ SUM_CREATED_TMP_DISK_TABLES,
41+ SUM_CREATED_TMP_TABLES,
42+ SUM_SORT_MERGE_PASSES,
43+ SUM_SORT_ROWS,
44+ SUM_NO_INDEX_USED
45+ FROM (
46+ SELECT *
47+ FROM performance_schema.events_statements_summary_by_digest
48+ WHERE SCHEMA_NAME NOT IN ('mysql', 'performance_schema', 'information_schema')
49+ AND LAST_SEEN > DATE_SUB(NOW(), INTERVAL %d SECOND)
50+ ORDER BY LAST_SEEN DESC
51+ )Q
52+ GROUP BY
53+ Q.SCHEMA_NAME,
54+ Q.DIGEST,
55+ Q.DIGEST_TEXT,
56+ Q.COUNT_STAR,
57+ Q.SUM_TIMER_WAIT,
58+ Q.SUM_ERRORS,
59+ Q.SUM_WARNINGS,
60+ Q.SUM_ROWS_AFFECTED,
61+ Q.SUM_ROWS_SENT,
62+ Q.SUM_ROWS_EXAMINED,
63+ Q.SUM_CREATED_TMP_DISK_TABLES,
64+ Q.SUM_CREATED_TMP_TABLES,
65+ Q.SUM_SORT_MERGE_PASSES,
66+ Q.SUM_SORT_ROWS,
67+ Q.SUM_NO_INDEX_USED
68+ ORDER BY SUM_TIMER_WAIT DESC
69+ LIMIT %d
70+ `
71+
72+ const perfEventsStatementsQueryMySQL = `
2873 SELECT
2974 ifnull(SCHEMA_NAME, 'NONE') as SCHEMA_NAME,
3075 DIGEST,
@@ -193,12 +238,20 @@ func (ScrapePerfEventsStatements) Version() float64 {
193238
194239// Scrape collects data from database connection and sends it over channel as prometheus metric.
195240func (ScrapePerfEventsStatements ) Scrape (ctx context.Context , instance * instance , ch chan <- prometheus.Metric , logger * slog.Logger ) error {
196- perfQuery := fmt .Sprintf (
197- perfEventsStatementsQuery ,
241+ mysqlVersion8028 := instance .flavor == FlavorMySQL && instance .version .GTE (semver .MustParse ("8.0.28" ))
242+
243+ perfQuery := perfEventsStatementsQuery
244+ if mysqlVersion8028 {
245+ perfQuery = perfEventsStatementsQueryMySQL
246+ }
247+
248+ perfQuery = fmt .Sprintf (
249+ perfQuery ,
198250 * perfEventsStatementsDigestTextLimit ,
199251 * perfEventsStatementsTimeLimit ,
200252 * perfEventsStatementsLimit ,
201253 )
254+
202255 db := instance .getDB ()
203256 // Timers here are returned in picoseconds.
204257 perfSchemaEventsStatementsRows , err := db .QueryContext (ctx , perfQuery )
@@ -218,9 +271,17 @@ func (ScrapePerfEventsStatements) Scrape(ctx context.Context, instance *instance
218271 quantile95 , quantile99 , quantile999 uint64
219272 )
220273 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 {
274+ var err error
275+ if mysqlVersion8028 {
276+ err = perfSchemaEventsStatementsRows .Scan (
277+ & schemaName , & digest , & digestText , & count , & queryTime , & lockTime , & cpuTime , & errors , & warnings , & rowsAffected , & rowsSent , & rowsExamined , & tmpDiskTables , & tmpTables , & sortMergePasses , & sortRows , & noIndexUsed , & quantile95 , & quantile99 , & quantile999 ,
278+ )
279+ } else {
280+ err = perfSchemaEventsStatementsRows .Scan (
281+ & schemaName , & digest , & digestText , & count , & queryTime , & errors , & warnings , & rowsAffected , & rowsSent , & rowsExamined , & tmpDiskTables , & tmpTables , & sortMergePasses , & sortRows , & noIndexUsed ,
282+ )
283+ }
284+ if err != nil {
224285 return err
225286 }
226287 ch <- prometheus .MustNewConstMetric (
0 commit comments