app/vmalert: accept days, weeks and years in for: part of config like Prometheus does

Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/817
This commit is contained in:
Aliaksandr Valialkin 2020-10-08 20:12:57 +03:00
parent 561a7619a5
commit f4e8687c88
5 changed files with 38 additions and 7 deletions

View file

@ -53,7 +53,7 @@ func newAlertingRule(group *Group, cfg config.Rule) *AlertingRule {
RuleID: cfg.ID, RuleID: cfg.ID,
Name: cfg.Alert, Name: cfg.Alert,
Expr: cfg.Expr, Expr: cfg.Expr,
For: cfg.For, For: cfg.For.Duration(),
Labels: cfg.Labels, Labels: cfg.Labels,
Annotations: cfg.Annotations, Annotations: cfg.Annotations,
GroupID: group.ID(), GroupID: group.ID(),

View file

@ -94,7 +94,7 @@ type Rule struct {
Record string `yaml:"record,omitempty"` Record string `yaml:"record,omitempty"`
Alert string `yaml:"alert,omitempty"` Alert string `yaml:"alert,omitempty"`
Expr string `yaml:"expr"` Expr string `yaml:"expr"`
For time.Duration `yaml:"for,omitempty"` For PromDuration `yaml:"for,omitempty"`
Labels map[string]string `yaml:"labels,omitempty"` Labels map[string]string `yaml:"labels,omitempty"`
Annotations map[string]string `yaml:"annotations,omitempty"` Annotations map[string]string `yaml:"annotations,omitempty"`
@ -102,6 +102,37 @@ type Rule struct {
XXX map[string]interface{} `yaml:",inline"` XXX map[string]interface{} `yaml:",inline"`
} }
// PromDuration is Prometheus duration.
type PromDuration struct {
milliseconds int64
}
// NewPromDuration returns PromDuration for given d.
func NewPromDuration(d time.Duration) PromDuration {
return PromDuration{
milliseconds: d.Milliseconds(),
}
}
// UnmarshalYAML implements yaml.Unmarshaler interface.
func (pd *PromDuration) UnmarshalYAML(unmarshal func(interface{}) error) error {
var s string
if err := unmarshal(&s); err != nil {
return err
}
ms, err := metricsql.DurationValue(s, 0)
if err != nil {
return err
}
pd.milliseconds = ms
return nil
}
// Duration returns duration for pd.
func (pd *PromDuration) Duration() time.Duration {
return time.Duration(pd.milliseconds) * time.Millisecond
}
// UnmarshalYAML implements the yaml.Unmarshaler interface. // UnmarshalYAML implements the yaml.Unmarshaler interface.
func (r *Rule) UnmarshalYAML(unmarshal func(interface{}) error) error { func (r *Rule) UnmarshalYAML(unmarshal func(interface{}) error) error {
type rule Rule type rule Rule

View file

@ -270,7 +270,7 @@ func TestHashRule(t *testing.T) {
true, true,
}, },
{ {
Rule{Alert: "alert", Expr: "up == 1", For: time.Minute}, Rule{Alert: "alert", Expr: "up == 1", For: NewPromDuration(time.Minute)},
Rule{Alert: "alert", Expr: "up == 1"}, Rule{Alert: "alert", Expr: "up == 1"},
true, true,
}, },

View file

@ -665,7 +665,7 @@
/ /
sum(rate(kube_state_metrics_list_total{job="kube-state-metrics"}[5m]))) sum(rate(kube_state_metrics_list_total{job="kube-state-metrics"}[5m])))
> 0.01 > 0.01
for: 15m for: 1d
labels: labels:
severity: critical severity: critical
- alert: KubeStateMetricsWatchErrors - alert: KubeStateMetricsWatchErrors
@ -1724,4 +1724,4 @@
rate(prometheus_operator_node_address_lookup_errors_total{job="prometheus-operator",namespace="monitoring"}[5m]) > 0.1 rate(prometheus_operator_node_address_lookup_errors_total{job="prometheus-operator",namespace="monitoring"}[5m]) > 0.1
for: 10m for: 10m
labels: labels:
severity: warning severity: warning

View file

@ -32,7 +32,7 @@ func TestUpdateWith(t *testing.T) {
[]config.Rule{{ []config.Rule{{
Alert: "foo", Alert: "foo",
Expr: "up > 0", Expr: "up > 0",
For: time.Second, For: config.NewPromDuration(time.Second),
Labels: map[string]string{ Labels: map[string]string{
"bar": "baz", "bar": "baz",
}, },
@ -44,7 +44,7 @@ func TestUpdateWith(t *testing.T) {
[]config.Rule{{ []config.Rule{{
Alert: "foo", Alert: "foo",
Expr: "up > 10", Expr: "up > 10",
For: time.Second, For: config.NewPromDuration(time.Second),
Labels: map[string]string{ Labels: map[string]string{
"baz": "bar", "baz": "bar",
}, },