You've already forked mysqld_exporter
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:
@ -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",
|
||||||
|
@ -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 {
|
||||||
|
Reference in New Issue
Block a user