render.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package api
  2. import (
  3. "fmt"
  4. "net/http"
  5. "runtime"
  6. "strconv"
  7. "strings"
  8. "time"
  9. m "github.com/grafana/grafana/pkg/models"
  10. "github.com/grafana/grafana/pkg/services/rendering"
  11. "github.com/grafana/grafana/pkg/util"
  12. )
  13. func (hs *HTTPServer) RenderToPng(c *m.ReqContext) {
  14. queryReader, err := util.NewUrlQueryReader(c.Req.URL)
  15. if err != nil {
  16. c.Handle(400, "Render parameters error", err)
  17. return
  18. }
  19. queryParams := fmt.Sprintf("?%s", c.Req.URL.RawQuery)
  20. width, err := strconv.Atoi(queryReader.Get("width", "800"))
  21. if err != nil {
  22. c.Handle(400, "Render parameters error", fmt.Errorf("Cannot parse width as int: %s", err))
  23. return
  24. }
  25. height, err := strconv.Atoi(queryReader.Get("height", "400"))
  26. if err != nil {
  27. c.Handle(400, "Render parameters error", fmt.Errorf("Cannot parse height as int: %s", err))
  28. return
  29. }
  30. timeout, err := strconv.Atoi(queryReader.Get("timeout", "60"))
  31. if err != nil {
  32. c.Handle(400, "Render parameters error", fmt.Errorf("Cannot parse timeout as int: %s", err))
  33. return
  34. }
  35. result, err := hs.RenderService.Render(c.Req.Context(), rendering.Opts{
  36. Width: width,
  37. Height: height,
  38. Timeout: time.Duration(timeout) * time.Second,
  39. OrgId: c.OrgId,
  40. UserId: c.UserId,
  41. OrgRole: c.OrgRole,
  42. Path: c.Params("*") + queryParams,
  43. Timezone: queryReader.Get("tz", ""),
  44. Encoding: queryReader.Get("encoding", ""),
  45. ConcurrentLimit: 30,
  46. })
  47. if err != nil && err == rendering.ErrTimeout {
  48. c.Handle(500, err.Error(), err)
  49. return
  50. }
  51. if err != nil && err == rendering.ErrPhantomJSNotInstalled {
  52. if strings.HasPrefix(runtime.GOARCH, "arm") {
  53. c.Handle(500, "Rendering failed - PhantomJS isn't included in arm build per default", err)
  54. } else {
  55. c.Handle(500, "Rendering failed - PhantomJS isn't installed correctly", err)
  56. }
  57. return
  58. }
  59. if err != nil {
  60. c.Handle(500, "Rendering failed.", err)
  61. return
  62. }
  63. c.Resp.Header().Set("Content-Type", "image/png")
  64. http.ServeFile(c.Resp, c.Req.Request, result.FilePath)
  65. }