graphite.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package graphite
  2. import (
  3. "fmt"
  4. "github.com/franela/goreq"
  5. "github.com/grafana/grafana/pkg/bus"
  6. "github.com/grafana/grafana/pkg/components/simplejson"
  7. m "github.com/grafana/grafana/pkg/models"
  8. "net/http"
  9. "net/url"
  10. "time"
  11. )
  12. type GraphiteClient struct{}
  13. type GraphiteSerie struct {
  14. Datapoints [][2]float64
  15. Target string
  16. }
  17. type GraphiteResponse []GraphiteSerie
  18. func (this GraphiteClient) GetSeries(rule m.AlertRule) (m.TimeSeriesSlice, error) {
  19. query := &m.GetDataSourceByIdQuery{Id: rule.DatasourceId, OrgId: rule.OrgId}
  20. if err := bus.Dispatch(query); err != nil {
  21. return nil, err
  22. }
  23. v := url.Values{
  24. "format": []string{"json"},
  25. "target": []string{getTargetFromRule(rule)},
  26. "until": []string{"now"},
  27. "from": []string{"-" + rule.QueryRange},
  28. }
  29. res, err := goreq.Request{
  30. Method: "POST",
  31. Uri: query.Result.Url + "/render",
  32. Body: v.Encode(),
  33. Timeout: 500 * time.Millisecond,
  34. }.Do()
  35. response := GraphiteResponse{}
  36. res.Body.FromJsonTo(&response)
  37. if err != nil {
  38. return nil, err
  39. }
  40. if res.StatusCode != http.StatusOK {
  41. return nil, fmt.Errorf("error!")
  42. }
  43. timeSeries := make([]*m.TimeSeries, 0)
  44. for _, v := range response {
  45. timeSeries = append(timeSeries, m.NewTimeSeries(v.Target, v.Datapoints))
  46. }
  47. return timeSeries, nil
  48. }
  49. func getTargetFromRule(rule m.AlertRule) string {
  50. json, _ := simplejson.NewJson([]byte(rule.Query))
  51. return json.Get("target").MustString()
  52. }