metrics: revert changes to MultiLabelMap's String method

This breaks its ability to be used as an expvar and is blocking a trunkd
deploy. Revert for now, and add a test to ensure that we don't break it
in a future change.

Updates #13550

Signed-off-by: Andrew Dunham <andrew@du.nham.ca>
Change-Id: I1f1221c257c1de47b4bff0597c12f8530736116d
bradfitz/quic_dns
Andrew Dunham 2 months ago
parent 65c26357b1
commit 717d589149

@ -97,12 +97,8 @@ type KeyValue[T comparable] struct {
}
func (v *MultiLabelMap[T]) String() string {
var sb strings.Builder
sb.WriteString("MultiLabelMap:\n")
v.Do(func(kv KeyValue[T]) {
fmt.Fprintf(&sb, "\t%v: %v\n", kv.Key, kv.Value)
})
return sb.String()
// NOTE: This has to be valid JSON because it's used by expvar.
return `"MultiLabelMap"`
}
// WritePrometheus writes v to w in Prometheus exposition format.

@ -5,6 +5,7 @@ package metrics
import (
"bytes"
"encoding/json"
"expvar"
"fmt"
"io"
@ -129,3 +130,21 @@ func BenchmarkMultiLabelWriteAllocs(b *testing.B) {
m.WritePrometheus(w, "test")
}
}
func TestMultiLabelMapExpvar(t *testing.T) {
m := new(MultiLabelMap[L2])
m.Add(L2{"a", "b"}, 2)
m.Add(L2{"b", "c"}, 4)
em := new(expvar.Map)
em.Set("multi", m)
// Ensure that the String method is valid JSON to ensure that it can be
// used by expvar.
encoded := []byte(em.String())
if !json.Valid(encoded) {
t.Fatalf("invalid JSON: %s", encoded)
}
t.Logf("em = %+v", em)
}

Loading…
Cancel
Save