Browse Source

tsweb/varz: use default metrics.LabelMap.Label on serialization

To not break Prometheus if the label is unset.

Updates tailscale/corp#12830

Signed-off-by: Brad Fitzpatrick <[email protected]>
Brad Fitzpatrick 2 years ago
parent
commit
79ee6d6e1e
2 changed files with 11 additions and 1 deletions
  1. 1 1
      tsweb/varz/varz.go
  2. 10 0
      tsweb/varz/varz_test.go

+ 1 - 1
tsweb/varz/varz.go

@@ -189,7 +189,7 @@ func writePromExpVar(w io.Writer, prefix string, kv expvar.KeyValue) {
 		// IntMap uses expvar.Map on the inside, which presorts
 		// keys. The output ordering is deterministic.
 		v.Do(func(kv expvar.KeyValue) {
-			fmt.Fprintf(w, "%s{%s=%q} %v\n", name, v.Label, kv.Key, kv.Value)
+			fmt.Fprintf(w, "%s{%s=%q} %v\n", name, cmpx.Or(v.Label, "label"), kv.Key, kv.Value)
 		})
 	case *expvar.Map:
 		if label != "" && typ != "" {

+ 10 - 0
tsweb/varz/varz_test.go

@@ -165,6 +165,16 @@ func TestVarzHandler(t *testing.T) {
 			})(),
 			"control_save_config{reason=\"fun\"} 1\ncontrol_save_config{reason=\"new\"} 1\ncontrol_save_config{reason=\"updated\"} 1\n",
 		},
+		{
+			"metrics_label_map_unlabeled",
+			"foo",
+			(func() *metrics.LabelMap {
+				m := &metrics.LabelMap{Label: ""}
+				m.Add("a", 1)
+				return m
+			})(),
+			"foo{label=\"a\"} 1\n",
+		},
 		{
 			"expvar_label_map",
 			"counter_labelmap_keyname_m",