diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c058c4..465c1a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ * [FEATURE] Add collector for `performance_schema.memory_summary_global_by_event_name` (PR #515) #75 * [BUGFIX] Fixed output value of wsrep_cluster_status #473 * [BUGFIX] Fix collect.info_schema.innodb_tablespaces for new table names #516 +* [BUGFIX] Fix collect.info_schema.innodb_metrics for new field names (mariadb 10.5+) #494 ### BREAKING CHANGES: diff --git a/collector/info_schema_innodb_metrics.go b/collector/info_schema_innodb_metrics.go index 7f16e84..1c13744 100644 --- a/collector/info_schema_innodb_metrics.go +++ b/collector/info_schema_innodb_metrics.go @@ -18,6 +18,8 @@ package collector import ( "context" "database/sql" + "errors" + "fmt" "regexp" "github.com/go-kit/kit/log" @@ -25,13 +27,20 @@ import ( "github.com/prometheus/client_golang/prometheus" ) +const infoSchemaInnodbMetricsEnabledColumnQuery = ` + SELECT + column_name + FROM information_schema.columns + WHERE table_name = 'INNODB_METRICS' + AND column_name IN ('status', 'enabled') + ` + const infoSchemaInnodbMetricsQuery = ` SELECT name, subsystem, type, comment, count FROM information_schema.innodb_metrics - WHERE status = 'enabled' - ` + WHERE ` + "`%s` = '%s'" // Metrics descriptors. var ( @@ -83,7 +92,24 @@ func (ScrapeInnodbMetrics) Version() float64 { // Scrape collects data from database connection and sends it over channel as prometheus metric. func (ScrapeInnodbMetrics) Scrape(ctx context.Context, db *sql.DB, ch chan<- prometheus.Metric, logger log.Logger) error { - innodbMetricsRows, err := db.QueryContext(ctx, infoSchemaInnodbMetricsQuery) + var enabledColumnName string + var query string + + err := db.QueryRowContext(ctx, infoSchemaInnodbMetricsEnabledColumnQuery).Scan(&enabledColumnName) + if err != nil { + return err + } + + switch enabledColumnName { + case "STATUS": + query = fmt.Sprintf(infoSchemaInnodbMetricsQuery, "status", "enabled") + case "ENABLED": + query = fmt.Sprintf(infoSchemaInnodbMetricsQuery, "enabled", "1") + default: + return errors.New("Couldn't find column STATUS or ENABLED in innodb_metrics table.") + } + + innodbMetricsRows, err := db.QueryContext(ctx, query) if err != nil { return err } diff --git a/collector/info_schema_innodb_metrics_test.go b/collector/info_schema_innodb_metrics_test.go index ffb6daf..c595c1b 100644 --- a/collector/info_schema_innodb_metrics_test.go +++ b/collector/info_schema_innodb_metrics_test.go @@ -15,6 +15,7 @@ package collector import ( "context" + "fmt" "testing" "github.com/DATA-DOG/go-sqlmock" @@ -31,8 +32,13 @@ func TestScrapeInnodbMetrics(t *testing.T) { } defer db.Close() + enabledColumnName := []string{"COLUMN_NAME"} + rows := sqlmock.NewRows(enabledColumnName). + AddRow("STATUS") + mock.ExpectQuery(sanitizeQuery(infoSchemaInnodbMetricsEnabledColumnQuery)).WillReturnRows(rows) + columns := []string{"name", "subsystem", "type", "comment", "count"} - rows := sqlmock.NewRows(columns). + rows = sqlmock.NewRows(columns). AddRow("lock_timeouts", "lock", "counter", "Number of lock timeouts", 0). AddRow("buffer_pool_reads", "buffer", "status_counter", "Number of reads directly from disk (innodb_buffer_pool_reads)", 1). AddRow("buffer_pool_size", "server", "value", "Server buffer pool size (all buffer pools) in bytes", 2). @@ -42,7 +48,8 @@ func TestScrapeInnodbMetrics(t *testing.T) { AddRow("buffer_pool_pages_data", "buffer", "gauge", "Number of data buffer pool pages", 6). AddRow("buffer_pool_pages_total", "buffer", "gauge", "Number of total buffer pool pages", 7). AddRow("NOPE", "buffer_page_io", "counter", "An invalid buffer_page_io metric", 999) - mock.ExpectQuery(sanitizeQuery(infoSchemaInnodbMetricsQuery)).WillReturnRows(rows) + query := fmt.Sprintf(infoSchemaInnodbMetricsQuery, "status", "enabled") + mock.ExpectQuery(sanitizeQuery(query)).WillReturnRows(rows) ch := make(chan prometheus.Metric) go func() {