From 4fe1c37eff66befb7ab5833e9d5e67cd689d7f94 Mon Sep 17 00:00:00 2001 From: Oleksandr Kapustin Date: Wed, 17 Jul 2019 16:53:44 +1000 Subject: [PATCH 1/9] Added metrics from performance_schema.events_statements_summary_by_account_by_event_name --- plugins/inputs/mysql/mysql.go | 195 ++++++++++++++++++++++++++++++++-- 1 file changed, 189 insertions(+), 6 deletions(-) diff --git a/plugins/inputs/mysql/mysql.go b/plugins/inputs/mysql/mysql.go index 0516e22b73bf8..32765b23e1e74 100644 --- a/plugins/inputs/mysql/mysql.go +++ b/plugins/inputs/mysql/mysql.go @@ -36,6 +36,8 @@ type Mysql struct { GatherTableSchema bool `toml:"gather_table_schema"` GatherFileEventsStats bool `toml:"gather_file_events_stats"` GatherPerfEventsStatements bool `toml:"gather_perf_events_statements"` + GatherPerfSummaryPerAccountPerEvent bool `toml:"gather_perf_sum_per_acc_per_event"` + PerfSummaryEvents []string `toml:"perf_summary_events"` IntervalSlow string `toml:"interval_slow"` MetricVersion int `toml:"metric_version"` tls.ClientConfig @@ -115,6 +117,12 @@ var sampleConfig = ` ## Some queries we may want to run less often (such as SHOW GLOBAL VARIABLES) interval_slow = "30m" + ## gather metrics from PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_SUMMARY_BY_ACCOUNT_BY_EVENT_NAME + gather_perf_sum_per_acc_per_event = false + ## list of events to be gathered for gather_perf_sum_per_acc_per_event + ## in case of empty list all events will be gathered + perf_summary_events = [] + ## Optional TLS Config (will be used if tls=custom parameter specified in server uri) # tls_ca = "/etc/telegraf/ca.pem" # tls_cert = "/etc/telegraf/cert.pem" @@ -202,10 +210,10 @@ var ( "deleting": uint32(0), "executing": uint32(0), "execution of init_command": uint32(0), - "end": uint32(0), - "freeing items": uint32(0), - "flushing tables": uint32(0), - "fulltext initialization": uint32(0), + "end": uint32(0), + "freeing items": uint32(0), + "flushing tables": uint32(0), + "fulltext initialization": uint32(0), "idle": uint32(0), "init": uint32(0), "killed": uint32(0), @@ -241,8 +249,8 @@ var ( } // plaintext statuses stateStatusMappings = map[string]string{ - "user sleep": "idle", - "creating index": "altering table", + "user sleep": "idle", + "creating index": "altering table", "committing alter table to storage engine": "altering table", "discard or import tablespace": "altering table", "rename": "altering table", @@ -404,6 +412,38 @@ const ( FROM information_schema.tables WHERE table_schema = 'performance_schema' AND table_name = ? ` + + perfSummaryPerAccountPerEvent = ` + SELECT + coalesce(user, "unknown"), + coalesce(host, "unknown"), + coalesce(event_name, "unknown"), + count_star, + sum_timer_wait, + min_timer_wait, + avg_timer_wait, + max_timer_wait, + sum_lock_time, + sum_errors, + sum_warnings, + sum_rows_affected, + sum_rows_sent, + sum_rows_examined, + sum_created_tmp_disk_tables, + sum_created_tmp_tables, + sum_select_full_join, + sum_select_full_range_join, + sum_select_range, + sum_select_range_check, + sum_select_scan, + sum_sort_merge_passes, + sum_sort_range, + sum_sort_rows, + sum_sort_scan, + sum_no_index_used, + sum_no_good_index_used + FROM performance_schema.events_statements_summary_by_account_by_event_name + ` ) func (m *Mysql) gatherServer(serv string, acc telegraf.Accumulator) error { @@ -477,6 +517,13 @@ func (m *Mysql) gatherServer(serv string, acc telegraf.Accumulator) error { } } + if m.GatherPerfSummaryPerAccountPerEvent { + err = m.gatherPerfSummaryPerAccountPerEvent(db, serv, acc) + if err != nil { + return err + } + } + if m.GatherTableIOWaits { err = m.gatherPerfTableIOWaits(db, serv, acc) if err != nil { @@ -1227,6 +1274,142 @@ func (m *Mysql) gatherInnoDBMetrics(db *sql.DB, serv string, acc telegraf.Accumu return nil } +// gatherPerfSummaryPerAccountPerEvent can be used to fetch enabled metrics from +// performance_schema.events_statements_summary_by_account_by_event_name +func (m *Mysql) gatherPerfSummaryPerAccountPerEvent(db *sql.DB, serv string, acc telegraf.Accumulator) error { + + sqlQuery := perfSummaryPerAccountPerEvent + + var rows *sql.Rows + var err error + + var ( + srcUser string + srcHost string + eventName string + countStar float64 + sumTimerWait float64 + minTimerWait float64 + avgTimerWait float64 + maxTimerWait float64 + sumLockTime float64 + sumErrors float64 + sumWarnings float64 + sumRowsAffected float64 + sumRowsSent float64 + sumRowsExamined float64 + sumCreatedTmpDiskTables float64 + sumCreatedTmpTables float64 + sumSelectFullJoin float64 + sumSelectFullRangeJoin float64 + sumSelectRange float64 + sumSelectRangeCheck float64 + sumSelectScan float64 + sumSortMergePasses float64 + sumSortRange float64 + sumSortRows float64 + sumSortScan float64 + sumNoIndexUsed float64 + sumNoGoodIndexUsed float64 + ) + + var events []interface{} + if len(m.PerfSummaryEvents) > 0 { + sqlQuery += " WHERE EVENT_NAME IN (" + for i, eventName := range m.PerfSummaryEvents { + if i > 0 { + sqlQuery += ", " + } + sqlQuery += "?" + events = append(events, eventName) + } + sqlQuery += ")" + + rows, err = db.Query(sqlQuery, events...) + } else { + rows, err = db.Query(perfSummaryPerAccountPerEvent) + } + + if err != nil { + return err + } + defer rows.Close() + + // parse DSN and save server tag + servtag := getDSNTag(serv) + tags := map[string]string{"server": servtag} + for rows.Next() { + if err := rows.Scan( + &srcUser, + &srcHost, + &eventName, + &countStar, + &sumTimerWait, + &minTimerWait, + &avgTimerWait, + &maxTimerWait, + &sumLockTime, + &sumErrors, + &sumWarnings, + &sumRowsAffected, + &sumRowsSent, + &sumRowsExamined, + &sumCreatedTmpDiskTables, + &sumCreatedTmpTables, + &sumSelectFullJoin, + &sumSelectFullRangeJoin, + &sumSelectRange, + &sumSelectRangeCheck, + &sumSelectScan, + &sumSortMergePasses, + &sumSortRange, + &sumSortRows, + &sumSortScan, + &sumNoIndexUsed, + &sumNoGoodIndexUsed, + ); err != nil { + return err + } + srcUser = strings.ToLower(srcUser) + srcHost = strings.ToLower(srcHost) + + sqlLWTags := copyTags(tags) + sqlLWTags["src_user"] = srcUser + sqlLWTags["src_host"] = srcHost + sqlLWTags["event"] = eventName + sqlLWFields := map[string]interface{}{ + "count_star": countStar, + "sum_timer_wait": sumTimerWait, + "min_timer_wait": minTimerWait, + "avg_timer_wait": avgTimerWait, + "max_timer_wait": maxTimerWait, + "sum_lock_time": sumLockTime, + "sum_errors": sumErrors, + "sum_warnings": sumWarnings, + "sum_rows_affected": sumRowsAffected, + "sum_rows_sent": sumRowsSent, + "sum_rows_examined": sumRowsExamined, + "sum_created_tmp_disk_tables": sumCreatedTmpDiskTables, + "sum_created_tmp_tables": sumCreatedTmpTables, + "sum_select_full_join": sumSelectFullJoin, + "sum_select_full_range_join": sumSelectFullRangeJoin, + "sum_select_range": sumSelectRange, + "sum_select_range_check": sumSelectRangeCheck, + "sum_select_scan": sumSelectScan, + "sum_sort_merge_passes": sumSortMergePasses, + "sum_sort_range": sumSortRange, + "sum_sort_rows": sumSortRows, + "sum_sort_scan": sumSortScan, + "sum_no_index_used": sumNoIndexUsed, + "sum_no_good_index_used": sumNoGoodIndexUsed, + } + acc.AddFields("mysql_perf_acc_event", sqlLWFields, sqlLWTags) + + } + + return nil +} + // gatherPerfTableLockWaits can be used to get // the total number and time for SQL and external lock wait events // for each table and operation From 633104caf2f2f88d4ae178b39c0c58fece8ec8fe Mon Sep 17 00:00:00 2001 From: Oleksandr Kapustin Date: Wed, 17 Jul 2019 17:01:49 +1000 Subject: [PATCH 2/9] Added Readme changes --- plugins/inputs/mysql/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/inputs/mysql/README.md b/plugins/inputs/mysql/README.md index 564d75e614046..2cab9c2367bf3 100644 --- a/plugins/inputs/mysql/README.md +++ b/plugins/inputs/mysql/README.md @@ -79,6 +79,13 @@ This plugin gathers the statistic data from MySQL server ## gather metrics from PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_SUMMARY_BY_DIGEST gather_perf_events_statements = false # + ## gather metrics from PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_SUMMARY_BY_ACCOUNT_BY_EVENT_NAME + gather_perf_sum_per_acc_per_event = false + # + ## list of events to be gathered for gather_perf_sum_per_acc_per_event + ## in case of empty list all events will be gathered + perf_summary_events = [] + # ## Some queries we may want to run less often (such as SHOW GLOBAL VARIABLES) interval_slow = "30m" From ecc00f6a568d3816dac0cfef1a328bb065f7d868 Mon Sep 17 00:00:00 2001 From: Oleksandr Kapustin Date: Wed, 17 Jul 2019 17:39:15 +1000 Subject: [PATCH 3/9] #6131 updated gofmt --- plugins/inputs/mysql/mysql.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/inputs/mysql/mysql.go b/plugins/inputs/mysql/mysql.go index 32765b23e1e74..9239ca2f17718 100644 --- a/plugins/inputs/mysql/mysql.go +++ b/plugins/inputs/mysql/mysql.go @@ -210,10 +210,10 @@ var ( "deleting": uint32(0), "executing": uint32(0), "execution of init_command": uint32(0), - "end": uint32(0), - "freeing items": uint32(0), - "flushing tables": uint32(0), - "fulltext initialization": uint32(0), + "end": uint32(0), + "freeing items": uint32(0), + "flushing tables": uint32(0), + "fulltext initialization": uint32(0), "idle": uint32(0), "init": uint32(0), "killed": uint32(0), @@ -249,8 +249,8 @@ var ( } // plaintext statuses stateStatusMappings = map[string]string{ - "user sleep": "idle", - "creating index": "altering table", + "user sleep": "idle", + "creating index": "altering table", "committing alter table to storage engine": "altering table", "discard or import tablespace": "altering table", "rename": "altering table", From bbb632e833f87c70a13ae5da179e2af77928a0bb Mon Sep 17 00:00:00 2001 From: Alex Kapustin Date: Fri, 11 Dec 2020 23:36:37 +1100 Subject: [PATCH 4/9] [#6131] - fixed code style (recommendations from review) --- plugins/inputs/mysql/mysql.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/inputs/mysql/mysql.go b/plugins/inputs/mysql/mysql.go index 9239ca2f17718..9efe3560f6e35 100644 --- a/plugins/inputs/mysql/mysql.go +++ b/plugins/inputs/mysql/mysql.go @@ -116,9 +116,10 @@ var sampleConfig = ` # ## Some queries we may want to run less often (such as SHOW GLOBAL VARIABLES) interval_slow = "30m" - + # ## gather metrics from PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_SUMMARY_BY_ACCOUNT_BY_EVENT_NAME gather_perf_sum_per_acc_per_event = false + # ## list of events to be gathered for gather_perf_sum_per_acc_per_event ## in case of empty list all events will be gathered perf_summary_events = [] @@ -1277,7 +1278,6 @@ func (m *Mysql) gatherInnoDBMetrics(db *sql.DB, serv string, acc telegraf.Accumu // gatherPerfSummaryPerAccountPerEvent can be used to fetch enabled metrics from // performance_schema.events_statements_summary_by_account_by_event_name func (m *Mysql) gatherPerfSummaryPerAccountPerEvent(db *sql.DB, serv string, acc telegraf.Accumulator) error { - sqlQuery := perfSummaryPerAccountPerEvent var rows *sql.Rows From 626746c08f32a1c11a0ec610a470cad876caece3 Mon Sep 17 00:00:00 2001 From: Alex Kapustin Date: Sat, 12 Dec 2020 00:00:16 +1100 Subject: [PATCH 5/9] removed extra spaces --- plugins/inputs/mysql/mysql.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/inputs/mysql/mysql.go b/plugins/inputs/mysql/mysql.go index f384494ecbc4b..eb4b37215c884 100644 --- a/plugins/inputs/mysql/mysql.go +++ b/plugins/inputs/mysql/mysql.go @@ -125,7 +125,7 @@ const sampleConfig = ` ## gather metrics from PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_SUMMARY_BY_ACCOUNT_BY_EVENT_NAME gather_perf_sum_per_acc_per_event = false - + ## list of events to be gathered for gather_perf_sum_per_acc_per_event ## in case of empty list all events will be gathered perf_summary_events From 5fc0b5008f6a1133e9a09ddf151f3537baf2cfb7 Mon Sep 17 00:00:00 2001 From: Alex Kapustin Date: Sat, 12 Dec 2020 00:04:37 +1100 Subject: [PATCH 6/9] fixed default value for perf_summary events --- plugins/inputs/mysql/mysql.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/inputs/mysql/mysql.go b/plugins/inputs/mysql/mysql.go index eb4b37215c884..a7c96488751dd 100644 --- a/plugins/inputs/mysql/mysql.go +++ b/plugins/inputs/mysql/mysql.go @@ -128,7 +128,7 @@ const sampleConfig = ` ## list of events to be gathered for gather_perf_sum_per_acc_per_event ## in case of empty list all events will be gathered - perf_summary_events + perf_summary_events = [] ## Some queries we may want to run less often (such as SHOW GLOBAL VARIABLES) ## example: interval_slow = "30m" From 962c1f3fc6600801aff52a0d0a3046e87cd99ccc Mon Sep 17 00:00:00 2001 From: Alex Kapustin Date: Sat, 12 Dec 2020 00:10:27 +1100 Subject: [PATCH 7/9] added comment with explanation regarding selected filtering events --- plugins/inputs/mysql/mysql.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/inputs/mysql/mysql.go b/plugins/inputs/mysql/mysql.go index a7c96488751dd..4669b165be0b8 100644 --- a/plugins/inputs/mysql/mysql.go +++ b/plugins/inputs/mysql/mysql.go @@ -1349,6 +1349,7 @@ func (m *Mysql) gatherPerfSummaryPerAccountPerEvent(db *sql.DB, serv string, acc ) var events []interface{} + // if we have perf_summary_events set - select only listed events (adding filter criteria for rows) if len(m.PerfSummaryEvents) > 0 { sqlQuery += " WHERE EVENT_NAME IN (" for i, eventName := range m.PerfSummaryEvents { @@ -1362,6 +1363,7 @@ func (m *Mysql) gatherPerfSummaryPerAccountPerEvent(db *sql.DB, serv string, acc rows, err = db.Query(sqlQuery, events...) } else { + // otherwise no filter, hence, select all rows rows, err = db.Query(perfSummaryPerAccountPerEvent) } From 016c166df83b1065d129bf49d2ce676dac290555 Mon Sep 17 00:00:00 2001 From: Alex Kapustin Date: Sat, 12 Dec 2020 07:05:30 +1100 Subject: [PATCH 8/9] commented settings with default falues --- plugins/inputs/mysql/mysql.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/inputs/mysql/mysql.go b/plugins/inputs/mysql/mysql.go index 4669b165be0b8..89bce5c3519c4 100644 --- a/plugins/inputs/mysql/mysql.go +++ b/plugins/inputs/mysql/mysql.go @@ -124,11 +124,11 @@ const sampleConfig = ` # perf_events_statements_time_limit = 86400 ## gather metrics from PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_SUMMARY_BY_ACCOUNT_BY_EVENT_NAME - gather_perf_sum_per_acc_per_event = false + # gather_perf_sum_per_acc_per_event = false ## list of events to be gathered for gather_perf_sum_per_acc_per_event ## in case of empty list all events will be gathered - perf_summary_events = [] + # perf_summary_events = [] ## Some queries we may want to run less often (such as SHOW GLOBAL VARIABLES) ## example: interval_slow = "30m" From f0f12cbb4430bbbd14d6f6a9fcbfba5f4e64e22b Mon Sep 17 00:00:00 2001 From: Oleksandr Date: Sat, 12 Dec 2020 15:22:25 +1100 Subject: [PATCH 9/9] Update plugins/inputs/mysql/README.md keep sample config consistent Co-authored-by: reimda --- plugins/inputs/mysql/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/inputs/mysql/README.md b/plugins/inputs/mysql/README.md index 9da6fafc69097..43a6515b04e2c 100644 --- a/plugins/inputs/mysql/README.md +++ b/plugins/inputs/mysql/README.md @@ -88,14 +88,14 @@ This plugin gathers the statistic data from MySQL server # gather_file_events_stats = false ## gather metrics from PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_SUMMARY_BY_DIGEST - gather_perf_events_statements = false + # gather_perf_events_statements = false # ## gather metrics from PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_SUMMARY_BY_ACCOUNT_BY_EVENT_NAME - gather_perf_sum_per_acc_per_event = false + # gather_perf_sum_per_acc_per_event = false # ## list of events to be gathered for gather_perf_sum_per_acc_per_event ## in case of empty list all events will be gathered - perf_summary_events = [] + # perf_summary_events = [] # # gather_perf_events_statements = false