From c6740da6244466cfdcbda5c0d43906822d5e8b03 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Thu, 12 Aug 2021 13:35:14 -0700 Subject: [PATCH] tsweb: make VarzHandler support untyped expvar.Maps for compatibility Updates #2635 Signed-off-by: Brad Fitzpatrick --- tsweb/tsweb.go | 10 ++++++---- tsweb/tsweb_test.go | 22 ++++++++++++---------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/tsweb/tsweb.go b/tsweb/tsweb.go index 230928a28..6dfe2047c 100644 --- a/tsweb/tsweb.go +++ b/tsweb/tsweb.go @@ -438,9 +438,9 @@ func writePromExpVar(w io.Writer, prefix string, kv expvar.KeyValue) { default: fmt.Fprintf(w, "# skipping expvar %q (Go type %T%s) with undeclared Prometheus type\n", name, kv.Value, funcRet) return - case *metrics.LabelMap: - // Permit typeless LabelMap for compatibility - // with old expvar-registered + case *metrics.LabelMap, *expvar.Map: + // Permit typeless LabelMap and expvar.Map for + // compatibility with old expvar-registered // metrics.LabelMap. } } @@ -471,7 +471,9 @@ func writePromExpVar(w io.Writer, prefix string, kv expvar.KeyValue) { fmt.Fprintf(w, "%s{%s=%q} %v\n", name, label, kv.Key, kv.Value) }) } else { - fmt.Fprintf(w, "# skipping expvar.Map %q with incomplete metadata: label %q, Prometheus type %q\n", name, label, typ) + v.Do(func(kv expvar.KeyValue) { + fmt.Fprintf(w, "%s_%s %v\n", name, kv.Key, kv.Value) + }) } } } diff --git a/tsweb/tsweb_test.go b/tsweb/tsweb_test.go index 034c7869c..278725318 100644 --- a/tsweb/tsweb_test.go +++ b/tsweb/tsweb_test.go @@ -363,6 +363,18 @@ func TestVarzHandler(t *testing.T) { }, "# TYPE s_bar counter\ns_bar 2\n# TYPE s_foo counter\ns_foo 1\n", }, + { + "expvar_map_untyped", + "api_status_code", + func() *expvar.Map { + m := new(expvar.Map) + m.Init() + m.Add("2xx", 100) + m.Add("5xx", 2) + return m + }(), + "api_status_code_2xx 100\napi_status_code_5xx 2\n", + }, { "func_float64", "counter_x", @@ -420,16 +432,6 @@ func TestVarzHandler(t *testing.T) { }(), "# TYPE m counter\nm{keyname=\"bar\"} 2\nm{keyname=\"foo\"} 1\n", }, - { - "expvar_label_map_malformed", - "counter_labelmap_lackslabel", - func() *expvar.Map { - m := new(expvar.Map) - m.Init() - return m - }(), - "# skipping expvar.Map \"lackslabel\" with incomplete metadata: label \"\", Prometheus type \"counter\"\n", - }, { "struct_reflect", "foo",