From 95d8cf04d8ff731a5c71a97006925fbab560941e Mon Sep 17 00:00:00 2001 From: harpunius Date: Tue, 8 Oct 2024 15:06:14 +0200 Subject: [PATCH] fix(prometheus_sink): log errors and fallback to default metric mapper Signed-off-by: harpunius --- src/stats/prom/prometheus_sink.go | 22 ++++++++++++++++++---- src/stats/prom/prometheus_sink_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/stats/prom/prometheus_sink.go b/src/stats/prom/prometheus_sink.go index 58b27ece..b0fbb328 100644 --- a/src/stats/prom/prometheus_sink.go +++ b/src/stats/prom/prometheus_sink.go @@ -116,10 +116,24 @@ func NewPrometheusSink(opts ...prometheusSinkOption) gostats.Sink { logrus.Infof("Starting prometheus sink on %s%s", sink.config.addr, sink.config.path) _ = http.ListenAndServe(sink.config.addr, nil) }() - if sink.config.mapperYamlPath != "" { - _ = sink.mapper.InitFromFile(sink.config.mapperYamlPath) - } else { - _ = sink.mapper.InitFromYAMLString(defaultMapper) + + useDefaultMapper := sink.config.mapperYamlPath == "" + if !useDefaultMapper { + err := sink.mapper.InitFromFile(sink.config.mapperYamlPath) + if err != nil { + logrus.Errorf("Failed parsing metric mapper from path %s", sink.config.mapperYamlPath) + + // Fallback to using the default mapper + useDefaultMapper = true + } + } + + if useDefaultMapper { + logrus.Infof("Using default metric mapper") + err := sink.mapper.InitFromYAMLString(defaultMapper) + if err != nil { + logrus.Error("Failed parsing default metric mapper") + } } sink.exp = exporter.NewExporter(promRegistry, diff --git a/src/stats/prom/prometheus_sink_test.go b/src/stats/prom/prometheus_sink_test.go index cc4b8900..9786cc20 100644 --- a/src/stats/prom/prometheus_sink_test.go +++ b/src/stats/prom/prometheus_sink_test.go @@ -109,3 +109,28 @@ func TestFlushTimer(t *testing.T) { return true }, time.Second, time.Millisecond) } + +func TestPrometheusSinkMetricMapperDefaultHandling(t *testing.T) { + // Pass a metric mapper that doesn't exist + s := NewPrometheusSink(WithMapperYamlPath("file_not_found.yaml"), WithPath("/otherMetrics")) + + s.FlushTimer("ratelimit.service.rate_limit.rds.database_users.within_limit", 1) + assert.Eventually(t, func() bool { + metricFamilies, err := prometheus.DefaultGatherer.Gather() + require.NoError(t, err) + + metrics := make(map[string]*dto.MetricFamily) + for _, metricFamily := range metricFamilies { + metrics[*metricFamily.Name] = metricFamily + } + + m, ok := metrics["ratelimit_service_rate_limit_within_limit"] + require.True(t, ok) + require.Len(t, m.Metric, 1) + require.Equal(t, map[string]string{ + "domain": "rds", + "key1": "database_users", + }, toMap(m.Metric[0].Label)) + return true + }, time.Second, time.Millisecond) +}