Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[receiver/mysql]: add scraping io_waits metrics #14328

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 79 additions & 0 deletions receiver/mysqlreceiver/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ type client interface {
Connect() error
getGlobalStats() (map[string]string, error)
getInnodbStats() (map[string]string, error)
getTableIoWaitsStats() ([]TableIoWaitsStats, error)
getIndexIoWaitsStats() ([]IndexIoWaitsStats, error)
Close() error
}

Expand All @@ -34,6 +36,28 @@ type mySQLClient struct {
client *sql.DB
}

type IoWaitsStats struct {
schema string
name string
countDelete int64
countFetch int64
countInsert int64
countUpdate int64
timeDelete int64
timeFetch int64
timeInsert int64
timeUpdate int64
}

type TableIoWaitsStats struct {
IoWaitsStats
}

type IndexIoWaitsStats struct {
IoWaitsStats
index string
}

var _ client = (*mySQLClient)(nil)

func newMySQLClient(conf *Config) client {
Expand Down Expand Up @@ -73,6 +97,61 @@ func (c *mySQLClient) getInnodbStats() (map[string]string, error) {
return Query(*c, query)
}

// getTableIoWaitsStats queries the db for table_io_waits metrics.
func (c *mySQLClient) getTableIoWaitsStats() ([]TableIoWaitsStats, error) {
query := "SELECT OBJECT_SCHEMA, OBJECT_NAME, " +
"COUNT_DELETE, COUNT_FETCH, COUNT_INSERT, COUNT_UPDATE," +
"SUM_TIMER_DELETE, SUM_TIMER_FETCH, SUM_TIMER_INSERT, SUM_TIMER_UPDATE" +
"FROM performance_schema.table_io_waits_summary_by_table" +
"WHERE OBJECT_SCHEMA NOT IN ('mysql', 'performance_schema');"
rows, err := c.client.Query(query)
if err != nil {
return nil, err
}
defer rows.Close()
var stats []TableIoWaitsStats
for rows.Next() {
var s TableIoWaitsStats
err := rows.Scan(&s.schema, &s.name,
&s.countDelete, &s.countFetch, &s.countInsert, &s.countUpdate,
&s.timeDelete, &s.timeFetch, &s.timeInsert, &s.timeUpdate)
if err != nil {
return nil, err
}
stats = append(stats, s)
}

return stats, nil
}

// getIndexIoWaitsStats queries the db for index_io_waits metrics.
func (c *mySQLClient) getIndexIoWaitsStats() ([]IndexIoWaitsStats, error) {
query := "SELECT OBJECT_SCHEMA, OBJECT_NAME, ifnull(INDEX_NAME, 'NONE') as INDEX_NAME," +
"COUNT_FETCH, COUNT_INSERT, COUNT_UPDATE, COUNT_DELETE," +
"SUM_TIMER_FETCH, SUM_TIMER_INSERT, SUM_TIMER_UPDATE, SUM_TIMER_DELETE" +
"FROM performance_schema.table_io_waits_summary_by_index_usage" +
"WHERE OBJECT_SCHEMA NOT IN ('mysql', 'performance_schema');"

rows, err := c.client.Query(query)
if err != nil {
return nil, err
}
defer rows.Close()
var stats []IndexIoWaitsStats
for rows.Next() {
var s IndexIoWaitsStats
err := rows.Scan(&s.schema, &s.name, &s.index,
&s.countDelete, &s.countFetch, &s.countInsert, &s.countUpdate,
&s.timeDelete, &s.timeFetch, &s.timeInsert, &s.timeUpdate)
if err != nil {
return nil, err
}
stats = append(stats, s)
}

return stats, nil
}

func Query(c mySQLClient, query string) (map[string]string, error) {
rows, err := c.client.Query(query)
if err != nil {
Expand Down
8 changes: 8 additions & 0 deletions receiver/mysqlreceiver/documentation.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,17 @@ These are the metrics available for this scraper.
| **mysql.commands** | The number of times each type of command has been executed. | 1 | Sum(Int) | <ul> <li>command</li> </ul> |
| **mysql.double_writes** | The number of writes to the InnoDB doublewrite buffer. | 1 | Sum(Int) | <ul> <li>double_writes</li> </ul> |
| **mysql.handlers** | The number of requests to various MySQL handlers. | 1 | Sum(Int) | <ul> <li>handler</li> </ul> |
| **mysql.index.io.wait.count** | The total count of I/O wait events for an index. | 1 | Sum(Int) | <ul> <li>io_waits_operations</li> <li>table_name</li> <li>schema</li> <li>index_name</li> </ul> |
| **mysql.index.io.wait.time** | The total time of I/O wait events for an index. | ns | Sum(Int) | <ul> <li>io_waits_operations</li> <li>table_name</li> <li>schema</li> <li>index_name</li> </ul> |
| **mysql.locks** | The number of MySQL locks. | 1 | Sum(Int) | <ul> <li>locks</li> </ul> |
| **mysql.log_operations** | The number of InnoDB log operations. | 1 | Sum(Int) | <ul> <li>log_operations</li> </ul> |
| **mysql.operations** | The number of InnoDB operations. | 1 | Sum(Int) | <ul> <li>operations</li> </ul> |
| **mysql.page_operations** | The number of InnoDB page operations. | 1 | Sum(Int) | <ul> <li>page_operations</li> </ul> |
| **mysql.row_locks** | The number of InnoDB row locks. | 1 | Sum(Int) | <ul> <li>row_locks</li> </ul> |
| **mysql.row_operations** | The number of InnoDB row operations. | 1 | Sum(Int) | <ul> <li>row_operations</li> </ul> |
| **mysql.sorts** | The number of MySQL sorts. | 1 | Sum(Int) | <ul> <li>sorts</li> </ul> |
| **mysql.table.io.wait.count** | The total count of I/O wait events for a table. | 1 | Sum(Int) | <ul> <li>io_waits_operations</li> <li>table_name</li> <li>schema</li> </ul> |
| **mysql.table.io.wait.time** | The total time of I/O wait events for a table. | ns | Sum(Int) | <ul> <li>io_waits_operations</li> <li>table_name</li> <li>schema</li> </ul> |
| **mysql.threads** | The state of MySQL threads. | 1 | Sum(Int) | <ul> <li>threads</li> </ul> |

**Highlighted metrics** are emitted by default. Other metrics are optional and not emitted by default.
Expand Down Expand Up @@ -51,11 +55,15 @@ metrics:
| command (command) | The command types. | execute, close, fetch, prepare, reset, send_long_data |
| double_writes (kind) | The doublewrite types. | pages_written, writes |
| handler (kind) | The handler types. | commit, delete, discover, external_lock, mrr_init, prepare, read_first, read_key, read_last, read_next, read_prev, read_rnd, read_rnd_next, rollback, savepoint, savepoint_rollback, update, write |
| index_name (index) | The name of the index. | |
| io_waits_operations (operation) | The io_waits operation type. | delete, fetch, insert, update |
| locks (kind) | The table locks type. | immediate, waited |
| log_operations (operation) | The log operation types. | waits, write_requests, writes |
| operations (operation) | The operation types. | fsyncs, reads, writes |
| page_operations (operation) | The page operation types. | created, read, written |
| row_locks (kind) | The row lock type. | waits, time |
| row_operations (operation) | The row operation type. | deleted, inserted, read, updated |
| schema (schema) | The schema of the object. | |
| sorts (kind) | The sort count type. | merge_passes, range, rows, scan |
| table_name (table) | Table name for event or process. | |
| threads (kind) | The thread count type. | cached, connected, created, running |
Loading