metrics.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package api
  2. import (
  3. "encoding/json"
  4. "math/rand"
  5. "net/http"
  6. "strconv"
  7. "github.com/grafana/grafana/pkg/api/dtos"
  8. "github.com/grafana/grafana/pkg/metrics"
  9. "github.com/grafana/grafana/pkg/middleware"
  10. "github.com/grafana/grafana/pkg/util"
  11. )
  12. func GetTestMetrics(c *middleware.Context) {
  13. from := c.QueryInt64("from")
  14. to := c.QueryInt64("to")
  15. maxDataPoints := c.QueryInt64("maxDataPoints")
  16. stepInSeconds := (to - from) / maxDataPoints
  17. result := dtos.MetricQueryResultDto{}
  18. result.Data = make([]dtos.MetricQueryResultDataDto, 1)
  19. for seriesIndex := range result.Data {
  20. points := make([][2]float64, maxDataPoints)
  21. walker := rand.Float64() * 100
  22. time := from
  23. for i := range points {
  24. points[i][0] = walker
  25. points[i][1] = float64(time)
  26. walker += rand.Float64() - 0.5
  27. time += stepInSeconds
  28. }
  29. result.Data[seriesIndex].Target = "test-series-" + strconv.Itoa(seriesIndex)
  30. result.Data[seriesIndex].DataPoints = points
  31. }
  32. c.JSON(200, &result)
  33. }
  34. func GetInternalMetrics(c *middleware.Context) Response {
  35. if metrics.UseNilMetrics {
  36. return Json(200, util.DynMap{"message": "Metrics disabled"})
  37. }
  38. snapshots := metrics.MetricStats.GetSnapshots()
  39. resp := make(map[string]interface{})
  40. for _, m := range snapshots {
  41. metricName := m.Name() + m.StringifyTags()
  42. switch metric := m.(type) {
  43. case metrics.Counter:
  44. resp[metricName] = map[string]interface{}{
  45. "count": metric.Count(),
  46. }
  47. case metrics.Timer:
  48. percentiles := metric.Percentiles([]float64{0.25, 0.75, 0.90, 0.99})
  49. resp[metricName] = map[string]interface{}{
  50. "count": metric.Count(),
  51. "min": metric.Min(),
  52. "max": metric.Max(),
  53. "mean": metric.Mean(),
  54. "std": metric.StdDev(),
  55. "p25": percentiles[0],
  56. "p75": percentiles[1],
  57. "p90": percentiles[2],
  58. "p99": percentiles[3],
  59. }
  60. }
  61. }
  62. var b []byte
  63. var err error
  64. if b, err = json.MarshalIndent(resp, "", " "); err != nil {
  65. return ApiError(500, "body json marshal", err)
  66. }
  67. return &NormalResponse{
  68. body: b,
  69. status: 200,
  70. header: http.Header{
  71. "Content-Type": []string{"application/json"},
  72. },
  73. }
  74. }