Added more InnoDB metric to MySQL plugin (#2179)

This commit is contained in:
Pierre Fersing 2017-01-13 15:28:56 +01:00 committed by Cameron Sparr
parent 9262712f0a
commit 9b2f6499e7
2 changed files with 60 additions and 0 deletions

View File

@ -9,6 +9,7 @@ This plugin gathers the statistic data from MySQL server
* Process list * Process list
* User Statistics * User Statistics
* Info schema auto increment columns * Info schema auto increment columns
* InnoDB metrics
* Table I/O waits * Table I/O waits
* Index I/O waits * Index I/O waits
* Perf Schema table lock 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 auto_increment columns and max values from information schema
gather_info_schema_auto_inc = true 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 metrics from SHOW SLAVE STATUS command output
gather_slave_status = true gather_slave_status = true
# #
@ -141,6 +145,7 @@ and process. It has following fields:
for them. It has following fields: for them. It has following fields:
* auto_increment_column(int, number) * auto_increment_column(int, number)
* auto_increment_column_max(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 * 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. lock waits events for each table and operation. It has following fields.
The unit of fields varies by the tags. The unit of fields varies by the tags.

View File

@ -25,6 +25,7 @@ type Mysql struct {
GatherProcessList bool `toml:"gather_process_list"` GatherProcessList bool `toml:"gather_process_list"`
GatherUserStatistics bool `toml:"gather_user_statistics"` GatherUserStatistics bool `toml:"gather_user_statistics"`
GatherInfoSchemaAutoInc bool `toml:"gather_info_schema_auto_inc"` GatherInfoSchemaAutoInc bool `toml:"gather_info_schema_auto_inc"`
GatherInnoDBMetrics bool `toml:"gather_innodb_metrics"`
GatherSlaveStatus bool `toml:"gather_slave_status"` GatherSlaveStatus bool `toml:"gather_slave_status"`
GatherBinaryLogs bool `toml:"gather_binary_logs"` GatherBinaryLogs bool `toml:"gather_binary_logs"`
GatherTableIOWaits bool `toml:"gather_table_io_waits"` GatherTableIOWaits bool `toml:"gather_table_io_waits"`
@ -67,6 +68,9 @@ var sampleConfig = `
## gather auto_increment columns and max values from information schema ## gather auto_increment columns and max values from information schema
gather_info_schema_auto_inc = true 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 metrics from SHOW SLAVE STATUS command output
gather_slave_status = true gather_slave_status = true
# #
@ -435,6 +439,11 @@ const (
FROM information_schema.tables t FROM information_schema.tables t
JOIN information_schema.columns c USING (table_schema,table_name) JOIN information_schema.columns c USING (table_schema,table_name)
WHERE c.extra = 'auto_increment' AND t.auto_increment IS NOT NULL 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 = ` perfTableIOWaitsQuery = `
SELECT OBJECT_SCHEMA, OBJECT_NAME, COUNT_FETCH, COUNT_INSERT, COUNT_UPDATE, COUNT_DELETE, 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 { if m.GatherTableIOWaits {
err = m.gatherPerfTableIOWaits(db, serv, acc) err = m.gatherPerfTableIOWaits(db, serv, acc)
if err != nil { if err != nil {
@ -1244,6 +1260,45 @@ func (m *Mysql) gatherInfoSchemaAutoIncStatuses(db *sql.DB, serv string, acc tel
return nil 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 // gatherPerfTableLockWaits can be used to get
// the total number and time for SQL and external lock wait events // the total number and time for SQL and external lock wait events
// for each table and operation // for each table and operation