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:
Agnès Toulet
2025-04-24 15:31:19 +02:00
committed by GitHub
parent f0c841b9bc
commit e7b800f35a
3 changed files with 12 additions and 0 deletions
+5
View File
@@ -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
+6
View File
@@ -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
}
+1
View File
@@ -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