metrics.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package api
  2. import (
  3. "context"
  4. "github.com/grafana/grafana/pkg/api/dtos"
  5. "github.com/grafana/grafana/pkg/bus"
  6. "github.com/grafana/grafana/pkg/components/simplejson"
  7. "github.com/grafana/grafana/pkg/middleware"
  8. "github.com/grafana/grafana/pkg/models"
  9. "github.com/grafana/grafana/pkg/tsdb"
  10. "github.com/grafana/grafana/pkg/tsdb/testdata"
  11. "github.com/grafana/grafana/pkg/util"
  12. )
  13. // POST /api/tsdb/query
  14. func QueryMetrics(c *middleware.Context, reqDto dtos.MetricRequest) Response {
  15. timeRange := tsdb.NewTimeRange(reqDto.From, reqDto.To)
  16. if len(reqDto.Queries) == 0 {
  17. return ApiError(400, "No queries found in query", nil)
  18. }
  19. dsId, err := reqDto.Queries[0].Get("datasourceId").Int64()
  20. if err != nil {
  21. return ApiError(400, "Query missing datasourceId", nil)
  22. }
  23. dsQuery := models.GetDataSourceByIdQuery{Id: dsId, OrgId: c.OrgId}
  24. if err := bus.Dispatch(&dsQuery); err != nil {
  25. return ApiError(500, "failed to fetch data source", err)
  26. }
  27. request := &tsdb.Request{TimeRange: timeRange}
  28. for _, query := range reqDto.Queries {
  29. request.Queries = append(request.Queries, &tsdb.Query{
  30. RefId: query.Get("refId").MustString("A"),
  31. MaxDataPoints: query.Get("maxDataPoints").MustInt64(100),
  32. IntervalMs: query.Get("intervalMs").MustInt64(1000),
  33. Model: query,
  34. DataSource: dsQuery.Result,
  35. })
  36. }
  37. resp, err := tsdb.HandleRequest(context.Background(), request)
  38. if err != nil {
  39. return ApiError(500, "Metric request error", err)
  40. }
  41. statusCode := 200
  42. for _, res := range resp.Results {
  43. if res.Error != nil {
  44. res.ErrorString = res.Error.Error()
  45. resp.Message = res.ErrorString
  46. statusCode = 500
  47. }
  48. }
  49. return Json(statusCode, &resp)
  50. }
  51. // GET /api/tsdb/testdata/scenarios
  52. func GetTestDataScenarios(c *middleware.Context) Response {
  53. result := make([]interface{}, 0)
  54. for _, scenario := range testdata.ScenarioRegistry {
  55. result = append(result, map[string]interface{}{
  56. "id": scenario.Id,
  57. "name": scenario.Name,
  58. "description": scenario.Description,
  59. "stringInput": scenario.StringInput,
  60. })
  61. }
  62. return Json(200, &result)
  63. }
  64. // Genereates a index out of range error
  65. func GenerateError(c *middleware.Context) Response {
  66. var array []string
  67. return Json(200, array[20])
  68. }
  69. // GET /api/tsdb/testdata/gensql
  70. func GenerateSqlTestData(c *middleware.Context) Response {
  71. if err := bus.Dispatch(&models.InsertSqlTestDataCommand{}); err != nil {
  72. return ApiError(500, "Failed to insert test data", err)
  73. }
  74. return Json(200, &util.DynMap{"message": "OK"})
  75. }
  76. // GET /api/tsdb/testdata/random-walk
  77. func GetTestDataRandomWalk(c *middleware.Context) Response {
  78. from := c.Query("from")
  79. to := c.Query("to")
  80. intervalMs := c.QueryInt64("intervalMs")
  81. timeRange := tsdb.NewTimeRange(from, to)
  82. request := &tsdb.Request{TimeRange: timeRange}
  83. request.Queries = append(request.Queries, &tsdb.Query{
  84. RefId: "A",
  85. IntervalMs: intervalMs,
  86. Model: simplejson.NewFromAny(&util.DynMap{
  87. "scenario": "random_walk",
  88. }),
  89. DataSource: &models.DataSource{Type: "grafana-testdata-datasource"},
  90. })
  91. resp, err := tsdb.HandleRequest(context.Background(), request)
  92. if err != nil {
  93. return ApiError(500, "Metric request error", err)
  94. }
  95. return Json(200, &resp)
  96. }