metrics.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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/util"
  10. )
  11. func GetTestMetrics(c *middleware.Context) Response {
  12. timeRange := tsdb.NewTimeRange(c.Query("from"), c.Query("to"))
  13. req := &tsdb.Request{
  14. TimeRange: timeRange,
  15. Queries: []*tsdb.Query{
  16. {
  17. RefId: "A",
  18. MaxDataPoints: c.QueryInt64("maxDataPoints"),
  19. IntervalMs: c.QueryInt64("intervalMs"),
  20. DataSource: &tsdb.DataSourceInfo{
  21. Name: "Grafana TestDataDB",
  22. PluginId: "grafana-testdata-datasource",
  23. },
  24. },
  25. },
  26. }
  27. resp, err := tsdb.HandleRequest(req)
  28. if err != nil {
  29. return ApiError(500, "Metric request error", err)
  30. }
  31. result := dtos.MetricQueryResultDto{}
  32. for _, v := range resp.Results {
  33. if v.Error != nil {
  34. return ApiError(500, "tsdb.HandleRequest() response error", v.Error)
  35. }
  36. for _, series := range v.Series {
  37. result.Data = append(result.Data, series)
  38. }
  39. }
  40. return Json(200, &result)
  41. }
  42. func GetInternalMetrics(c *middleware.Context) Response {
  43. if metrics.UseNilMetrics {
  44. return Json(200, util.DynMap{"message": "Metrics disabled"})
  45. }
  46. snapshots := metrics.MetricStats.GetSnapshots()
  47. resp := make(map[string]interface{})
  48. for _, m := range snapshots {
  49. metricName := m.Name() + m.StringifyTags()
  50. switch metric := m.(type) {
  51. case metrics.Counter:
  52. resp[metricName] = map[string]interface{}{
  53. "count": metric.Count(),
  54. }
  55. case metrics.Timer:
  56. percentiles := metric.Percentiles([]float64{0.25, 0.75, 0.90, 0.99})
  57. resp[metricName] = map[string]interface{}{
  58. "count": metric.Count(),
  59. "min": metric.Min(),
  60. "max": metric.Max(),
  61. "mean": metric.Mean(),
  62. "std": metric.StdDev(),
  63. "p25": percentiles[0],
  64. "p75": percentiles[1],
  65. "p90": percentiles[2],
  66. "p99": percentiles[3],
  67. }
  68. }
  69. }
  70. var b []byte
  71. var err error
  72. if b, err = json.MarshalIndent(resp, "", " "); err != nil {
  73. return ApiError(500, "body json marshal", err)
  74. }
  75. return &NormalResponse{
  76. body: b,
  77. status: 200,
  78. header: http.Header{
  79. "Content-Type": []string{"application/json"},
  80. },
  81. }
  82. }
  83. // Genereates a index out of range error
  84. func GenerateError(c *middleware.Context) Response {
  85. var array []string
  86. return Json(200, array[20])
  87. }