From 304bb99b7884457d4297d66678b0ce7963ad3550 Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Tue, 4 Mar 2025 19:43:40 +0300 Subject: [PATCH] fixup invalid metric names Signed-off-by: Vasiliy Tolstov --- prometheus.go | 20 +++++++++++++++----- prometheus_test.go | 31 ++++++++++++++++++++++++++----- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/prometheus.go b/prometheus.go index b4488f3..af24d7e 100644 --- a/prometheus.go +++ b/prometheus.go @@ -5,6 +5,7 @@ import ( "hash/fnv" "io" "regexp" + "strings" "sync" "time" @@ -60,6 +61,15 @@ func newString(v string) *string { return &nv } +func newName(name string) *string { + idx := strings.Index(name, "{") + if idx <= 0 { + return newString(name) + } + + return newString(name[:idx]) +} + func NewMeter(opts ...meter.Option) *prometheusMeter { return &prometheusMeter{ set: prometheus.NewRegistry(), // prometheus.DefaultRegisterer, @@ -269,7 +279,7 @@ func (m *prometheusMeter) Write(w io.Writer, opts ...meter.Option) error { for name, metrics := range m.counter { mf := &dto.MetricFamily{ - Name: newString(name), + Name: newName(name), Type: dto.MetricType_GAUGE.Enum(), Metric: make([]*dto.Metric, 0, len(metrics.cs)), } @@ -284,7 +294,7 @@ func (m *prometheusMeter) Write(w io.Writer, opts ...meter.Option) error { for name, metrics := range m.gauge { mf := &dto.MetricFamily{ - Name: newString(name), + Name: newName(name), Type: dto.MetricType_GAUGE.Enum(), Metric: make([]*dto.Metric, 0, len(metrics.cs)), } @@ -299,7 +309,7 @@ func (m *prometheusMeter) Write(w io.Writer, opts ...meter.Option) error { for name, metrics := range m.floatCounter { mf := &dto.MetricFamily{ - Name: newString(name), + Name: newName(name), Type: dto.MetricType_GAUGE.Enum(), Metric: make([]*dto.Metric, 0, len(metrics.cs)), } @@ -314,7 +324,7 @@ func (m *prometheusMeter) Write(w io.Writer, opts ...meter.Option) error { for name, metrics := range m.histogram { mf := &dto.MetricFamily{ - Name: newString(name), + Name: newName(name), Type: dto.MetricType_HISTOGRAM.Enum(), Metric: make([]*dto.Metric, 0, len(metrics.cs)), } @@ -329,7 +339,7 @@ func (m *prometheusMeter) Write(w io.Writer, opts ...meter.Option) error { for name, metrics := range m.summary { mf := &dto.MetricFamily{ - Name: newString(name), + Name: newName(name), Type: dto.MetricType_SUMMARY.Enum(), Metric: make([]*dto.Metric, 0, len(metrics.cs)), } diff --git a/prometheus_test.go b/prometheus_test.go index eed62be..08f50c7 100644 --- a/prometheus_test.go +++ b/prometheus_test.go @@ -8,6 +8,32 @@ import ( "go.unistack.org/micro/v3/meter" ) +func TestBuildMetric(t *testing.T) { + m := NewMeter(meter.Labels("service_name", "test", "service_version", "0.0.0.1")) + if err := m.Init(); err != nil { + t.Fatal(err) + } + + name := m.buildMetric("micro_server") + if name != `micro_server{service_name="test",service_version="0.0.0.1"}` { + t.Fatal("invalid name") + } +} + +func TestWithDefaultLabels(t *testing.T) { + m := NewMeter(meter.Labels("service_name", "test", "service_version", "0.0.0.1")) + if err := m.Init(); err != nil { + t.Fatal(err) + } + m.Counter("micro_server", "endpoint", "ep3", "path", "/path3", "status", "success").Inc() + + buf := bytes.NewBuffer(nil) + _ = m.Write(buf, meter.WriteProcessMetrics(false), meter.WriteFDMetrics(false)) + if !bytes.Contains(buf.Bytes(), []byte(`micro_server{service_name="test",service_version="0.0.0.1",endpoint="ep3",path="/path3",status="success"} 1`)) { + t.Fatalf("invalid metrics output: %s", buf.Bytes()) + } +} + func TestStd(t *testing.T) { m := NewMeter(meter.WriteProcessMetrics(true), meter.WriteFDMetrics(true)) if err := m.Init(); err != nil { @@ -46,7 +72,6 @@ func TestMultiple(t *testing.T) { buf := bytes.NewBuffer(nil) _ = m.Write(buf, meter.WriteProcessMetrics(false), meter.WriteFDMetrics(false)) if !bytes.Contains(buf.Bytes(), []byte(`micro_server{endpoint="ep1",path="/path1"} 2`)) { - // t.Fatal("XXXX") t.Fatalf("invalid metrics output: %s", buf.Bytes()) } } @@ -58,16 +83,12 @@ func TestCounterSet(t *testing.T) { m.Counter("forte_accounts_total", "channel_code", "crm").Set(value) - fmt.Println(uint64(float64(value))) - buf := bytes.NewBuffer(nil) _ = m.Write(buf) output := buf.String() - fmt.Println(output) - expectedOutput := fmt.Sprintf(`%s{channel_code="crm"} %d`, "forte_accounts_total", value) if !bytes.Contains(buf.Bytes(), []byte(expectedOutput)) {