metrics.go 1.9 KB

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