graphite.go 3.1 KB

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