model_parser.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package elasticsearch
  2. import (
  3. "fmt"
  4. "github.com/grafana/grafana/pkg/components/simplejson"
  5. "github.com/grafana/grafana/pkg/models"
  6. "github.com/grafana/grafana/pkg/tsdb"
  7. "github.com/leibowitz/moment"
  8. "strings"
  9. "time"
  10. )
  11. type ElasticSearchQueryParser struct {
  12. }
  13. func (qp *ElasticSearchQueryParser) Parse(model *simplejson.Json, dsInfo *models.DataSource) (*Query, error) {
  14. //payload := bytes.Buffer{}
  15. //queryHeader := qp.getQueryHeader()
  16. timeField, err := model.Get("timeField").String()
  17. if err != nil {
  18. return nil, err
  19. }
  20. rawQuery := model.Get("query").MustString("")
  21. bucketAggs := model.Get("bucketAggs").MustArray()
  22. metrics := model.Get("metrics").MustArray()
  23. alias := model.Get("alias").MustString("")
  24. parsedInterval, err := tsdb.GetIntervalFrom(dsInfo, model, time.Millisecond)
  25. if err != nil {
  26. return nil, err
  27. }
  28. return &Query{timeField,
  29. rawQuery,
  30. bucketAggs,
  31. metrics,
  32. alias,
  33. parsedInterval}, nil
  34. }
  35. func getRequestHeader(timeRange *tsdb.TimeRange, dsInfo *models.DataSource) *QueryHeader {
  36. var header QueryHeader
  37. esVersion := dsInfo.JsonData.Get("esVersion").MustInt()
  38. searchType := "query_then_fetch"
  39. if esVersion < 5 {
  40. searchType = "count"
  41. }
  42. header.SearchType = searchType
  43. header.IgnoreUnavailable = true
  44. header.Index = getIndexList(dsInfo.Database, dsInfo.JsonData.Get("interval").MustString(""), timeRange)
  45. if esVersion >= 56 {
  46. header.MaxConcurrentShardRequests = dsInfo.JsonData.Get("maxConcurrentShardRequests").MustInt()
  47. }
  48. return &header
  49. }
  50. func getIndexList(pattern string, interval string, timeRange *tsdb.TimeRange) string {
  51. if interval == "" {
  52. return pattern
  53. }
  54. var indexes []string
  55. indexParts := strings.Split(strings.TrimLeft(pattern, "["), "]")
  56. indexBase := indexParts[0]
  57. if len(indexParts) <= 1 {
  58. return pattern
  59. }
  60. indexDateFormat := indexParts[1]
  61. start := moment.NewMoment(timeRange.MustGetFrom())
  62. end := moment.NewMoment(timeRange.MustGetTo())
  63. indexes = append(indexes, fmt.Sprintf("%s%s", indexBase, start.Format(indexDateFormat)))
  64. for start.IsBefore(*end) {
  65. switch interval {
  66. case "Hourly":
  67. start = start.AddHours(1)
  68. case "Daily":
  69. start = start.AddDay()
  70. case "Weekly":
  71. start = start.AddWeeks(1)
  72. case "Monthly":
  73. start = start.AddMonths(1)
  74. case "Yearly":
  75. start = start.AddYears(1)
  76. }
  77. indexes = append(indexes, fmt.Sprintf("%s%s", indexBase, start.Format(indexDateFormat)))
  78. }
  79. return strings.Join(indexes, ",")
  80. }