From cc1fcb45afdec8213ef8e02004627f8f3b846cfd Mon Sep 17 00:00:00 2001 From: Pedro Tanaka Date: Sat, 22 Feb 2025 14:05:01 +0100 Subject: [PATCH] Drop Value() method from MultiValueEvent and fixing expansion logic Signed-off-by: Pedro Tanaka --- pkg/event/event.go | 34 ++++++++++++++++++++++++++-------- pkg/event/event_test.go | 32 +++++++++++++++++++++++++++----- 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/pkg/event/event.go b/pkg/event/event.go index 4f8a531..66fc40f 100644 --- a/pkg/event/event.go +++ b/pkg/event/event.go @@ -18,6 +18,7 @@ import ( "time" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/statsd_exporter/pkg/clock" "github.com/prometheus/statsd_exporter/pkg/mapper" ) @@ -170,20 +171,21 @@ func (m *MultiObserverEvent) Values() []float64 { return m.OValues } // And keep the exporter code compatible with previous versions. func (m *MultiObserverEvent) Expand() []Event { if len(m.OValues) == 1 && m.SampleRate == 0 { - return []Event{m} + return []Event{ + &ObserverEvent{ + OMetricName: m.OMetricName, + OValue: m.OValues[0], + OLabels: copyLabels(m.OLabels), + }, + } } events := make([]Event, 0, len(m.OValues)) for _, value := range m.OValues { - labels := make(map[string]string, len(m.OLabels)) - for k, v := range m.OLabels { - labels[k] = v - } - events = append(events, &ObserverEvent{ OMetricName: m.OMetricName, OValue: value, - OLabels: labels, + OLabels: copyLabels(m.OLabels), }) } @@ -191,7 +193,14 @@ func (m *MultiObserverEvent) Expand() []Event { multiplier := int(1 / m.SampleRate) multipliedEvents := make([]Event, 0, len(events)*multiplier) for i := 0; i < multiplier; i++ { - multipliedEvents = append(multipliedEvents, events...) + for _, event := range events { + e := event.(*ObserverEvent) + multipliedEvents = append(multipliedEvents, &ObserverEvent{ + OMetricName: e.OMetricName, + OValue: e.OValue, + OLabels: copyLabels(e.OLabels), + }) + } } return multipliedEvents } @@ -199,6 +208,15 @@ func (m *MultiObserverEvent) Expand() []Event { return events } +// Helper function to copy labels map +func copyLabels(labels map[string]string) map[string]string { + newLabels := make(map[string]string, len(labels)) + for k, v := range labels { + newLabels[k] = v + } + return newLabels +} + var ( _ ExpandableEvent = &MultiObserverEvent{} _ MultiValueEvent = &MultiObserverEvent{} diff --git a/pkg/event/event_test.go b/pkg/event/event_test.go index a4e21d5..71cc8ad 100644 --- a/pkg/event/event_test.go +++ b/pkg/event/event_test.go @@ -14,11 +14,13 @@ package event import ( + "fmt" "reflect" "testing" "time" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/statsd_exporter/pkg/clock" "github.com/prometheus/statsd_exporter/pkg/mapper" ) @@ -180,6 +182,7 @@ func TestMultiValueEvent(t *testing.T) { } func TestMultiObserverEvent_Expand(t *testing.T) { + t.Parallel() tests := []struct { name string event *MultiObserverEvent @@ -194,11 +197,10 @@ func TestMultiObserverEvent_Expand(t *testing.T) { SampleRate: 0, }, wantEvents: []Event{ - &MultiObserverEvent{ + &ObserverEvent{ OMetricName: "test_metric", - OValues: []float64{1.0}, + OValue: 1.0, OLabels: map[string]string{"label": "value"}, - SampleRate: 0, }, }, }, @@ -263,9 +265,29 @@ func TestMultiObserverEvent_Expand(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + t.Parallel() got := tt.event.Expand() - if !reflect.DeepEqual(got, tt.wantEvents) { - t.Errorf("MultiObserverEvent.Expand() = %v, want %v", got, tt.wantEvents) + if len(tt.wantEvents) != len(got) { + t.Fatalf("Expected %d events, but got %d", len(tt.wantEvents), len(got)) + } + + eventCount := func(events []Event) map[string]int { + counts := make(map[string]int) + for _, event := range events { + oe := event.(*ObserverEvent) + key := fmt.Sprintf("%s%f%v", oe.OMetricName, oe.OValue, oe.OLabels) + counts[key]++ + } + return counts + } + + wantMap := eventCount(tt.wantEvents) + gotMap := eventCount(got) + + for key, count := range wantMap { + if gotMap[key] != count { + t.Fatalf("Event mismatch for key %v: expected %d, got %d", key, count, gotMap[key]) + } } }) }