Commit 7a8c6a9b by Jon Gyllenswärd Committed by GitHub

Reporting: Handle timeouts in rendering (#20415)

* Added timeout in grpc call to plugins for rendering
parent e7e416cf
......@@ -40,6 +40,7 @@ func (hs *HTTPServer) RenderToPng(c *m.ReqContext) {
return
}
maxConcurrentLimitForApiCalls := 30
result, err := hs.RenderService.Render(c.Req.Context(), rendering.Opts{
Width: width,
Height: height,
......@@ -50,7 +51,7 @@ func (hs *HTTPServer) RenderToPng(c *m.ReqContext) {
Path: c.Params("*") + queryParams,
Timezone: queryReader.Get("tz", ""),
Encoding: queryReader.Get("encoding", ""),
ConcurrentLimit: 30,
ConcurrentLimit: maxConcurrentLimitForApiCalls,
})
if err != nil && err == rendering.ErrTimeout {
......
......@@ -26,11 +26,13 @@ type Opts struct {
}
type RenderResult struct {
FilePath string
FilePath string
KeepFileAfterRender bool
}
type renderFunc func(ctx context.Context, options Opts) (*RenderResult, error)
type Service interface {
Render(ctx context.Context, opts Opts) (*RenderResult, error)
RenderErrorImage(error error) (*RenderResult, error)
}
......@@ -63,6 +63,9 @@ func (rs *RenderingService) renderViaPlugin(ctx context.Context, opts Opts) (*Re
return nil, err
}
ctx, cancel := context.WithTimeout(ctx, opts.Timeout)
defer cancel()
rsp, err := rs.grpcPlugin.Render(ctx, &pluginModel.RenderRequest{
Url: rs.getURL(opts.Path),
Width: int32(opts.Width),
......
......@@ -3,12 +3,11 @@ package rendering
import (
"context"
"fmt"
plugin "github.com/hashicorp/go-plugin"
"net/url"
"os"
"path/filepath"
plugin "github.com/hashicorp/go-plugin"
pluginModel "github.com/grafana/grafana-plugin-model/go/renderer"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/middleware"
......@@ -93,10 +92,20 @@ func (rs *RenderingService) Run(ctx context.Context) error {
return err
}
func (rs *RenderingService) RenderErrorImage(err error) (*RenderResult, error) {
imgUrl := "public/img/rendering_error.png"
return &RenderResult{
FilePath: filepath.Join(setting.HomePath, imgUrl),
KeepFileAfterRender: true,
}, nil
}
func (rs *RenderingService) Render(ctx context.Context, opts Opts) (*RenderResult, error) {
if rs.inProgressCount > opts.ConcurrentLimit {
return &RenderResult{
FilePath: filepath.Join(setting.HomePath, "public/img/rendering_limit.png"),
FilePath: filepath.Join(setting.HomePath, "public/img/rendering_limit.png"),
KeepFileAfterRender: true,
}, nil
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment