mirror of
https://github.com/prometheus/statsd_exporter.git
synced 2025-03-12 19:01:04 +00:00
Drop Value() method from MultiValueEvent and fixing expansion logic
Signed-off-by: Pedro Tanaka <pedro.stanaka@gmail.com>
This commit is contained in:
parent
a125dac85b
commit
cc1fcb45af
2 changed files with 53 additions and 13 deletions
|
@ -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{}
|
||||
|
|
|
@ -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])
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue