graphite.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package metrics
  2. import (
  3. "bufio"
  4. "fmt"
  5. "net"
  6. "time"
  7. )
  8. func Graphite(r Registry, d time.Duration, prefix string, addr *net.TCPAddr) {
  9. for {
  10. now := time.Now().Unix()
  11. conn, err := net.DialTCP("tcp", nil, addr)
  12. if nil != err {
  13. continue
  14. }
  15. w := bufio.NewWriter(conn)
  16. r.Each(func(name string, i interface{}) {
  17. switch m := i.(type) {
  18. case Counter:
  19. fmt.Fprintf(w, "%s.%s.count %d %d\n", prefix, name, m.Count(), now)
  20. case Gauge:
  21. fmt.Fprintf(w, "%s.%s.value %d %d\n", prefix, name, m.Value(), now)
  22. case Histogram:
  23. ps := m.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  24. fmt.Fprintf(w, "%s.%s.count %d %d\n", prefix, name, m.Count(), now)
  25. fmt.Fprintf(w, "%s.%s.min %d %d\n", prefix, name, m.Min(), now)
  26. fmt.Fprintf(w, "%s.%s.max %d %d\n", prefix, name, m.Max(), now)
  27. fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", prefix, name, m.Mean(), now)
  28. fmt.Fprintf(w, "%s.%s.std-dev %.2f %d\n", prefix, name, m.StdDev(), now)
  29. fmt.Fprintf(w, "%s.%s.50-percentile %.2f %d\n", prefix, name, ps[0], now)
  30. fmt.Fprintf(w, "%s.%s.75-percentile %.2f %d\n", prefix, name, ps[1], now)
  31. fmt.Fprintf(w, "%s.%s.95-percentile %.2f %d\n", prefix, name, ps[2], now)
  32. fmt.Fprintf(w, "%s.%s.99-percentile %.2f %d\n", prefix, name, ps[3], now)
  33. fmt.Fprintf(w, "%s.%s.999-percentile %.2f %d\n", prefix, name, ps[4], now)
  34. case Meter:
  35. fmt.Fprintf(w, "%s.%s.count %d %d\n", prefix, name, m.Count(), now)
  36. fmt.Fprintf(w, "%s.%s.one-minute %.2f %d\n", prefix, name, m.Rate1(), now)
  37. fmt.Fprintf(w, "%s.%s.five-minute %.2f %d\n", prefix, name, m.Rate5(), now)
  38. fmt.Fprintf(w, "%s.%s.fifteen-minute %.2f %d\n", prefix, name, m.Rate15(), now)
  39. fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", prefix, name, m.RateMean(), now)
  40. case Timer:
  41. ps := m.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  42. fmt.Fprintf(w, "%s.%s.count %d %d\n", prefix, name, m.Count(), now)
  43. fmt.Fprintf(w, "%s.%s.min %d %d\n", prefix, name, m.Min(), now)
  44. fmt.Fprintf(w, "%s.%s.max %d %d\n", prefix, name, m.Max(), now)
  45. fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", prefix, name, m.Mean(), now)
  46. fmt.Fprintf(w, "%s.%s.std-dev %.2f %d\n", prefix, name, m.StdDev(), now)
  47. fmt.Fprintf(w, "%s.%s.50-percentile %.2f %d\n", prefix, name, ps[0], now)
  48. fmt.Fprintf(w, "%s.%s.75-percentile %.2f %d\n", prefix, name, ps[1], now)
  49. fmt.Fprintf(w, "%s.%s.95-percentile %.2f %d\n", prefix, name, ps[2], now)
  50. fmt.Fprintf(w, "%s.%s.99-percentile %.2f %d\n", prefix, name, ps[3], now)
  51. fmt.Fprintf(w, "%s.%s.999-percentile %.2f %d\n", prefix, name, ps[4], now)
  52. fmt.Fprintf(w, "%s.%s.one-minute %.2f %d\n", prefix, name, m.Rate1(), now)
  53. fmt.Fprintf(w, "%s.%s.five-minute %.2f %d\n", prefix, name, m.Rate5(), now)
  54. fmt.Fprintf(w, "%s.%s.fifteen-minute %.2f %d\n", prefix, name, m.Rate15(), now)
  55. fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", prefix, name, m.RateMean(), now)
  56. }
  57. w.Flush()
  58. })
  59. time.Sleep(d)
  60. }
  61. }