diff --git a/metrics/multilabelmap.go b/metrics/multilabelmap.go index 7a44a060a..df2ae5073 100644 --- a/metrics/multilabelmap.go +++ b/metrics/multilabelmap.go @@ -211,6 +211,26 @@ func (v *MultiLabelMap[T]) Set(key T, val expvar.Var) { v.m.Store(key, val) } +// SetInt sets val to the *[expvar.Int] value stored under the given map key, +// creating it if it doesn't exist yet. +// It does nothing if key exists but is of the wrong type. +func (v *MultiLabelMap[T]) SetInt(key T, val int64) { + // Set to Int; ignore otherwise. + if iv, ok := v.getOrFill(key, newInt).(*expvar.Int); ok { + iv.Set(val) + } +} + +// SetFloat sets val to the *[expvar.Float] value stored under the given map key, +// creating it if it doesn't exist yet. +// It does nothing if key exists but is of the wrong type. +func (v *MultiLabelMap[T]) SetFloat(key T, val float64) { + // Set to Float; ignore otherwise. + if iv, ok := v.getOrFill(key, newFloat).(*expvar.Float); ok { + iv.Set(val) + } +} + // Add adds delta to the *[expvar.Int] value stored under the given map key, // creating it if it doesn't exist yet. // It does nothing if key exists but is of the wrong type. diff --git a/metrics/multilabelmap_test.go b/metrics/multilabelmap_test.go index 9a1340a3c..b53e15ec8 100644 --- a/metrics/multilabelmap_test.go +++ b/metrics/multilabelmap_test.go @@ -5,6 +5,7 @@ import ( "bytes" + "expvar" "fmt" "io" "testing" @@ -22,6 +23,12 @@ func TestMultilabelMap(t *testing.T) { m.Add(L2{"b", "b"}, 3) m.Add(L2{"a", "a"}, 1) + m.SetFloat(L2{"sf", "sf"}, 3.5) + m.SetFloat(L2{"sf", "sf"}, 5.5) + m.Set(L2{"sfunc", "sfunc"}, expvar.Func(func() any { return 3 })) + m.SetInt(L2{"si", "si"}, 3) + m.SetInt(L2{"si", "si"}, 5) + cur := func() string { var buf bytes.Buffer m.Do(func(kv KeyValue[L2]) { @@ -33,7 +40,7 @@ func TestMultilabelMap(t *testing.T) { return buf.String() } - if g, w := cur(), "a/a=1,a/b=2,b/b=3,b/c=4"; g != w { + if g, w := cur(), "a/a=1,a/b=2,b/b=3,b/c=4,sf/sf=5.5,sfunc/sfunc=3,si/si=5"; g != w { t.Errorf("got %q; want %q", g, w) } @@ -43,6 +50,9 @@ func TestMultilabelMap(t *testing.T) { metricname{foo="a",bar="b"} 2 metricname{foo="b",bar="b"} 3 metricname{foo="b",bar="c"} 4 +metricname{foo="sf",bar="sf"} 5.5 +metricname{foo="sfunc",bar="sfunc"} 3 +metricname{foo="si",bar="si"} 5 ` if got := buf.String(); got != want { t.Errorf("promtheus output = %q; want %q", got, want) @@ -50,7 +60,7 @@ func TestMultilabelMap(t *testing.T) { m.Delete(L2{"b", "b"}) - if g, w := cur(), "a/a=1,a/b=2,b/c=4"; g != w { + if g, w := cur(), "a/a=1,a/b=2,b/c=4,sf/sf=5.5,sfunc/sfunc=3,si/si=5"; g != w { t.Errorf("got %q; want %q", g, w) }