From 9b2f6499e7b0c41aa97ed5d2f137e14e644b243a Mon Sep 17 00:00:00 2001 From: Pierre Fersing Date: Fri, 13 Jan 2017 15:28:56 +0100 Subject: [PATCH] Added more InnoDB metric to MySQL plugin (#2179) --- plugins/inputs/mysql/README.md | 5 ++++ plugins/inputs/mysql/mysql.go | 55 ++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/plugins/inputs/mysql/README.md b/plugins/inputs/mysql/README.md index a55ddb8ff..f941207c9 100644 --- a/plugins/inputs/mysql/README.md +++ b/plugins/inputs/mysql/README.md @@ -9,6 +9,7 @@ This plugin gathers the statistic data from MySQL server * Process list * User Statistics * Info schema auto increment columns +* InnoDB metrics * Table I/O waits * Index I/O waits * Perf Schema table lock waits @@ -51,6 +52,9 @@ This plugin gathers the statistic data from MySQL server ## gather auto_increment columns and max values from information schema gather_info_schema_auto_inc = true # + ## gather metrics from INFORMATION_SCHEMA.INNODB_METRICS + gather_innodb_metrics = true + # ## gather metrics from SHOW SLAVE STATUS command output gather_slave_status = true # @@ -141,6 +145,7 @@ and process. It has following fields: for them. It has following fields: * auto_increment_column(int, number) * auto_increment_column_max(int, number) +* InnoDB metrics - all metrics of information_schema.INNODB_METRICS with a status "enabled" * Perf table lock waits - gathers total number and time for SQL and external lock waits events for each table and operation. It has following fields. The unit of fields varies by the tags. diff --git a/plugins/inputs/mysql/mysql.go b/plugins/inputs/mysql/mysql.go index ca169f0d4..956b3f9b0 100644 --- a/plugins/inputs/mysql/mysql.go +++ b/plugins/inputs/mysql/mysql.go @@ -25,6 +25,7 @@ type Mysql struct { GatherProcessList bool `toml:"gather_process_list"` GatherUserStatistics bool `toml:"gather_user_statistics"` GatherInfoSchemaAutoInc bool `toml:"gather_info_schema_auto_inc"` + GatherInnoDBMetrics bool `toml:"gather_innodb_metrics"` GatherSlaveStatus bool `toml:"gather_slave_status"` GatherBinaryLogs bool `toml:"gather_binary_logs"` GatherTableIOWaits bool `toml:"gather_table_io_waits"` @@ -67,6 +68,9 @@ var sampleConfig = ` ## gather auto_increment columns and max values from information schema gather_info_schema_auto_inc = true # + ## gather metrics from INFORMATION_SCHEMA.INNODB_METRICS + gather_innodb_metrics = true + # ## gather metrics from SHOW SLAVE STATUS command output gather_slave_status = true # @@ -435,6 +439,11 @@ const ( FROM information_schema.tables t JOIN information_schema.columns c USING (table_schema,table_name) WHERE c.extra = 'auto_increment' AND t.auto_increment IS NOT NULL + ` + innoDBMetricsQuery = ` + SELECT NAME, COUNT + FROM information_schema.INNODB_METRICS + WHERE status='enabled' ` perfTableIOWaitsQuery = ` SELECT OBJECT_SCHEMA, OBJECT_NAME, COUNT_FETCH, COUNT_INSERT, COUNT_UPDATE, COUNT_DELETE, @@ -610,6 +619,13 @@ func (m *Mysql) gatherServer(serv string, acc telegraf.Accumulator) error { } } + if m.GatherInnoDBMetrics { + err = m.gatherInnoDBMetrics(db, serv, acc) + if err != nil { + return err + } + } + if m.GatherTableIOWaits { err = m.gatherPerfTableIOWaits(db, serv, acc) if err != nil { @@ -1244,6 +1260,45 @@ func (m *Mysql) gatherInfoSchemaAutoIncStatuses(db *sql.DB, serv string, acc tel return nil } +// gatherInnoDBMetrics can be used to fetch enabled metrics from +// information_schema.INNODB_METRICS +func (m *Mysql) gatherInnoDBMetrics(db *sql.DB, serv string, acc telegraf.Accumulator) error { + // run query + rows, err := db.Query(innoDBMetricsQuery) + if err != nil { + return err + } + defer rows.Close() + + var key string + var val sql.RawBytes + + // parse DSN and save server tag + servtag := getDSNTag(serv) + tags := map[string]string{"server": servtag} + fields := make(map[string]interface{}) + for rows.Next() { + if err := rows.Scan(&key, &val); err != nil { + return err + } + key = strings.ToLower(key) + // parse value, if it is numeric then save, otherwise ignore + if floatVal, ok := parseValue(val); ok { + fields[key] = floatVal + } + // Send 20 fields at a time + if len(fields) >= 20 { + acc.AddFields("mysql_innodb", fields, tags) + fields = make(map[string]interface{}) + } + } + // Send any remaining fields + if len(fields) > 0 { + acc.AddFields("mysql_innodb", fields, tags) + } + 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