瀏覽代碼

Merge pull request #2 from cyberdelia/graphite-output

Add a graphite reporter
Richard Crowley 13 年之前
父節點
當前提交
ba9d0e442c
共有 1 個文件被更改,包括 65 次插入0 次删除
  1. 65 0
      graphite.go

+ 65 - 0
graphite.go

@@ -0,0 +1,65 @@
+package metrics
+
+import (
+	"bufio"
+	"fmt"
+	"net"
+	"time"
+)
+
+func Graphite(r Registry, interval int, addr string) {
+	for {
+		time.Sleep(time.Duration(int64(1e9) * int64(interval)))
+
+		now := time.Now().Unix()
+		conn, err := net.Dial("tcp", addr)
+		if err != nil {
+			continue
+		}
+
+		w := bufio.NewWriter(conn)
+		r.Each(func(name string, i interface{}) {
+			switch m := i.(type) {
+			case Counter:
+				w.WriteString(fmt.Sprintf("%s.count %d %d\n", name, m.Count(), now))
+			case Gauge:
+				w.WriteString(fmt.Sprintf("%s.value %d %d\n", name, m.Value(), now))
+			case Histogram:
+				ps := m.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
+				w.WriteString(fmt.Sprintf("%s.count %d %d\n", name, m.Count(), now))
+				w.WriteString(fmt.Sprintf("%s.min %d %d\n", name, m.Min(), now))
+				w.WriteString(fmt.Sprintf("%s.max %d %d\n", name, m.Max(), now))
+				w.WriteString(fmt.Sprintf("%s.mean %.2f %d\n", name, m.Mean(), now))
+				w.WriteString(fmt.Sprintf("%s.std-dev %.2f %d\n", name, m.StdDev(), now))
+				w.WriteString(fmt.Sprintf("%s.50-percentile %.2f %d\n", name, ps[0], now))
+				w.WriteString(fmt.Sprintf("%s.75-percentile %.2f %d\n", name, ps[1], now))
+				w.WriteString(fmt.Sprintf("%s.95-percentile %.2f %d\n", name, ps[2], now))
+				w.WriteString(fmt.Sprintf("%s.99-percentile %.2f %d\n", name, ps[3], now))
+				w.WriteString(fmt.Sprintf("%s.999-percentile %.2f %d\n", name, ps[4], now))
+			case Meter:
+				w.WriteString(fmt.Sprintf("%s.count %d %d\n", name, m.Count(), now))
+				w.WriteString(fmt.Sprintf("%s.one-minute %.2f %d\n", name, m.Rate1(), now))
+				w.WriteString(fmt.Sprintf("%s.five-minute %.2f %d\n", name, m.Rate5(), now))
+				w.WriteString(fmt.Sprintf("%s.fifteen-minute %.2f %d\n", name, m.Rate15(), now))
+				w.WriteString(fmt.Sprintf("%s.mean %.2f %d\n", name, m.RateMean(), now))
+			case Timer:
+				ps := m.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
+				w.WriteString(fmt.Sprintf("%s.count %d %d\n", name, m.Count(), now))
+				w.WriteString(fmt.Sprintf("%s.min %d %d\n", name, m.Min(), now))
+				w.WriteString(fmt.Sprintf("%s.max %d %d\n", name, m.Max(), now))
+				w.WriteString(fmt.Sprintf("%s.mean %.2f %d\n", name, m.Mean(), now))
+				w.WriteString(fmt.Sprintf("%s.std-dev %.2f %d\n", name, m.StdDev(), now))
+				w.WriteString(fmt.Sprintf("%s.50-percentile %.2f %d\n", name, ps[0], now))
+				w.WriteString(fmt.Sprintf("%s.75-percentile %.2f %d\n", name, ps[1], now))
+				w.WriteString(fmt.Sprintf("%s.95-percentile %.2f %d\n", name, ps[2], now))
+				w.WriteString(fmt.Sprintf("%s.99-percentile %.2f %d\n", name, ps[3], now))
+				w.WriteString(fmt.Sprintf("%s.999-percentile %.2f %d\n", name, ps[4], now))
+				w.WriteString(fmt.Sprintf("%s.one-minute %.2f %d\n", name, m.Rate1(), now))
+				w.WriteString(fmt.Sprintf("%s.five-minute %.2f %d\n", name, m.Rate5(), now))
+				w.WriteString(fmt.Sprintf("%s.fifteen-minute %.2f %d\n", name, m.Rate15(), now))
+				w.WriteString(fmt.Sprintf("%s.mean %.2f %d\n", name, m.RateMean(), now))
+			}
+			w.Flush()
+		})
+	}
+}