metrics.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package api
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "github.com/grafana/grafana/pkg/api/dtos"
  6. "github.com/grafana/grafana/pkg/metrics"
  7. "github.com/grafana/grafana/pkg/middleware"
  8. "github.com/grafana/grafana/pkg/tsdb"
  9. "github.com/grafana/grafana/pkg/tsdb/testdata"
  10. "github.com/grafana/grafana/pkg/util"
  11. )
  12. // POST /api/tsdb/query
  13. func QueryMetrics(c *middleware.Context, reqDto dtos.MetricRequest) Response {
  14. timeRange := tsdb.NewTimeRange(reqDto.From, reqDto.To)
  15. request := &tsdb.Request{TimeRange: timeRange}
  16. for _, query := range reqDto.Queries {
  17. request.Queries = append(request.Queries, &tsdb.Query{
  18. RefId: query.Get("refId").MustString("A"),
  19. MaxDataPoints: query.Get("maxDataPoints").MustInt64(100),
  20. IntervalMs: query.Get("intervalMs").MustInt64(1000),
  21. Model: query,
  22. DataSource: &tsdb.DataSourceInfo{
  23. Name: "Grafana TestDataDB",
  24. PluginId: "grafana-testdata-datasource",
  25. },
  26. })
  27. }
  28. resp, err := tsdb.HandleRequest(request)
  29. if err != nil {
  30. return ApiError(500, "Metric request error", err)
  31. }
  32. return Json(200, &resp)
  33. }
  34. // GET /api/tsdb/testdata/scenarios
  35. func GetTestDataScenarios(c *middleware.Context) Response {
  36. result := make([]interface{}, 0)
  37. for _, scenario := range testdata.ScenarioRegistry {
  38. result = append(result, map[string]interface{}{
  39. "id": scenario.Id,
  40. "name": scenario.Name,
  41. "description": scenario.Description,
  42. })
  43. }
  44. return Json(200, &result)
  45. }
  46. func GetInternalMetrics(c *middleware.Context) Response {
  47. if metrics.UseNilMetrics {
  48. return Json(200, util.DynMap{"message": "Metrics disabled"})
  49. }
  50. snapshots := metrics.MetricStats.GetSnapshots()
  51. resp := make(map[string]interface{})
  52. for _, m := range snapshots {
  53. metricName := m.Name() + m.StringifyTags()
  54. switch metric := m.(type) {
  55. case metrics.Counter:
  56. resp[metricName] = map[string]interface{}{
  57. "count": metric.Count(),
  58. }
  59. case metrics.Timer:
  60. percentiles := metric.Percentiles([]float64{0.25, 0.75, 0.90, 0.99})
  61. resp[metricName] = map[string]interface{}{
  62. "count": metric.Count(),
  63. "min": metric.Min(),
  64. "max": metric.Max(),
  65. "mean": metric.Mean(),
  66. "std": metric.StdDev(),
  67. "p25": percentiles[0],
  68. "p75": percentiles[1],
  69. "p90": percentiles[2],
  70. "p99": percentiles[3],
  71. }
  72. }
  73. }
  74. var b []byte
  75. var err error
  76. if b, err = json.MarshalIndent(resp, "", " "); err != nil {
  77. return ApiError(500, "body json marshal", err)
  78. }
  79. return &NormalResponse{
  80. body: b,
  81. status: 200,
  82. header: http.Header{
  83. "Content-Type": []string{"application/json"},
  84. },
  85. }
  86. }
  87. // Genereates a index out of range error
  88. func GenerateError(c *middleware.Context) Response {
  89. var array []string
  90. return Json(200, array[20])
  91. }