graphite.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package metrics
  2. import (
  3. "bytes"
  4. "fmt"
  5. "net"
  6. "reflect"
  7. "time"
  8. "github.com/grafana/grafana/pkg/log"
  9. "github.com/grafana/grafana/pkg/setting"
  10. )
  11. type GraphitePublisher struct {
  12. Address string
  13. Protocol string
  14. Prefix string
  15. }
  16. func CreateGraphitePublisher() (*GraphitePublisher, error) {
  17. graphiteSection, err := setting.Cfg.GetSection("metrics.graphite")
  18. if err != nil {
  19. return nil, nil
  20. }
  21. publisher := &GraphitePublisher{}
  22. publisher.Protocol = "tcp"
  23. publisher.Address = graphiteSection.Key("address").MustString("localhost:2003")
  24. publisher.Prefix = graphiteSection.Key("prefix").MustString("service.grafana.%(instance_name)s")
  25. return publisher, nil
  26. }
  27. func (this *GraphitePublisher) Publish(metrics []Metric) {
  28. conn, err := net.DialTimeout(this.Protocol, this.Address, time.Second*5)
  29. if err != nil {
  30. log.Error(3, "Metrics: GraphitePublisher: Failed to connect to %s!", err)
  31. return
  32. }
  33. buf := bytes.NewBufferString("")
  34. now := time.Now().Unix()
  35. addIntToBuf := func(metric string, value int64) {
  36. buf.WriteString(fmt.Sprintf("%s %d %d\n", metric, value, now))
  37. }
  38. addFloatToBuf := func(metric string, value float64) {
  39. buf.WriteString(fmt.Sprintf("%s %f %d\n", metric, value, now))
  40. }
  41. for _, m := range metrics {
  42. log.Info("metric: %v, %v", m, reflect.TypeOf(m))
  43. metricName := this.Prefix + m.Name() + m.StringifyTags()
  44. switch metric := m.(type) {
  45. case Counter:
  46. addIntToBuf(metricName+".count", metric.Count())
  47. case SimpleTimer:
  48. addIntToBuf(metricName+".count", metric.Count())
  49. addIntToBuf(metricName+".max", metric.Max())
  50. addIntToBuf(metricName+".min", metric.Min())
  51. addFloatToBuf(metricName+".mean", metric.Mean())
  52. case Timer:
  53. percentiles := metric.Percentiles([]float64{0.25, 0.75, 0.90, 0.99})
  54. addIntToBuf(metricName+".count", metric.Count())
  55. addIntToBuf(metricName+".max", metric.Max())
  56. addIntToBuf(metricName+".min", metric.Min())
  57. addFloatToBuf(metricName+".mean", metric.Mean())
  58. addFloatToBuf(metricName+".std", metric.StdDev())
  59. addFloatToBuf(metricName+".p25", percentiles[0])
  60. addFloatToBuf(metricName+".p75", percentiles[1])
  61. addFloatToBuf(metricName+".p90", percentiles[2])
  62. addFloatToBuf(metricName+".p99", percentiles[3])
  63. }
  64. }
  65. log.Trace("Metrics: GraphitePublisher.Publish() \n%s", buf)
  66. _, err = conn.Write(buf.Bytes())
  67. if err != nil {
  68. log.Error(3, "Metrics: GraphitePublisher: Failed to send metrics! %s", err)
  69. }
  70. }