Drop Value() method from MultiValueEvent and fixing expansion logic

Signed-off-by: Pedro Tanaka <pedro.stanaka@gmail.com>
This commit is contained in:
Pedro Tanaka 2025-02-22 14:05:01 +01:00
parent a125dac85b
commit cc1fcb45af
No known key found for this signature in database
GPG key ID: D0D1C8BDF850C22A
2 changed files with 53 additions and 13 deletions

View file

@ -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{}

View file

@ -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])
}
}
})
}