Rendering: Add support for rate limiter (#103987)
* Rendering: Add support for rate limiter * remove unnecessary golint exception * add lint exception back
This commit is contained in:
@@ -98,6 +98,11 @@ func (hs *HTTPServer) RenderHandler(c *contextmodel.ReqContext) {
|
||||
Theme: themeModel,
|
||||
}, nil)
|
||||
if err != nil {
|
||||
if errors.Is(err, rendering.ErrTooManyRequests) {
|
||||
c.JsonApiErr(http.StatusTooManyRequests, "Too many rendering requests", err)
|
||||
return
|
||||
}
|
||||
|
||||
if errors.Is(err, rendering.ErrTimeout) {
|
||||
c.Handle(hs.Cfg, http.StatusInternalServerError, err.Error(), err)
|
||||
return
|
||||
|
||||
@@ -31,6 +31,7 @@ var netClient = &http.Client{
|
||||
}
|
||||
|
||||
const authTokenHeader = "X-Auth-Token" //#nosec G101 -- This is a false positive
|
||||
const rateLimiterHeader = "X-Tenant-ID"
|
||||
|
||||
var (
|
||||
remoteVersionFetchInterval time.Duration = time.Second * 15
|
||||
@@ -160,6 +161,7 @@ func (rs *RenderingService) doRequest(ctx context.Context, u *url.URL, headers m
|
||||
}
|
||||
|
||||
req.Header.Set(authTokenHeader, rs.Cfg.RendererAuthToken)
|
||||
req.Header.Set(rateLimiterHeader, rs.domain)
|
||||
req.Header.Set("User-Agent", fmt.Sprintf("Grafana/%s", rs.Cfg.BuildVersion))
|
||||
for k, v := range headers {
|
||||
req.Header[k] = v
|
||||
@@ -180,6 +182,10 @@ func (rs *RenderingService) doRequest(ctx context.Context, u *url.URL, headers m
|
||||
return nil, fmt.Errorf("failed to send request to remote rendering service: %w", err)
|
||||
}
|
||||
|
||||
if resp.StatusCode == http.StatusTooManyRequests {
|
||||
return nil, ErrTooManyRequests
|
||||
}
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ var ErrTimeout = errors.New("timeout error - you can set timeout in seconds with
|
||||
var ErrConcurrentLimitReached = errors.New("rendering concurrent limit reached")
|
||||
var ErrRenderUnavailable = errors.New("rendering plugin not available")
|
||||
var ErrServerTimeout = errutil.NewBase(errutil.StatusUnknown, "rendering.serverTimeout", errutil.WithPublicMessage("error trying to connect to image-renderer service"))
|
||||
var ErrTooManyRequests = errutil.NewBase(errutil.StatusTooManyRequests, "rendering.tooManyRequests", errutil.WithPublicMessage("trying to send too many requests to image-renderer service"))
|
||||
|
||||
type RenderType string
|
||||
|
||||
|
||||
Reference in New Issue
Block a user