graphite.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package graphite
  2. import (
  3. "encoding/json"
  4. "io/ioutil"
  5. "net/http"
  6. "net/url"
  7. "time"
  8. "github.com/grafana/grafana/pkg/log"
  9. "github.com/grafana/grafana/pkg/tsdb"
  10. )
  11. type GraphiteExecutor struct {
  12. *tsdb.DataSourceInfo
  13. }
  14. func NewGraphiteExecutor(dsInfo *tsdb.DataSourceInfo) tsdb.Executor {
  15. return &GraphiteExecutor{dsInfo}
  16. }
  17. var glog log.Logger
  18. func init() {
  19. glog = log.New("tsdb.graphite")
  20. tsdb.RegisterExecutor("graphite", NewGraphiteExecutor)
  21. }
  22. func (e *GraphiteExecutor) Execute(queries tsdb.QuerySlice, context *tsdb.QueryContext) *tsdb.BatchResult {
  23. result := &tsdb.BatchResult{}
  24. params := url.Values{
  25. "from": []string{context.TimeRange.From},
  26. "until": []string{context.TimeRange.To},
  27. "format": []string{"json"},
  28. "maxDataPoints": []string{"500"},
  29. }
  30. for _, query := range queries {
  31. params["target"] = []string{
  32. query.Query,
  33. }
  34. }
  35. client := http.Client{Timeout: time.Duration(10 * time.Second)}
  36. res, err := client.PostForm(e.Url+"/render?", params)
  37. if err != nil {
  38. result.Error = err
  39. return result
  40. }
  41. defer res.Body.Close()
  42. body, err := ioutil.ReadAll(res.Body)
  43. if err != nil {
  44. result.Error = err
  45. return result
  46. }
  47. var data []TargetResponseDTO
  48. err = json.Unmarshal(body, &data)
  49. if err != nil {
  50. glog.Info("Failed to unmarshal graphite response", "error", err)
  51. result.Error = err
  52. return result
  53. }
  54. result.QueryResults = make(map[string]*tsdb.QueryResult)
  55. queryRes := &tsdb.QueryResult{}
  56. for _, series := range data {
  57. queryRes.Series = append(queryRes.Series, &tsdb.TimeSeries{
  58. Name: series.Target,
  59. Points: series.DataPoints,
  60. })
  61. }
  62. result.QueryResults["A"] = queryRes
  63. return result
  64. }