From fe6c0fa3420089a0e36774401bef31a4dc39ed53 Mon Sep 17 00:00:00 2001 From: neeral Date: Fri, 22 Jun 2018 10:16:17 -0700 Subject: [PATCH] Do not sanitize prefix in Graphite bridge Refer to #418. Signed-off-by: neeral --- prometheus/graphite/bridge.go | 8 +++-- prometheus/graphite/bridge_test.go | 50 ++++++++++++++++++++---------- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/prometheus/graphite/bridge.go b/prometheus/graphite/bridge.go index 1153337..466e229 100644 --- a/prometheus/graphite/bridge.go +++ b/prometheus/graphite/bridge.go @@ -191,8 +191,10 @@ func writeMetrics(w io.Writer, mfs []*dto.MetricFamily, prefix string, now model buf := bufio.NewWriter(w) for _, s := range vec { - if err := writeSanitized(buf, prefix); err != nil { - return err + for _, c := range prefix { + if _, err := buf.WriteRune(c); err != nil { + return err + } } if err := buf.WriteByte('.'); err != nil { return err @@ -273,7 +275,7 @@ func replaceInvalidRune(c rune) rune { if c == ' ' { return '.' } - if !((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_' || c == ':' || (c >= '0' && c <= '9')) { + if !((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_' || c == ':' || c == '-' || (c >= '0' && c <= '9')) { return '_' } return c diff --git a/prometheus/graphite/bridge_test.go b/prometheus/graphite/bridge_test.go index c2b274c..d5409c1 100644 --- a/prometheus/graphite/bridge_test.go +++ b/prometheus/graphite/bridge_test.go @@ -3,6 +3,7 @@ package graphite import ( "bufio" "bytes" + "fmt" "io" "log" "net" @@ -25,6 +26,7 @@ func TestSanitize(t *testing.T) { {in: "hE/l1o", out: "hE_l1o"}, {in: "he,*ll(.o", out: "he_ll_o"}, {in: "hello_there%^&", out: "hello_there_"}, + {in: "hell-.o", out: "hell-_o"}, } var buf bytes.Buffer @@ -72,27 +74,41 @@ func TestWriteSummary(t *testing.T) { t.Fatalf("error: %v", err) } - now := model.Time(1477043083) - var buf bytes.Buffer - err = writeMetrics(&buf, mfs, "prefix", now) - if err != nil { - t.Fatalf("error: %v", err) + testCases := []struct { + prefix string + }{ + {prefix: "prefix"}, + {prefix: "pre/fix"}, + {prefix: "pre.fix"}, } - want := `prefix.name.constname.constvalue.labelname.val1.quantile.0_5 20 1477043 -prefix.name.constname.constvalue.labelname.val1.quantile.0_9 30 1477043 -prefix.name.constname.constvalue.labelname.val1.quantile.0_99 30 1477043 -prefix.name_sum.constname.constvalue.labelname.val1 60 1477043 -prefix.name_count.constname.constvalue.labelname.val1 3 1477043 -prefix.name.constname.constvalue.labelname.val2.quantile.0_5 30 1477043 -prefix.name.constname.constvalue.labelname.val2.quantile.0_9 40 1477043 -prefix.name.constname.constvalue.labelname.val2.quantile.0_99 40 1477043 -prefix.name_sum.constname.constvalue.labelname.val2 90 1477043 -prefix.name_count.constname.constvalue.labelname.val2 3 1477043 + const want = `%s.name.constname.constvalue.labelname.val1.quantile.0_5 20 1477043 +%s.name.constname.constvalue.labelname.val1.quantile.0_9 30 1477043 +%s.name.constname.constvalue.labelname.val1.quantile.0_99 30 1477043 +%s.name_sum.constname.constvalue.labelname.val1 60 1477043 +%s.name_count.constname.constvalue.labelname.val1 3 1477043 +%s.name.constname.constvalue.labelname.val2.quantile.0_5 30 1477043 +%s.name.constname.constvalue.labelname.val2.quantile.0_9 40 1477043 +%s.name.constname.constvalue.labelname.val2.quantile.0_99 40 1477043 +%s.name_sum.constname.constvalue.labelname.val2 90 1477043 +%s.name_count.constname.constvalue.labelname.val2 3 1477043 ` + for i, tc := range testCases { - if got := buf.String(); want != got { - t.Fatalf("wanted \n%s\n, got \n%s\n", want, got) + now := model.Time(1477043083) + var buf bytes.Buffer + err = writeMetrics(&buf, mfs, tc.prefix, now) + if err != nil { + t.Fatalf("error: %v", err) + } + + wantWithPrefix := fmt.Sprintf(want, + tc.prefix, tc.prefix, tc.prefix, tc.prefix, tc.prefix, + tc.prefix, tc.prefix, tc.prefix, tc.prefix, tc.prefix, + ) + if got := buf.String(); wantWithPrefix != got { + t.Fatalf("test case index %d: wanted \n%s\n, got \n%s\n", i, wantWithPrefix, got) + } } }