influxdb.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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.GaugeFloat64:
  54. series = append(series, &influxClient.Series{
  55. Name: fmt.Sprintf("%s.value", name),
  56. Columns: []string{"time", "value"},
  57. Points: [][]interface{}{
  58. {now, metric.Value()},
  59. },
  60. })
  61. case metrics.Histogram:
  62. h := metric.Snapshot()
  63. ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  64. series = append(series, &influxClient.Series{
  65. Name: fmt.Sprintf("%s.histogram", name),
  66. Columns: []string{"time", "count", "min", "max", "mean", "std-dev",
  67. "50-percentile", "75-percentile", "95-percentile",
  68. "99-percentile", "999-percentile"},
  69. Points: [][]interface{}{
  70. {now, h.Count(), h.Min(), h.Max(), h.Mean(), h.StdDev(),
  71. ps[0], ps[1], ps[2], ps[3], ps[4]},
  72. },
  73. })
  74. case metrics.Meter:
  75. m := metric.Snapshot()
  76. series = append(series, &influxClient.Series{
  77. Name: fmt.Sprintf("%s.meter", name),
  78. Columns: []string{"count", "one-minute",
  79. "five-minute", "fifteen-minute", "mean"},
  80. Points: [][]interface{}{
  81. {m.Count(), m.Rate1(), m.Rate5(), m.Rate15(), m.RateMean()},
  82. },
  83. })
  84. case metrics.Timer:
  85. h := metric.Snapshot()
  86. ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  87. series = append(series, &influxClient.Series{
  88. Name: fmt.Sprintf("%s.timer", name),
  89. Columns: []string{"count", "min", "max", "mean", "std-dev",
  90. "50-percentile", "75-percentile", "95-percentile",
  91. "99-percentile", "999-percentile", "one-minute", "five-minute", "fifteen-minute", "mean-rate"},
  92. Points: [][]interface{}{
  93. {h.Count(), h.Min(), h.Max(), h.Mean(), h.StdDev(),
  94. ps[0], ps[1], ps[2], ps[3], ps[4],
  95. h.Rate1(), h.Rate5(), h.Rate15(), h.RateMean()},
  96. },
  97. })
  98. }
  99. if err := client.WriteSeries(series); err != nil {
  100. log.Println(err)
  101. }
  102. })
  103. return nil
  104. }
  105. func getCurrentTime() int64 {
  106. return time.Now().UnixNano() / 1000000
  107. }