From c1c0865ae9a5f3cb02fb849609c931e5082e1a43 Mon Sep 17 00:00:00 2001 From: vol Date: Thu, 25 Aug 2022 00:42:07 +0300 Subject: [PATCH 1/2] Add additional clean function for prometheus metric names --- metrics/names.go | 15 ++++++++++++++- metrics/provider_prometheus.go | 10 +++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/metrics/names.go b/metrics/names.go index 918dbf34e..16af9ce34 100644 --- a/metrics/names.go +++ b/metrics/names.go @@ -72,7 +72,8 @@ func Labels(labels, values []string, stringsprefix, fieldsep, recsep string) str // parseNames parses the route metric name template. func parseNames(tmpl string) (*template.Template, error) { funcMap := template.FuncMap{ - "clean": clean, + "clean": clean, + "clean_prom": clean_prom, } t, err := template.New("names").Funcs(funcMap).Parse(tmpl) if err != nil { @@ -127,6 +128,18 @@ func clean(s string) string { return strings.ToLower(s) } +// clean_prom creates safe names for prometheus reporting by replacing +// some characters with underscores. +func clean_prom(s string) string { + if s == "" { + return "_" + } + s = strings.Replace(s, ".", "_", -1) + s = strings.Replace(s, ":", "_", -1) + s = strings.Replace(s, "-", "_", -1) + return strings.ToLower(s) +} + // stubbed out for testing var hostname = os.Hostname diff --git a/metrics/provider_prometheus.go b/metrics/provider_prometheus.go index 1b50bc8cb..08d534c97 100644 --- a/metrics/provider_prometheus.go +++ b/metrics/provider_prometheus.go @@ -12,9 +12,9 @@ type PromProvider struct { } func NewPromProvider(namespace, subsystem string, buckets []float64) Provider { - namespace = clean(namespace) + namespace = clean_prom(namespace) if len(subsystem) > 0 { - subsystem = clean(subsystem) + subsystem = clean_prom(subsystem) } return &PromProvider{ Opts: promclient.Opts{ @@ -27,13 +27,13 @@ func NewPromProvider(namespace, subsystem string, buckets []float64) Provider { func (p *PromProvider) NewCounter(name string, labels ...string) gkm.Counter { copts := promclient.CounterOpts(p.Opts) - copts.Name = clean(name) + copts.Name = clean_prom(name) return prommetrics.NewCounterFrom(copts, labels) } func (p *PromProvider) NewGauge(name string, labels ...string) gkm.Gauge { gopts := promclient.GaugeOpts(p.Opts) - gopts.Name = clean(name) + gopts.Name = clean_prom(name) return prommetrics.NewGaugeFrom(gopts, labels) } @@ -41,7 +41,7 @@ func (p *PromProvider) NewHistogram(name string, labels ...string) gkm.Histogram hopts := promclient.HistogramOpts{ Namespace: p.Opts.Namespace, Subsystem: p.Opts.Subsystem, - Name: clean(name), + Name: clean_prom(name), Help: p.Opts.Help, ConstLabels: p.Opts.ConstLabels, Buckets: p.Buckets, From 82e27754e07846c9d240b8097bb0c027267eb5cb Mon Sep 17 00:00:00 2001 From: vol Date: Thu, 25 Aug 2022 00:48:29 +0300 Subject: [PATCH 2/2] Apply clean_prom to metric names only --- metrics/provider_prometheus.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/metrics/provider_prometheus.go b/metrics/provider_prometheus.go index 08d534c97..36026fb9e 100644 --- a/metrics/provider_prometheus.go +++ b/metrics/provider_prometheus.go @@ -12,9 +12,9 @@ type PromProvider struct { } func NewPromProvider(namespace, subsystem string, buckets []float64) Provider { - namespace = clean_prom(namespace) + namespace = clean(namespace) if len(subsystem) > 0 { - subsystem = clean_prom(subsystem) + subsystem = clean(subsystem) } return &PromProvider{ Opts: promclient.Opts{