annotation_query.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package stackdriver
  2. import (
  3. "context"
  4. "time"
  5. "github.com/grafana/grafana/pkg/tsdb"
  6. )
  7. func (e *StackdriverExecutor) executeAnnotationQuery(ctx context.Context, tsdbQuery *tsdb.TsdbQuery) (*tsdb.Response, error) {
  8. result := &tsdb.Response{
  9. Results: make(map[string]*tsdb.QueryResult),
  10. }
  11. firstQuery := tsdbQuery.Queries[0]
  12. queries, err := e.buildQueries(tsdbQuery)
  13. if err != nil {
  14. return nil, err
  15. }
  16. queryRes, resp, err := e.executeQuery(ctx, queries[0], tsdbQuery)
  17. if err != nil {
  18. return nil, err
  19. }
  20. title := firstQuery.Model.Get("title").MustString()
  21. text := firstQuery.Model.Get("text").MustString()
  22. tags := firstQuery.Model.Get("tags").MustString()
  23. err = e.parseToAnnotations(queryRes, resp, queries[0], title, text, tags)
  24. result.Results[firstQuery.RefId] = queryRes
  25. return result, err
  26. }
  27. func (e *StackdriverExecutor) parseToAnnotations(queryRes *tsdb.QueryResult, data StackdriverResponse, query *StackdriverQuery, title string, text string, tags string) error {
  28. annotations := make([]map[string]string, 0)
  29. for _, series := range data.TimeSeries {
  30. // reverse the order to be ascending
  31. for i := len(series.Points) - 1; i >= 0; i-- {
  32. point := series.Points[i]
  33. annotation := make(map[string]string)
  34. annotation["time"] = point.Interval.EndTime.UTC().Format(time.RFC3339)
  35. annotation["title"] = title
  36. annotation["tags"] = tags
  37. annotation["text"] = text
  38. annotations = append(annotations, annotation)
  39. }
  40. }
  41. transformAnnotationToTable(annotations, queryRes)
  42. return nil
  43. }
  44. func transformAnnotationToTable(data []map[string]string, result *tsdb.QueryResult) {
  45. table := &tsdb.Table{
  46. Columns: make([]tsdb.TableColumn, 4),
  47. Rows: make([]tsdb.RowValues, 0),
  48. }
  49. table.Columns[0].Text = "time"
  50. table.Columns[1].Text = "title"
  51. table.Columns[2].Text = "tags"
  52. table.Columns[3].Text = "text"
  53. for _, r := range data {
  54. values := make([]interface{}, 4)
  55. values[0] = r["time"]
  56. values[1] = r["title"]
  57. values[2] = r["tags"]
  58. values[3] = r["text"]
  59. table.Rows = append(table.Rows, values)
  60. }
  61. result.Tables = append(result.Tables, table)
  62. result.Meta.Set("rowCount", len(data))
  63. slog.Info("anno", "len", len(data))
  64. }
  65. // func (e *StackdriverExecutor) buildAnnotationQuery(tsdbQuery *tsdb.TsdbQuery) (*StackdriverQuery, error) {
  66. // firstQuery := queryContext.Queries[0]
  67. // metricType := query.Model.Get("metricType").MustString()
  68. // filterParts := query.Model.Get("filters").MustArray()
  69. // filterString := buildFilterString(metricType, filterParts)
  70. // params := url.Values{}
  71. // params.Add("interval.startTime", startTime.UTC().Format(time.RFC3339))
  72. // params.Add("interval.endTime", endTime.UTC().Format(time.RFC3339))
  73. // params.Add("filter", buildFilterString(metricType, filterParts))
  74. // params.Add("view", "FULL")
  75. // return &StackdriverQuery{
  76. // RefID: firstQuery.RefID,
  77. // Params: params,
  78. // Target: "",
  79. // }, nil
  80. // }