Browse Source

make bridge prefix backwards compatible

bergquist 8 years ago
parent
commit
c177a9a77a
2 changed files with 53 additions and 12 deletions
  1. 18 4
      pkg/metrics/graphitebridge/graphite.go
  2. 35 8
      pkg/metrics/graphitebridge/graphite_test.go

+ 18 - 4
pkg/metrics/graphitebridge/graphite.go

@@ -220,10 +220,7 @@ func (b *Bridge) writeMetrics(w io.Writer, mfs []*dto.MetricFamily, prefix strin
 
 
 		buf := bufio.NewWriter(w)
 		buf := bufio.NewWriter(w)
 		for _, s := range vec {
 		for _, s := range vec {
-			if err := writeSanitized(buf, prefix); err != nil {
-				return err
-			}
-			if err := buf.WriteByte('.'); err != nil {
+			if err := writePrefix(buf, prefix); err != nil {
 				return err
 				return err
 			}
 			}
 
 
@@ -324,6 +321,16 @@ func addExtentionConventionForRollups(buf *bufio.Writer, mf *dto.MetricFamily, m
 	return nil
 	return nil
 }
 }
 
 
+func writePrefix(buf *bufio.Writer, s string) error {
+	for _, c := range s {
+		if _, err := buf.WriteRune(replaceInvalid(c)); err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
 func writeSanitized(buf *bufio.Writer, s string) error {
 func writeSanitized(buf *bufio.Writer, s string) error {
 	prevUnderscore := false
 	prevUnderscore := false
 
 
@@ -345,6 +352,13 @@ func writeSanitized(buf *bufio.Writer, s string) error {
 	return nil
 	return nil
 }
 }
 
 
+func replaceInvalid(c rune) rune {
+	if c == ' ' || c == '.' {
+		return '.'
+	}
+	return replaceInvalidRune(c)
+}
+
 func replaceInvalidRune(c rune) rune {
 func replaceInvalidRune(c rune) rune {
 	if c == ' ' {
 	if c == ' ' {
 		return '.'
 		return '.'

+ 35 - 8
pkg/metrics/graphitebridge/graphite_test.go

@@ -96,6 +96,33 @@ func TestSanitize(t *testing.T) {
 	}
 	}
 }
 }
 
 
+func TestSanitizePrefix(t *testing.T) {
+	testCases := []struct {
+		in, out string
+	}{
+		{in: "service.prod.", out: "service.prod."},
+		{in: "service.prod", out: "service.prod"},
+	}
+
+	var buf bytes.Buffer
+	w := bufio.NewWriter(&buf)
+
+	for i, tc := range testCases {
+		if err := writePrefix(w, tc.in); err != nil {
+			t.Fatalf("write failed: %v", err)
+		}
+		if err := w.Flush(); err != nil {
+			t.Fatalf("flush failed: %v", err)
+		}
+
+		if want, got := tc.out, buf.String(); want != got {
+			t.Fatalf("test case index %d: got sanitized string %s, want %s", i, got, want)
+		}
+
+		buf.Reset()
+	}
+}
+
 func TestWriteSummary(t *testing.T) {
 func TestWriteSummary(t *testing.T) {
 	sumVec := prometheus.NewSummaryVec(
 	sumVec := prometheus.NewSummaryVec(
 		prometheus.SummaryOpts{
 		prometheus.SummaryOpts{
@@ -133,7 +160,7 @@ func TestWriteSummary(t *testing.T) {
 
 
 	now := model.Time(1477043083)
 	now := model.Time(1477043083)
 	var buf bytes.Buffer
 	var buf bytes.Buffer
-	err = b.writeMetrics(&buf, mfs, "prefix", now)
+	err = b.writeMetrics(&buf, mfs, "prefix.", now)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("error: %v", err)
 		t.Fatalf("error: %v", err)
 	}
 	}
@@ -192,7 +219,7 @@ func TestWriteHistogram(t *testing.T) {
 
 
 	now := model.Time(1477043083)
 	now := model.Time(1477043083)
 	var buf bytes.Buffer
 	var buf bytes.Buffer
-	err = b.writeMetrics(&buf, mfs, "prefix", now)
+	err = b.writeMetrics(&buf, mfs, "prefix.", now)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("error: %v", err)
 		t.Fatalf("error: %v", err)
 	}
 	}
@@ -249,7 +276,7 @@ func TestCounterVec(t *testing.T) {
 	}
 	}
 
 
 	var buf bytes.Buffer
 	var buf bytes.Buffer
-	err = b.writeMetrics(&buf, mfs, "prefix", model.Time(1477043083))
+	err = b.writeMetrics(&buf, mfs, "prefix.", model.Time(1477043083))
 	if err != nil {
 	if err != nil {
 		t.Fatalf("error: %v", err)
 		t.Fatalf("error: %v", err)
 	}
 	}
@@ -271,7 +298,7 @@ prefix.page.response.constname.constvalue.labelname.val2.count 1 1477043
 	}
 	}
 
 
 	buf = bytes.Buffer{}
 	buf = bytes.Buffer{}
-	err = b.writeMetrics(&buf, mfs, "prefix", model.Time(1477053083))
+	err = b.writeMetrics(&buf, mfs, "prefix.", model.Time(1477053083))
 	if err != nil {
 	if err != nil {
 		t.Fatalf("error: %v", err)
 		t.Fatalf("error: %v", err)
 	}
 	}
@@ -313,7 +340,7 @@ func TestCounter(t *testing.T) {
 	}
 	}
 
 
 	var buf bytes.Buffer
 	var buf bytes.Buffer
-	err = b.writeMetrics(&buf, mfs, "prefix", model.Time(1477043083))
+	err = b.writeMetrics(&buf, mfs, "prefix.", model.Time(1477043083))
 	if err != nil {
 	if err != nil {
 		t.Fatalf("error: %v", err)
 		t.Fatalf("error: %v", err)
 	}
 	}
@@ -332,7 +359,7 @@ func TestCounter(t *testing.T) {
 	}
 	}
 
 
 	buf = bytes.Buffer{}
 	buf = bytes.Buffer{}
-	err = b.writeMetrics(&buf, mfs, "prefix", model.Time(1477053083))
+	err = b.writeMetrics(&buf, mfs, "prefix.", model.Time(1477053083))
 	if err != nil {
 	if err != nil {
 		t.Fatalf("error: %v", err)
 		t.Fatalf("error: %v", err)
 	}
 	}
@@ -372,7 +399,7 @@ func TestCanIgnoreSomeMetrics(t *testing.T) {
 	}
 	}
 
 
 	var buf bytes.Buffer
 	var buf bytes.Buffer
-	err = b.writeMetrics(&buf, mfs, "prefix", model.Time(1477043083))
+	err = b.writeMetrics(&buf, mfs, "prefix.", model.Time(1477043083))
 	if err != nil {
 	if err != nil {
 		t.Fatalf("error: %v", err)
 		t.Fatalf("error: %v", err)
 	}
 	}
@@ -402,7 +429,7 @@ func TestPush(t *testing.T) {
 	b, err := NewBridge(&Config{
 	b, err := NewBridge(&Config{
 		URL:      host + port,
 		URL:      host + port,
 		Gatherer: reg,
 		Gatherer: reg,
-		Prefix:   "prefix",
+		Prefix:   "prefix.",
 	})
 	})
 	if err != nil {
 	if err != nil {
 		t.Fatalf("error creating bridge: %v", err)
 		t.Fatalf("error creating bridge: %v", err)