1
0
mirror of https://github.com/prometheus/mysqld_exporter.git synced 2025-07-30 06:43:05 +03:00

fix collect.info_schema.innodb_tablespaces for mariadb 10.3+ and mysql 8.0+

Signed-off-by: Mike <maemigh@Mikes-MacBook-Pro.local>
This commit is contained in:
Mike
2020-11-17 14:42:17 +09:00
parent 44a83018fb
commit ae3f2e13ed

View File

@ -18,22 +18,34 @@ package collector
import (
"context"
"database/sql"
"errors"
"fmt"
"github.com/go-kit/kit/log"
"github.com/prometheus/client_golang/prometheus"
)
const innodbTablespacesTablenameQuery = `
SELECT
table_name
FROM information_schema.tables
WHERE table_name = 'INNODB_SYS_TABLESPACES'
OR table_name = 'INNODB_TABLESPACES'
`
const innodbTablespacesQuery = `
SELECT
SPACE,
NAME,
ifnull(FILE_FORMAT, 'NONE') as FILE_FORMAT,
ifnull((SELECT column_name
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'information_schema'
AND TABLE_NAME = ` + "'%s'" + `
AND COLUMN_NAME = 'FILE_FORMAT' LIMIT 1), 'NONE') as FILE_FORMAT,
ifnull(ROW_FORMAT, 'NONE') as ROW_FORMAT,
ifnull(SPACE_TYPE, 'NONE') as SPACE_TYPE,
FILE_SIZE,
ALLOCATED_SIZE
FROM information_schema.innodb_sys_tablespaces
`
FROM information_schema.` + "`%s`"
// Metric descriptors.
var (
@ -74,7 +86,21 @@ func (ScrapeInfoSchemaInnodbTablespaces) Version() float64 {
// Scrape collects data from database connection and sends it over channel as prometheus metric.
func (ScrapeInfoSchemaInnodbTablespaces) Scrape(ctx context.Context, db *sql.DB, ch chan<- prometheus.Metric, logger log.Logger) error {
tablespacesRows, err := db.QueryContext(ctx, innodbTablespacesQuery)
var tablespacesTablename string
var query string
err := db.QueryRowContext(ctx, innodbTablespacesTablenameQuery).Scan(&tablespacesTablename)
if err != nil {
return err
}
switch tablespacesTablename {
case "INNODB_SYS_TABLESPACES", "INNODB_TABLESPACES":
query = fmt.Sprintf(innodbTablespacesQuery, tablespacesTablename, tablespacesTablename)
default:
return errors.New("Couldn't find INNODB_SYS_TABLESPACES or INNODB_TABLESPACES in information_schema.")
}
tablespacesRows, err := db.QueryContext(ctx, query)
if err != nil {
return err
}