From da3c16fa8c08b17a0828aaa244920e2d7b739c5b Mon Sep 17 00:00:00 2001 From: Ben Kochie Date: Wed, 10 Jan 2018 11:14:19 +0100 Subject: [PATCH] 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. --- collector/perf_schema_file_instances.go | 10 +++----- collector/perf_schema_file_instances_test.go | 25 ++++++++++++-------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/collector/perf_schema_file_instances.go b/collector/perf_schema_file_instances.go index 6f6314d..aae3945 100644 --- a/collector/perf_schema_file_instances.go +++ b/collector/perf_schema_file_instances.go @@ -4,12 +4,10 @@ package collector import ( "database/sql" + "strings" "github.com/prometheus/client_golang/prometheus" "gopkg.in/alecthomas/kingpin.v2" - - "path" - "path/filepath" ) const perfFileInstancesQuery = ` @@ -31,7 +29,7 @@ var ( performanceSchemaFileInstancesRemovePrefix = kingpin.Flag( "collect.perf_schema.file_instances.remove_prefix", "Remove path prefix in performance_schema.file_summary_by_instance", - ).Default("false").Bool() + ).Default("/var/lib/mysql/").String() performanceSchemaFileInstancesBytesDesc = prometheus.NewDesc( prometheus.BuildFQName(namespace, performanceSchema, "file_instances_bytes"), @@ -69,9 +67,7 @@ func ScrapePerfFileInstances(db *sql.DB, ch chan<- prometheus.Metric) error { return err } - if *performanceSchemaFileInstancesRemovePrefix { - fileName = path.Base(filepath.ToSlash(fileName)) - } + fileName = strings.TrimPrefix(fileName, *performanceSchemaFileInstancesRemovePrefix) ch <- prometheus.MustNewConstMetric( performanceSchemaFileInstancesCountDesc, prometheus.CounterValue, float64(countRead), fileName, eventName, "read", diff --git a/collector/perf_schema_file_instances_test.go b/collector/perf_schema_file_instances_test.go index 34320ed..9b14c95 100644 --- a/collector/perf_schema_file_instances_test.go +++ b/collector/perf_schema_file_instances_test.go @@ -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"} rows := sqlmock.NewRows(columns). - AddRow("file_1", "event1", "3", "4", "725", "128"). - AddRow("file_2", "event2", "23", "12", "3123", "967") + AddRow("/var/lib/mysql/db1/file", "event1", "3", "4", "725", "128"). + 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) ch := make(chan prometheus.Metric) @@ -39,14 +40,18 @@ func TestScrapePerfFileInstances(t *testing.T) { }() metricExpected := []MetricResult{ - {labels: labelMap{"file_name": "file_1", "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": "file_1", "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": "file_2", "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": "file_2", "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": "db1/file", "event_name": "event1", "mode": "read"}, value: 3, 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": "db1/file", "event_name": "event1", "mode": "read"}, value: 725, 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": "db2/file", "event_name": "event2", "mode": "read"}, value: 23, 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": "db2/file", "event_name": "event2", "mode": "read"}, value: 3123, 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() { for _, expect := range metricExpected {