graphite.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 m := i.(type) {
  27. case Counter:
  28. fmt.Fprintf(w, "%s.%s.count %d %d\n", prefix, name, m.Count(), now)
  29. case Gauge:
  30. fmt.Fprintf(w, "%s.%s.value %d %d\n", prefix, name, m.Value(), now)
  31. case Histogram:
  32. ps := m.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  33. fmt.Fprintf(w, "%s.%s.count %d %d\n", prefix, name, m.Count(), now)
  34. fmt.Fprintf(w, "%s.%s.min %d %d\n", prefix, name, m.Min(), now)
  35. fmt.Fprintf(w, "%s.%s.max %d %d\n", prefix, name, m.Max(), now)
  36. fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", prefix, name, m.Mean(), now)
  37. fmt.Fprintf(w, "%s.%s.std-dev %.2f %d\n", prefix, name, m.StdDev(), now)
  38. fmt.Fprintf(w, "%s.%s.50-percentile %.2f %d\n", prefix, name, ps[0], now)
  39. fmt.Fprintf(w, "%s.%s.75-percentile %.2f %d\n", prefix, name, ps[1], now)
  40. fmt.Fprintf(w, "%s.%s.95-percentile %.2f %d\n", prefix, name, ps[2], now)
  41. fmt.Fprintf(w, "%s.%s.99-percentile %.2f %d\n", prefix, name, ps[3], now)
  42. fmt.Fprintf(w, "%s.%s.999-percentile %.2f %d\n", prefix, name, ps[4], now)
  43. case Meter:
  44. fmt.Fprintf(w, "%s.%s.count %d %d\n", prefix, name, m.Count(), now)
  45. fmt.Fprintf(w, "%s.%s.one-minute %.2f %d\n", prefix, name, m.Rate1(), now)
  46. fmt.Fprintf(w, "%s.%s.five-minute %.2f %d\n", prefix, name, m.Rate5(), now)
  47. fmt.Fprintf(w, "%s.%s.fifteen-minute %.2f %d\n", prefix, name, m.Rate15(), now)
  48. fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", prefix, name, m.RateMean(), now)
  49. case Timer:
  50. ps := m.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  51. fmt.Fprintf(w, "%s.%s.count %d %d\n", prefix, name, m.Count(), now)
  52. fmt.Fprintf(w, "%s.%s.min %d %d\n", prefix, name, m.Min(), now)
  53. fmt.Fprintf(w, "%s.%s.max %d %d\n", prefix, name, m.Max(), now)
  54. fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", prefix, name, m.Mean(), now)
  55. fmt.Fprintf(w, "%s.%s.std-dev %.2f %d\n", prefix, name, m.StdDev(), now)
  56. fmt.Fprintf(w, "%s.%s.50-percentile %.2f %d\n", prefix, name, ps[0], now)
  57. fmt.Fprintf(w, "%s.%s.75-percentile %.2f %d\n", prefix, name, ps[1], now)
  58. fmt.Fprintf(w, "%s.%s.95-percentile %.2f %d\n", prefix, name, ps[2], now)
  59. fmt.Fprintf(w, "%s.%s.99-percentile %.2f %d\n", prefix, name, ps[3], now)
  60. fmt.Fprintf(w, "%s.%s.999-percentile %.2f %d\n", prefix, name, ps[4], now)
  61. fmt.Fprintf(w, "%s.%s.one-minute %.2f %d\n", prefix, name, m.Rate1(), now)
  62. fmt.Fprintf(w, "%s.%s.five-minute %.2f %d\n", prefix, name, m.Rate5(), now)
  63. fmt.Fprintf(w, "%s.%s.fifteen-minute %.2f %d\n", prefix, name, m.Rate15(), now)
  64. fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", prefix, name, m.RateMean(), now)
  65. }
  66. w.Flush()
  67. })
  68. return nil
  69. }