dashboard_snapshot.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package api
  2. import (
  3. "strconv"
  4. "time"
  5. "github.com/grafana/grafana/pkg/api/dtos"
  6. "github.com/grafana/grafana/pkg/bus"
  7. "github.com/grafana/grafana/pkg/metrics"
  8. "github.com/grafana/grafana/pkg/middleware"
  9. m "github.com/grafana/grafana/pkg/models"
  10. "github.com/grafana/grafana/pkg/setting"
  11. "github.com/grafana/grafana/pkg/util"
  12. )
  13. func CreateDashboardSnapshot(c *middleware.Context, cmd m.CreateDashboardSnapshotCommand) {
  14. cmd.Key = util.GetRandomString(32)
  15. if cmd.External {
  16. cmd.OrgId = -1
  17. metrics.M_Api_Dashboard_Snapshot_External.Inc(1)
  18. } else {
  19. cmd.OrgId = c.OrgId
  20. metrics.M_Api_Dashboard_Snapshot_Create.Inc(1)
  21. }
  22. if err := bus.Dispatch(&cmd); err != nil {
  23. c.JsonApiErr(500, "Failed to create snaphost", err)
  24. return
  25. }
  26. c.JSON(200, util.DynMap{"key": cmd.Key, "url": setting.ToAbsUrl("dashboard/snapshot/" + cmd.Key)})
  27. }
  28. func GetDashboardSnapshot(c *middleware.Context) {
  29. key := c.Params(":key")
  30. query := &m.GetDashboardSnapshotQuery{Key: key}
  31. err := bus.Dispatch(query)
  32. if err != nil {
  33. c.JsonApiErr(500, "Failed to get dashboard snapshot", err)
  34. return
  35. }
  36. snapshot := query.Result
  37. // expired snapshots should also be removed from db
  38. if snapshot.Expires.Before(time.Now()) {
  39. c.JsonApiErr(404, "Snapshot not found", err)
  40. return
  41. }
  42. dto := dtos.Dashboard{
  43. Model: snapshot.Dashboard,
  44. Meta: dtos.DashboardMeta{IsSnapshot: true},
  45. }
  46. metrics.M_Api_Dashboard_Snapshot_Get.Inc(1)
  47. maxAge := int64(snapshot.Expires.Sub(time.Now()).Seconds())
  48. c.Resp.Header().Set("Cache-Control", "public, max-age="+strconv.FormatInt(maxAge, 10))
  49. c.JSON(200, dto)
  50. }