Commit cb96c6d9 by Torkel Ödegaard

Changed setting to be an alerting setting

parent 4dab595e
...@@ -474,6 +474,10 @@ error_or_timeout = alerting ...@@ -474,6 +474,10 @@ error_or_timeout = alerting
# Default setting for how Grafana handles nodata or null values in alerting. (alerting, no_data, keep_state, ok) # Default setting for how Grafana handles nodata or null values in alerting. (alerting, no_data, keep_state, ok)
nodata_or_nullvalues = no_data nodata_or_nullvalues = no_data
# Alert notifications can include images, but rendering many images at the same time can overload the server
# This limit will protect the server from render overloading and make sure notifications are sent out quickly
concurrent_render_limit = 5
#################################### Explore ############################# #################################### Explore #############################
[explore] [explore]
# Enable the Explore section # Enable the Explore section
...@@ -550,5 +554,3 @@ container_name = ...@@ -550,5 +554,3 @@ container_name =
# Options to configure external image rendering server like https://github.com/grafana/grafana-image-renderer # Options to configure external image rendering server like https://github.com/grafana/grafana-image-renderer
server_url = server_url =
callback_url = callback_url =
concurrent_limit = 10
concurrent_limit_alerting = 5
...@@ -393,6 +393,10 @@ log_queries = ...@@ -393,6 +393,10 @@ log_queries =
# Default setting for how Grafana handles nodata or null values in alerting. (alerting, no_data, keep_state, ok) # Default setting for how Grafana handles nodata or null values in alerting. (alerting, no_data, keep_state, ok)
;nodata_or_nullvalues = no_data ;nodata_or_nullvalues = no_data
# Alert notifications can include images, but rendering many images at the same time can overload the server
# This limit will protect the server from render overloading and make sure notifications are sent out quickly
;concurrent_render_limit = 5
#################################### Explore ############################# #################################### Explore #############################
[explore] [explore]
# Enable the Explore section # Enable the Explore section
...@@ -471,5 +475,3 @@ log_queries = ...@@ -471,5 +475,3 @@ log_queries =
# Options to configure external image rendering server like https://github.com/grafana/grafana-image-renderer # Options to configure external image rendering server like https://github.com/grafana/grafana-image-renderer
;server_url = ;server_url =
;callback_url = ;callback_url =
;concurrent_limit = 10
;concurrent_limit_alerting = 5
...@@ -566,3 +566,11 @@ Default setting for new alert rules. Defaults to categorize error and timeouts a ...@@ -566,3 +566,11 @@ Default setting for new alert rules. Defaults to categorize error and timeouts a
> Available in 5.3 and above > Available in 5.3 and above
Default setting for how Grafana handles nodata or null values in alerting. (alerting, no_data, keep_state, ok) Default setting for how Grafana handles nodata or null values in alerting. (alerting, no_data, keep_state, ok)
# concurrent_render_limit
> Available in 5.3 and above
Alert notifications can include images, but rendering many images at the same time can overload the server.
This limit will protect the server from render overloading and make sure notifications are sent out quickly. Default
value is `5`.
...@@ -41,15 +41,16 @@ func (hs *HTTPServer) RenderToPng(c *m.ReqContext) { ...@@ -41,15 +41,16 @@ func (hs *HTTPServer) RenderToPng(c *m.ReqContext) {
} }
result, err := hs.RenderService.Render(c.Req.Context(), rendering.Opts{ result, err := hs.RenderService.Render(c.Req.Context(), rendering.Opts{
Width: width, Width: width,
Height: height, Height: height,
Timeout: time.Duration(timeout) * time.Second, Timeout: time.Duration(timeout) * time.Second,
OrgId: c.OrgId, OrgId: c.OrgId,
UserId: c.UserId, UserId: c.UserId,
OrgRole: c.OrgRole, OrgRole: c.OrgRole,
Path: c.Params("*") + queryParams, Path: c.Params("*") + queryParams,
Timezone: queryReader.Get("tz", ""), Timezone: queryReader.Get("tz", ""),
Encoding: queryReader.Get("encoding", ""), Encoding: queryReader.Get("encoding", ""),
ConcurrentLimit: 30,
}) })
if err != nil && err == rendering.ErrTimeout { if err != nil && err == rendering.ErrTimeout {
......
...@@ -11,6 +11,7 @@ import ( ...@@ -11,6 +11,7 @@ import (
"github.com/grafana/grafana/pkg/log" "github.com/grafana/grafana/pkg/log"
"github.com/grafana/grafana/pkg/metrics" "github.com/grafana/grafana/pkg/metrics"
"github.com/grafana/grafana/pkg/services/rendering" "github.com/grafana/grafana/pkg/services/rendering"
"github.com/grafana/grafana/pkg/setting"
m "github.com/grafana/grafana/pkg/models" m "github.com/grafana/grafana/pkg/models"
) )
...@@ -108,12 +109,12 @@ func (n *notificationService) uploadImage(context *EvalContext) (err error) { ...@@ -108,12 +109,12 @@ func (n *notificationService) uploadImage(context *EvalContext) (err error) {
} }
renderOpts := rendering.Opts{ renderOpts := rendering.Opts{
Width: 1000, Width: 1000,
Height: 500, Height: 500,
Timeout: alertTimeout / 2, Timeout: alertTimeout / 2,
OrgId: context.Rule.OrgId, OrgId: context.Rule.OrgId,
OrgRole: m.ROLE_ADMIN, OrgRole: m.ROLE_ADMIN,
IsAlert: true, ConcurrentLimit: setting.AlertingRenderLimit,
} }
ref, err := context.GetDashboardUID() ref, err := context.GetDashboardUID()
......
...@@ -13,16 +13,16 @@ var ErrNoRenderer = errors.New("No renderer plugin found nor is an external rend ...@@ -13,16 +13,16 @@ var ErrNoRenderer = errors.New("No renderer plugin found nor is an external rend
var ErrPhantomJSNotInstalled = errors.New("PhantomJS executable not found") var ErrPhantomJSNotInstalled = errors.New("PhantomJS executable not found")
type Opts struct { type Opts struct {
Width int Width int
Height int Height int
Timeout time.Duration Timeout time.Duration
OrgId int64 OrgId int64
UserId int64 UserId int64
OrgRole models.RoleType OrgRole models.RoleType
Path string Path string
Encoding string Encoding string
Timezone string Timezone string
IsAlert bool ConcurrentLimit int
} }
type RenderResult struct { type RenderResult struct {
......
...@@ -90,16 +90,8 @@ func (rs *RenderingService) Run(ctx context.Context) error { ...@@ -90,16 +90,8 @@ func (rs *RenderingService) Run(ctx context.Context) error {
return err return err
} }
func (rs *RenderingService) getLimit(isAlerting bool) int {
if isAlerting {
return rs.Cfg.RendererLimitAlerting
} else {
return rs.Cfg.RendererLimit
}
}
func (rs *RenderingService) Render(ctx context.Context, opts Opts) (*RenderResult, error) { func (rs *RenderingService) Render(ctx context.Context, opts Opts) (*RenderResult, error) {
if rs.inProgressCount > rs.getLimit(opts.IsAlert) { if rs.inProgressCount > opts.ConcurrentLimit {
return &RenderResult{ return &RenderResult{
FilePath: filepath.Join(setting.HomePath, "public/img/rendering_limit.png"), FilePath: filepath.Join(setting.HomePath, "public/img/rendering_limit.png"),
}, nil }, nil
......
...@@ -166,6 +166,7 @@ var ( ...@@ -166,6 +166,7 @@ var (
// Alerting // Alerting
AlertingEnabled bool AlertingEnabled bool
ExecuteAlerts bool ExecuteAlerts bool
AlertingRenderLimit int
AlertingErrorOrTimeout string AlertingErrorOrTimeout string
AlertingNoDataOrNullValues string AlertingNoDataOrNullValues string
...@@ -648,9 +649,6 @@ func (cfg *Cfg) Load(args *CommandLineArgs) error { ...@@ -648,9 +649,6 @@ func (cfg *Cfg) Load(args *CommandLineArgs) error {
// Rendering // Rendering
renderSec := iniFile.Section("rendering") renderSec := iniFile.Section("rendering")
cfg.RendererLimit = renderSec.Key("concurrent_limit").MustInt(10)
cfg.RendererLimitAlerting = renderSec.Key("concurrent_limit").MustInt(5)
cfg.RendererUrl = renderSec.Key("server_url").String() cfg.RendererUrl = renderSec.Key("server_url").String()
cfg.RendererCallbackUrl = renderSec.Key("callback_url").String() cfg.RendererCallbackUrl = renderSec.Key("callback_url").String()
if cfg.RendererCallbackUrl == "" { if cfg.RendererCallbackUrl == "" {
...@@ -683,6 +681,7 @@ func (cfg *Cfg) Load(args *CommandLineArgs) error { ...@@ -683,6 +681,7 @@ func (cfg *Cfg) Load(args *CommandLineArgs) error {
alerting := iniFile.Section("alerting") alerting := iniFile.Section("alerting")
AlertingEnabled = alerting.Key("enabled").MustBool(true) AlertingEnabled = alerting.Key("enabled").MustBool(true)
ExecuteAlerts = alerting.Key("execute_alerts").MustBool(true) ExecuteAlerts = alerting.Key("execute_alerts").MustBool(true)
AlertingRenderLimit = alerting.Key("concurrent_render_limit").MustInt(5)
AlertingErrorOrTimeout = alerting.Key("error_or_timeout").MustString("alerting") AlertingErrorOrTimeout = alerting.Key("error_or_timeout").MustString("alerting")
AlertingNoDataOrNullValues = alerting.Key("nodata_or_nullvalues").MustString("no_data") AlertingNoDataOrNullValues = alerting.Key("nodata_or_nullvalues").MustString("no_data")
......
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