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

Fix prefix removal in perf_schema_file_instances (#257)

Splitting on path is unsafe if two tables have the same name, but are in
different databases.  Use a single string prefix to remove the noisy
path data from the labels.
This commit is contained in:
Ben Kochie
2018-01-10 11:14:19 +01:00
committed by GitHub
parent c52f281c26
commit da3c16fa8c
2 changed files with 18 additions and 17 deletions

View File

@ -4,12 +4,10 @@ package collector
import ( import (
"database/sql" "database/sql"
"strings"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"gopkg.in/alecthomas/kingpin.v2" "gopkg.in/alecthomas/kingpin.v2"
"path"
"path/filepath"
) )
const perfFileInstancesQuery = ` const perfFileInstancesQuery = `
@ -31,7 +29,7 @@ var (
performanceSchemaFileInstancesRemovePrefix = kingpin.Flag( performanceSchemaFileInstancesRemovePrefix = kingpin.Flag(
"collect.perf_schema.file_instances.remove_prefix", "collect.perf_schema.file_instances.remove_prefix",
"Remove path prefix in performance_schema.file_summary_by_instance", "Remove path prefix in performance_schema.file_summary_by_instance",
).Default("false").Bool() ).Default("/var/lib/mysql/").String()
performanceSchemaFileInstancesBytesDesc = prometheus.NewDesc( performanceSchemaFileInstancesBytesDesc = prometheus.NewDesc(
prometheus.BuildFQName(namespace, performanceSchema, "file_instances_bytes"), prometheus.BuildFQName(namespace, performanceSchema, "file_instances_bytes"),
@ -69,9 +67,7 @@ func ScrapePerfFileInstances(db *sql.DB, ch chan<- prometheus.Metric) error {
return err return err
} }
if *performanceSchemaFileInstancesRemovePrefix { fileName = strings.TrimPrefix(fileName, *performanceSchemaFileInstancesRemovePrefix)
fileName = path.Base(filepath.ToSlash(fileName))
}
ch <- prometheus.MustNewConstMetric( ch <- prometheus.MustNewConstMetric(
performanceSchemaFileInstancesCountDesc, prometheus.CounterValue, float64(countRead), performanceSchemaFileInstancesCountDesc, prometheus.CounterValue, float64(countRead),
fileName, eventName, "read", fileName, eventName, "read",

View File

@ -26,8 +26,9 @@ func TestScrapePerfFileInstances(t *testing.T) {
columns := []string{"FILE_NAME", "EVENT_NAME", "COUNT_READ", "COUNT_WRITE", "SUM_NUMBER_OF_BYTES_READ", "SUM_NUMBER_OF_BYTES_WRITE"} columns := []string{"FILE_NAME", "EVENT_NAME", "COUNT_READ", "COUNT_WRITE", "SUM_NUMBER_OF_BYTES_READ", "SUM_NUMBER_OF_BYTES_WRITE"}
rows := sqlmock.NewRows(columns). rows := sqlmock.NewRows(columns).
AddRow("file_1", "event1", "3", "4", "725", "128"). AddRow("/var/lib/mysql/db1/file", "event1", "3", "4", "725", "128").
AddRow("file_2", "event2", "23", "12", "3123", "967") AddRow("/var/lib/mysql/db2/file", "event2", "23", "12", "3123", "967").
AddRow("db3/file", "event3", "45", "32", "1337", "326")
mock.ExpectQuery(sanitizeQuery(perfFileInstancesQuery)).WillReturnRows(rows) mock.ExpectQuery(sanitizeQuery(perfFileInstancesQuery)).WillReturnRows(rows)
ch := make(chan prometheus.Metric) ch := make(chan prometheus.Metric)
@ -39,14 +40,18 @@ func TestScrapePerfFileInstances(t *testing.T) {
}() }()
metricExpected := []MetricResult{ metricExpected := []MetricResult{
{labels: labelMap{"file_name": "file_1", "event_name": "event1", "mode": "read"}, value: 3, metricType: dto.MetricType_COUNTER}, {labels: labelMap{"file_name": "db1/file", "event_name": "event1", "mode": "read"}, value: 3, metricType: dto.MetricType_COUNTER},
{labels: labelMap{"file_name": "file_1", "event_name": "event1", "mode": "write"}, value: 4, metricType: dto.MetricType_COUNTER}, {labels: labelMap{"file_name": "db1/file", "event_name": "event1", "mode": "write"}, value: 4, metricType: dto.MetricType_COUNTER},
{labels: labelMap{"file_name": "file_1", "event_name": "event1", "mode": "read"}, value: 725, metricType: dto.MetricType_COUNTER}, {labels: labelMap{"file_name": "db1/file", "event_name": "event1", "mode": "read"}, value: 725, metricType: dto.MetricType_COUNTER},
{labels: labelMap{"file_name": "file_1", "event_name": "event1", "mode": "write"}, value: 128, metricType: dto.MetricType_COUNTER}, {labels: labelMap{"file_name": "db1/file", "event_name": "event1", "mode": "write"}, value: 128, metricType: dto.MetricType_COUNTER},
{labels: labelMap{"file_name": "file_2", "event_name": "event2", "mode": "read"}, value: 23, metricType: dto.MetricType_COUNTER}, {labels: labelMap{"file_name": "db2/file", "event_name": "event2", "mode": "read"}, value: 23, metricType: dto.MetricType_COUNTER},
{labels: labelMap{"file_name": "file_2", "event_name": "event2", "mode": "write"}, value: 12, metricType: dto.MetricType_COUNTER}, {labels: labelMap{"file_name": "db2/file", "event_name": "event2", "mode": "write"}, value: 12, metricType: dto.MetricType_COUNTER},
{labels: labelMap{"file_name": "file_2", "event_name": "event2", "mode": "read"}, value: 3123, metricType: dto.MetricType_COUNTER}, {labels: labelMap{"file_name": "db2/file", "event_name": "event2", "mode": "read"}, value: 3123, metricType: dto.MetricType_COUNTER},
{labels: labelMap{"file_name": "file_2", "event_name": "event2", "mode": "write"}, value: 967, metricType: dto.MetricType_COUNTER}, {labels: labelMap{"file_name": "db2/file", "event_name": "event2", "mode": "write"}, value: 967, metricType: dto.MetricType_COUNTER},
{labels: labelMap{"file_name": "db3/file", "event_name": "event3", "mode": "read"}, value: 45, metricType: dto.MetricType_COUNTER},
{labels: labelMap{"file_name": "db3/file", "event_name": "event3", "mode": "write"}, value: 32, metricType: dto.MetricType_COUNTER},
{labels: labelMap{"file_name": "db3/file", "event_name": "event3", "mode": "read"}, value: 1337, metricType: dto.MetricType_COUNTER},
{labels: labelMap{"file_name": "db3/file", "event_name": "event3", "mode": "write"}, value: 326, metricType: dto.MetricType_COUNTER},
} }
convey.Convey("Metrics comparison", t, func() { convey.Convey("Metrics comparison", t, func() {
for _, expect := range metricExpected { for _, expect := range metricExpected {