influxdb.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package influxdb
  2. import (
  3. "fmt"
  4. influxClient "github.com/influxdb/influxdb-go"
  5. "github.com/rcrowley/go-metrics"
  6. "log"
  7. "time"
  8. )
  9. type Config struct {
  10. Host string
  11. Database string
  12. Username string
  13. Password string
  14. }
  15. func Influxdb(r metrics.Registry, d time.Duration, config *Config) {
  16. client, err := influxClient.NewClient(&influxClient.ClientConfig{
  17. Host: config.Host,
  18. Database: config.Database,
  19. Username: config.Username,
  20. Password: config.Password,
  21. })
  22. if err != nil {
  23. log.Println(err)
  24. return
  25. }
  26. for _ = range time.Tick(d) {
  27. if err := send(r, client); err != nil {
  28. log.Println(err)
  29. }
  30. }
  31. }
  32. func send(r metrics.Registry, client *influxClient.Client) error {
  33. series := []*influxClient.Series{}
  34. r.Each(func(name string, i interface{}) {
  35. now := getCurrentTime()
  36. switch metric := i.(type) {
  37. case metrics.Counter:
  38. series = append(series, &influxClient.Series{
  39. Name: fmt.Sprintf("%s.count", name),
  40. Columns: []string{"time", "count"},
  41. Points: [][]interface{}{
  42. {now, metric.Count()},
  43. },
  44. })
  45. case metrics.Gauge:
  46. series = append(series, &influxClient.Series{
  47. Name: fmt.Sprintf("%s.value", name),
  48. Columns: []string{"time", "value"},
  49. Points: [][]interface{}{
  50. {now, metric.Value()},
  51. },
  52. })
  53. case metrics.Histogram:
  54. h := metric.Snapshot()
  55. ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  56. series = append(series, &influxClient.Series{
  57. Name: fmt.Sprintf("%s.histogram", name),
  58. Columns: []string{"time", "count", "min", "max", "mean", "std-dev",
  59. "50-percentile", "75-percentile", "95-percentile",
  60. "99-percentile", "999-percentile"},
  61. Points: [][]interface{}{
  62. {now, h.Count(), h.Min(), h.Max(), h.Mean(), h.StdDev(),
  63. ps[0], ps[1], ps[2], ps[3], ps[4]},
  64. },
  65. })
  66. case metrics.Meter:
  67. m := metric.Snapshot()
  68. series = append(series, &influxClient.Series{
  69. Name: fmt.Sprintf("%s.meter", name),
  70. Columns: []string{"count", "one-minute",
  71. "five-minute", "fifteen-minute", "mean"},
  72. Points: [][]interface{}{
  73. {m.Count(), m.Rate1(), m.Rate5(), m.Rate15(), m.RateMean()},
  74. },
  75. })
  76. case metrics.Timer:
  77. h := metric.Snapshot()
  78. ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  79. series = append(series, &influxClient.Series{
  80. Name: fmt.Sprintf("%s.timer", name),
  81. Columns: []string{"count", "min", "max", "mean", "std-dev",
  82. "50-percentile", "75-percentile", "95-percentile",
  83. "99-percentile", "999-percentile", "one-minute", "five-minute", "fifteen-minute", "mean-rate"},
  84. Points: [][]interface{}{
  85. {h.Count(), h.Min(), h.Max(), h.Mean(), h.StdDev(),
  86. ps[0], ps[1], ps[2], ps[3], ps[4],
  87. h.Rate1(), h.Rate5(), h.Rate15(), h.RateMean()},
  88. },
  89. })
  90. }
  91. if err := client.WriteSeries(series); err != nil {
  92. log.Println(err)
  93. }
  94. })
  95. return nil
  96. }
  97. func getCurrentTime() int64 {
  98. return time.Now().UnixNano() / 1000000
  99. }