mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Alerting: support mute timings configuration through the api for the embedded alertmanager (#41533)
* Alerting: accept mute_timing_intervals through the api for the embedded alertmanager * add workaround for mutetimeinterval * add mute timings to routes * revert changes * Update pkg/services/ngalert/api/api_alertmanager.go * Update pkg/services/ngalert/api/api_alertmanager.go * Update pkg/services/ngalert/api/api_alertmanager.go * update prometheus/alertmanager dependency * add some var docs
This commit is contained in:
parent
e7ec219291
commit
b9cdad3814
4
go.mod
4
go.mod
@ -81,7 +81,7 @@ require (
|
|||||||
github.com/patrickmn/go-cache v2.1.0+incompatible
|
github.com/patrickmn/go-cache v2.1.0+incompatible
|
||||||
github.com/pkg/browser v0.0.0-20210904010418-6d279e18f982 // indirect
|
github.com/pkg/browser v0.0.0-20210904010418-6d279e18f982 // indirect
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/prometheus/alertmanager v0.23.1-0.20211021072955-1b8afe7cb5aa
|
github.com/prometheus/alertmanager v0.23.1-0.20211116083607-e2a10119aaf7
|
||||||
github.com/prometheus/client_golang v1.11.0
|
github.com/prometheus/client_golang v1.11.0
|
||||||
github.com/prometheus/client_model v0.2.0
|
github.com/prometheus/client_model v0.2.0
|
||||||
github.com/prometheus/common v0.32.1
|
github.com/prometheus/common v0.32.1
|
||||||
@ -225,7 +225,7 @@ require (
|
|||||||
github.com/opentracing-contrib/go-stdlib v1.0.0 // indirect
|
github.com/opentracing-contrib/go-stdlib v1.0.0 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
github.com/prometheus/common/sigv4 v0.1.0 // indirect
|
github.com/prometheus/common/sigv4 v0.1.0 // indirect
|
||||||
github.com/prometheus/exporter-toolkit v0.6.1 // indirect
|
github.com/prometheus/exporter-toolkit v0.7.0 // indirect
|
||||||
github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289 // indirect
|
github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289 // indirect
|
||||||
github.com/prometheus/procfs v0.6.0 // indirect
|
github.com/prometheus/procfs v0.6.0 // indirect
|
||||||
github.com/protocolbuffers/txtpbfmt v0.0.0-20201118171849-f6a6b3f636fc // indirect
|
github.com/protocolbuffers/txtpbfmt v0.0.0-20201118171849-f6a6b3f636fc // indirect
|
||||||
|
4
go.sum
4
go.sum
@ -1969,6 +1969,8 @@ github.com/prometheus/alertmanager v0.23.0/go.mod h1:0MLTrjQI8EuVmvykEhcfr/7X0xm
|
|||||||
github.com/prometheus/alertmanager v0.23.1-0.20210914172521-e35efbddb66a/go.mod h1:U7pGu+z7A9ZKhK8lq1MvIOp5GdVlZjwOYk+S0h3LSbA=
|
github.com/prometheus/alertmanager v0.23.1-0.20210914172521-e35efbddb66a/go.mod h1:U7pGu+z7A9ZKhK8lq1MvIOp5GdVlZjwOYk+S0h3LSbA=
|
||||||
github.com/prometheus/alertmanager v0.23.1-0.20211021072955-1b8afe7cb5aa h1:KKgVswVOfDYOn9GNtO7bR3r4vyM77WXuJsyGxMl1Zgs=
|
github.com/prometheus/alertmanager v0.23.1-0.20211021072955-1b8afe7cb5aa h1:KKgVswVOfDYOn9GNtO7bR3r4vyM77WXuJsyGxMl1Zgs=
|
||||||
github.com/prometheus/alertmanager v0.23.1-0.20211021072955-1b8afe7cb5aa/go.mod h1:pRqzxS2B4tciJfx2JUvR67udJrQeSUZ603OQQFFUrIQ=
|
github.com/prometheus/alertmanager v0.23.1-0.20211021072955-1b8afe7cb5aa/go.mod h1:pRqzxS2B4tciJfx2JUvR67udJrQeSUZ603OQQFFUrIQ=
|
||||||
|
github.com/prometheus/alertmanager v0.23.1-0.20211116083607-e2a10119aaf7 h1:OMwDo53awRp+UzaBrwmVC7HJiAMYP/niBJfKcGpPiac=
|
||||||
|
github.com/prometheus/alertmanager v0.23.1-0.20211116083607-e2a10119aaf7/go.mod h1:1UH4XA4DAXzsvofKVzcXmC0mqt6Y8BZP9JcQWKDmbFc=
|
||||||
github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
@ -2032,6 +2034,8 @@ github.com/prometheus/exporter-toolkit v0.5.0/go.mod h1:OCkM4805mmisBhLmVFw858QY
|
|||||||
github.com/prometheus/exporter-toolkit v0.5.1/go.mod h1:OCkM4805mmisBhLmVFw858QYi3v0wKdY6/UxrT0pZVg=
|
github.com/prometheus/exporter-toolkit v0.5.1/go.mod h1:OCkM4805mmisBhLmVFw858QYi3v0wKdY6/UxrT0pZVg=
|
||||||
github.com/prometheus/exporter-toolkit v0.6.1 h1:Aqk75wQD92N9CqmTlZwjKwq6272nOGrWIbc8Z7+xQO0=
|
github.com/prometheus/exporter-toolkit v0.6.1 h1:Aqk75wQD92N9CqmTlZwjKwq6272nOGrWIbc8Z7+xQO0=
|
||||||
github.com/prometheus/exporter-toolkit v0.6.1/go.mod h1:ZUBIj498ePooX9t/2xtDjeQYwvRpiPP2lh5u4iblj2g=
|
github.com/prometheus/exporter-toolkit v0.6.1/go.mod h1:ZUBIj498ePooX9t/2xtDjeQYwvRpiPP2lh5u4iblj2g=
|
||||||
|
github.com/prometheus/exporter-toolkit v0.7.0 h1:XtYeVeeC5daG4txbc9+mieKq+/AK4gtIBLl9Mulrjnk=
|
||||||
|
github.com/prometheus/exporter-toolkit v0.7.0/go.mod h1:ZUBIj498ePooX9t/2xtDjeQYwvRpiPP2lh5u4iblj2g=
|
||||||
github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289 h1:dTUS1vaLWq+Y6XKOTnrFpoVsQKLCbCp1OLj24TDi7oM=
|
github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289 h1:dTUS1vaLWq+Y6XKOTnrFpoVsQKLCbCp1OLj24TDi7oM=
|
||||||
github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc=
|
github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc=
|
||||||
github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
|
@ -587,10 +587,11 @@ func (c *GettableApiAlertingConfig) validate() error {
|
|||||||
|
|
||||||
// Config is the top-level configuration for Alertmanager's config files.
|
// Config is the top-level configuration for Alertmanager's config files.
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Global *config.GlobalConfig `yaml:"global,omitempty" json:"global,omitempty"`
|
Global *config.GlobalConfig `yaml:"global,omitempty" json:"global,omitempty"`
|
||||||
Route *Route `yaml:"route,omitempty" json:"route,omitempty"`
|
Route *Route `yaml:"route,omitempty" json:"route,omitempty"`
|
||||||
InhibitRules []*config.InhibitRule `yaml:"inhibit_rules,omitempty" json:"inhibit_rules,omitempty"`
|
InhibitRules []*config.InhibitRule `yaml:"inhibit_rules,omitempty" json:"inhibit_rules,omitempty"`
|
||||||
Templates []string `yaml:"templates" json:"templates"`
|
MuteTimeIntervals []config.MuteTimeInterval `yaml:"mute_time_intervals,omitempty" json:"mute_time_intervals,omitempty"`
|
||||||
|
Templates []string `yaml:"templates" json:"templates"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// A Route is a node that contains definitions of how to handle alerts. This is modified
|
// A Route is a node that contains definitions of how to handle alerts. This is modified
|
||||||
|
@ -3,6 +3,19 @@
|
|||||||
"foo": "bar"
|
"foo": "bar"
|
||||||
},
|
},
|
||||||
"alertmanager_config": {
|
"alertmanager_config": {
|
||||||
|
"mute_time_intervals": [
|
||||||
|
{
|
||||||
|
"name": "foo",
|
||||||
|
"time_intervals": [
|
||||||
|
{
|
||||||
|
"years": [
|
||||||
|
"2020:2022",
|
||||||
|
"2030"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"receivers": [
|
"receivers": [
|
||||||
{
|
{
|
||||||
"email_configs": [
|
"email_configs": [
|
||||||
|
@ -1,6 +1,12 @@
|
|||||||
template_files:
|
template_files:
|
||||||
foo: bar
|
foo: bar
|
||||||
alertmanager_config: |
|
alertmanager_config: |
|
||||||
|
mute_time_intervals:
|
||||||
|
- name: foo
|
||||||
|
time_intervals:
|
||||||
|
- years:
|
||||||
|
- 2020:2022
|
||||||
|
- "2030"
|
||||||
receivers:
|
receivers:
|
||||||
- email_configs:
|
- email_configs:
|
||||||
- auth_password: shh
|
- auth_password: shh
|
||||||
|
@ -18,6 +18,7 @@ import (
|
|||||||
gokit_log "github.com/go-kit/kit/log"
|
gokit_log "github.com/go-kit/kit/log"
|
||||||
amv2 "github.com/prometheus/alertmanager/api/v2/models"
|
amv2 "github.com/prometheus/alertmanager/api/v2/models"
|
||||||
"github.com/prometheus/alertmanager/cluster"
|
"github.com/prometheus/alertmanager/cluster"
|
||||||
|
"github.com/prometheus/alertmanager/config"
|
||||||
"github.com/prometheus/alertmanager/dispatch"
|
"github.com/prometheus/alertmanager/dispatch"
|
||||||
"github.com/prometheus/alertmanager/inhibit"
|
"github.com/prometheus/alertmanager/inhibit"
|
||||||
"github.com/prometheus/alertmanager/nflog"
|
"github.com/prometheus/alertmanager/nflog"
|
||||||
@ -26,6 +27,7 @@ import (
|
|||||||
"github.com/prometheus/alertmanager/provider/mem"
|
"github.com/prometheus/alertmanager/provider/mem"
|
||||||
"github.com/prometheus/alertmanager/silence"
|
"github.com/prometheus/alertmanager/silence"
|
||||||
"github.com/prometheus/alertmanager/template"
|
"github.com/prometheus/alertmanager/template"
|
||||||
|
"github.com/prometheus/alertmanager/timeinterval"
|
||||||
"github.com/prometheus/alertmanager/types"
|
"github.com/prometheus/alertmanager/types"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/common/model"
|
"github.com/prometheus/common/model"
|
||||||
@ -110,6 +112,10 @@ type Alertmanager struct {
|
|||||||
silencer *silence.Silencer
|
silencer *silence.Silencer
|
||||||
silences *silence.Silences
|
silences *silence.Silences
|
||||||
|
|
||||||
|
// muteTimes is a map where the key is the name of the mute_time_interval
|
||||||
|
// and the value represents all configured time_interval(s)
|
||||||
|
muteTimes map[string][]timeinterval.TimeInterval
|
||||||
|
|
||||||
stageMetrics *notify.Metrics
|
stageMetrics *notify.Metrics
|
||||||
dispatcherMetrics *dispatch.DispatcherMetrics
|
dispatcherMetrics *dispatch.DispatcherMetrics
|
||||||
|
|
||||||
@ -329,6 +335,14 @@ func (am *Alertmanager) templateFromPaths(paths ...string) (*template.Template,
|
|||||||
return tmpl, nil
|
return tmpl, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (am *Alertmanager) buildMuteTimesMap(muteTimeIntervals []config.MuteTimeInterval) map[string][]timeinterval.TimeInterval {
|
||||||
|
muteTimes := make(map[string][]timeinterval.TimeInterval, len(muteTimeIntervals))
|
||||||
|
for _, ti := range muteTimeIntervals {
|
||||||
|
muteTimes[ti.Name] = ti.TimeIntervals
|
||||||
|
}
|
||||||
|
return muteTimes
|
||||||
|
}
|
||||||
|
|
||||||
// applyConfig applies a new configuration by re-initializing all components using the configuration provided.
|
// applyConfig applies a new configuration by re-initializing all components using the configuration provided.
|
||||||
// It is not safe to call concurrently.
|
// It is not safe to call concurrently.
|
||||||
func (am *Alertmanager) applyConfig(cfg *apimodels.PostableUserConfig, rawConfig []byte) (err error) {
|
func (am *Alertmanager) applyConfig(cfg *apimodels.PostableUserConfig, rawConfig []byte) (err error) {
|
||||||
@ -375,6 +389,7 @@ func (am *Alertmanager) applyConfig(cfg *apimodels.PostableUserConfig, rawConfig
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to build integration map: %w", err)
|
return fmt.Errorf("failed to build integration map: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now, let's put together our notification pipeline
|
// Now, let's put together our notification pipeline
|
||||||
routingStage := make(notify.RoutingStage, len(integrationsMap))
|
routingStage := make(notify.RoutingStage, len(integrationsMap))
|
||||||
|
|
||||||
@ -386,14 +401,16 @@ func (am *Alertmanager) applyConfig(cfg *apimodels.PostableUserConfig, rawConfig
|
|||||||
}
|
}
|
||||||
|
|
||||||
am.inhibitor = inhibit.NewInhibitor(am.alerts, cfg.AlertmanagerConfig.InhibitRules, am.marker, am.gokitLogger)
|
am.inhibitor = inhibit.NewInhibitor(am.alerts, cfg.AlertmanagerConfig.InhibitRules, am.marker, am.gokitLogger)
|
||||||
|
am.muteTimes = am.buildMuteTimesMap(cfg.AlertmanagerConfig.MuteTimeIntervals)
|
||||||
am.silencer = silence.NewSilencer(am.silences, am.marker, am.gokitLogger)
|
am.silencer = silence.NewSilencer(am.silences, am.marker, am.gokitLogger)
|
||||||
|
|
||||||
meshStage := notify.NewGossipSettleStage(am.peer)
|
meshStage := notify.NewGossipSettleStage(am.peer)
|
||||||
inhibitionStage := notify.NewMuteStage(am.inhibitor)
|
inhibitionStage := notify.NewMuteStage(am.inhibitor)
|
||||||
|
timeMuteStage := notify.NewTimeMuteStage(am.muteTimes)
|
||||||
silencingStage := notify.NewMuteStage(am.silencer)
|
silencingStage := notify.NewMuteStage(am.silencer)
|
||||||
for name := range integrationsMap {
|
for name := range integrationsMap {
|
||||||
stage := am.createReceiverStage(name, integrationsMap[name], am.waitFunc, am.notificationLog)
|
stage := am.createReceiverStage(name, integrationsMap[name], am.waitFunc, am.notificationLog)
|
||||||
routingStage[name] = notify.MultiStage{meshStage, silencingStage, inhibitionStage, stage}
|
routingStage[name] = notify.MultiStage{meshStage, silencingStage, timeMuteStage, inhibitionStage, stage}
|
||||||
}
|
}
|
||||||
|
|
||||||
am.route = dispatch.NewRoute(cfg.AlertmanagerConfig.Route.AsAMRoute(), nil)
|
am.route = dispatch.NewRoute(cfg.AlertmanagerConfig.Route.AsAMRoute(), nil)
|
||||||
|
@ -78,6 +78,7 @@ func NewMultiOrgAlertmanager(cfg *setting.Cfg, configStore store.AlertingStore,
|
|||||||
cluster.DefaultProbeTimeout,
|
cluster.DefaultProbeTimeout,
|
||||||
cluster.DefaultProbeInterval,
|
cluster.DefaultProbeInterval,
|
||||||
nil,
|
nil,
|
||||||
|
true,
|
||||||
)
|
)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user