syslog.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package metrics
  2. import (
  3. "fmt"
  4. "log/syslog"
  5. "time"
  6. )
  7. // Output each metric in the given registry to syslog periodically using
  8. // the given syslogger. The interval is to be given in seconds.
  9. func Syslog(r Registry, interval int, w *syslog.Writer) {
  10. for {
  11. r.Each(func(name string, i interface{}) {
  12. switch m := i.(type) {
  13. case Counter:
  14. w.Info(fmt.Sprintf("counter %s: count: %d", name, m.Count()))
  15. case Gauge:
  16. w.Info(fmt.Sprintf("gauge %s: value: %d", name, m.Value()))
  17. case Healthcheck:
  18. m.Check()
  19. w.Info(fmt.Sprintf("healthcheck %s: error: %v", name, m.Error()))
  20. case Histogram:
  21. ps := m.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  22. w.Info(fmt.Sprintf(
  23. "histogram %s: count: %d min: %d max: %d mean: %.2f stddev: %.2f median: %.2f 75%%: %.2f 95%%: %.2f 99%%: %.2f 99.9%%: %.2f",
  24. name,
  25. m.Count(),
  26. m.Min(),
  27. m.Max(),
  28. m.Mean(),
  29. m.StdDev(),
  30. ps[0],
  31. ps[1],
  32. ps[2],
  33. ps[3],
  34. ps[4],
  35. ))
  36. case Meter:
  37. w.Info(fmt.Sprintf(
  38. "meter %s: count: %d 1-min: %.2f 5-min: %.2f 15-min: %.2f mean: %.2f",
  39. name,
  40. m.Count(),
  41. m.Rate1(),
  42. m.Rate5(),
  43. m.Rate15(),
  44. m.RateMean(),
  45. ))
  46. case Timer:
  47. ps := m.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  48. w.Info(fmt.Sprintf(
  49. "timer %s: count: %d min: %d max: %d mean: %.2f stddev: %.2f median: %.2f 75%%: %.2f 95%%: %.2f 99%%: %.2f 99.9%%: %.2f 1-min: %.2f 5-min: %.2f 15-min: %.2f mean: %.2f",
  50. name,
  51. m.Count(),
  52. m.Min(),
  53. m.Max(),
  54. m.Mean(),
  55. m.StdDev(),
  56. ps[0],
  57. ps[1],
  58. ps[2],
  59. ps[3],
  60. ps[4],
  61. m.Rate1(),
  62. m.Rate5(),
  63. m.Rate15(),
  64. m.RateMean(),
  65. ))
  66. }
  67. })
  68. time.Sleep(time.Duration(int64(1e9) * int64(interval)))
  69. }
  70. }