feat: support printing threshold in alert summary and description (#1827)

This commit is contained in:
Amol Umbark 2023-02-10 23:53:45 +05:30 committed by GitHub
parent b67206dd65
commit 8ab527b174
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 38 additions and 25 deletions

View File

@ -6,6 +6,16 @@ import {
defaultMatchType, defaultMatchType,
} from 'types/api/alerts/def'; } from 'types/api/alerts/def';
const defaultAlertDescription =
'This alert is fired when the defined metric (current value: {{$value}}) crosses the threshold ({{$threshold}})';
const defaultAlertSummary =
'The rule threshold is set to {{$threshold}}, and the observed metric value is {{$value}}';
const defaultAnnotations = {
description: defaultAlertDescription,
summary: defaultAlertSummary,
};
export const alertDefaults: AlertDef = { export const alertDefaults: AlertDef = {
alertType: AlertTypes.METRICS_BASED_ALERT, alertType: AlertTypes.METRICS_BASED_ALERT,
condition: { condition: {
@ -38,9 +48,7 @@ export const alertDefaults: AlertDef = {
labels: { labels: {
severity: 'warning', severity: 'warning',
}, },
annotations: { annotations: defaultAnnotations,
description: 'A new alert',
},
evalWindow: defaultEvalWindow, evalWindow: defaultEvalWindow,
}; };
@ -85,9 +93,7 @@ export const logAlertDefaults: AlertDef = {
severity: 'warning', severity: 'warning',
details: `${window.location.protocol}//${window.location.host}/logs`, details: `${window.location.protocol}//${window.location.host}/logs`,
}, },
annotations: { annotations: defaultAnnotations,
description: 'A new log-based alert',
},
evalWindow: defaultEvalWindow, evalWindow: defaultEvalWindow,
}; };
@ -132,9 +138,7 @@ export const traceAlertDefaults: AlertDef = {
severity: 'warning', severity: 'warning',
details: `${window.location.protocol}//${window.location.host}/traces`, details: `${window.location.protocol}//${window.location.host}/traces`,
}, },
annotations: { annotations: defaultAnnotations,
description: 'A new trace-based alert',
},
evalWindow: defaultEvalWindow, evalWindow: defaultEvalWindow,
}; };
@ -179,8 +183,6 @@ export const exceptionAlertDefaults: AlertDef = {
severity: 'warning', severity: 'warning',
details: `${window.location.protocol}//${window.location.host}/exceptions`, details: `${window.location.protocol}//${window.location.host}/exceptions`,
}, },
annotations: { annotations: defaultAnnotations,
description: 'A new exceptions-based alert',
},
evalWindow: defaultEvalWindow, evalWindow: defaultEvalWindow,
}; };

View File

@ -197,8 +197,8 @@ func testTemplateParsing(rl *PostableRule) (errs []error) {
} }
// Trying to parse templates. // Trying to parse templates.
tmplData := AlertTemplateData(make(map[string]string), 0) tmplData := AlertTemplateData(make(map[string]string), 0, 0)
defs := "{{$labels := .Labels}}{{$value := .Value}}" defs := "{{$labels := .Labels}}{{$value := .Value}}{{$threshold := .Threshold}}"
parseTest := func(text string) error { parseTest := func(text string) error {
tmpl := NewTemplateExpander( tmpl := NewTemplateExpander(
context.TODO(), context.TODO(),

View File

@ -108,6 +108,14 @@ func (r *PromRule) Condition() *RuleCondition {
return r.ruleCondition return r.ruleCondition
} }
func (r *PromRule) targetVal() float64 {
if r.ruleCondition == nil || r.ruleCondition.Target == nil {
return 0
}
return *r.ruleCondition.Target
}
func (r *PromRule) Type() RuleType { func (r *PromRule) Type() RuleType {
return RuleTypeProm return RuleTypeProm
} }
@ -327,10 +335,10 @@ func (r *PromRule) Eval(ctx context.Context, ts time.Time, queriers *Queriers) (
l[lbl.Name] = lbl.Value l[lbl.Name] = lbl.Value
} }
tmplData := AlertTemplateData(l, smpl.V) tmplData := AlertTemplateData(l, smpl.V, r.targetVal())
// Inject some convenience variables that are easier to remember for users // Inject some convenience variables that are easier to remember for users
// who are not used to Go's templating system. // who are not used to Go's templating system.
defs := "{{$labels := .Labels}}{{$value := .Value}}" defs := "{{$labels := .Labels}}{{$value := .Value}}{{$threshold := .Threshold}}"
expand := func(text string) string { expand := func(text string) string {

View File

@ -21,8 +21,9 @@ import (
// related to go templating in rule labels and annotations // related to go templating in rule labels and annotations
type tmplQueryRecord struct { type tmplQueryRecord struct {
Labels map[string]string Labels map[string]string
Value float64 Value float64
Threshold float64
} }
type tmplQueryResults []*tmplQueryRecord type tmplQueryResults []*tmplQueryRecord
@ -200,13 +201,15 @@ func NewTemplateExpander(
} }
// AlertTemplateData returns the interface to be used in expanding the template. // AlertTemplateData returns the interface to be used in expanding the template.
func AlertTemplateData(labels map[string]string, value float64) interface{} { func AlertTemplateData(labels map[string]string, value float64, threshold float64) interface{} {
return struct { return struct {
Labels map[string]string Labels map[string]string
Value float64 Value float64
Threshold float64
}{ }{
Labels: labels, Labels: labels,
Value: value, Value: value,
Threshold: threshold,
} }
} }

View File

@ -673,10 +673,10 @@ func (r *ThresholdRule) Eval(ctx context.Context, ts time.Time, queriers *Querie
l[lbl.Name] = lbl.Value l[lbl.Name] = lbl.Value
} }
tmplData := AlertTemplateData(l, smpl.V) tmplData := AlertTemplateData(l, smpl.V, r.targetVal())
// Inject some convenience variables that are easier to remember for users // Inject some convenience variables that are easier to remember for users
// who are not used to Go's templating system. // who are not used to Go's templating system.
defs := "{{$labels := .Labels}}{{$value := .Value}}" defs := "{{$labels := .Labels}}{{$value := .Value}}{{$threshold := .Threshold}}"
// utility function to apply go template on labels and annots // utility function to apply go template on labels and annots
expand := func(text string) string { expand := func(text string) string {