2021-09-16 22:33:51 +08:00
package setting
import (
"strings"
"time"
2021-09-21 19:08:52 +08:00
"github.com/grafana/grafana-plugin-sdk-go/backend/gtime"
2021-09-16 22:33:51 +08:00
"github.com/prometheus/alertmanager/cluster"
"gopkg.in/ini.v1"
)
const (
2021-09-28 18:00:16 +08:00
alertmanagerDefaultClusterAddr = "0.0.0.0:9094"
alertmanagerDefaultPeerTimeout = 15 * time . Second
alertmanagerDefaultGossipInterval = cluster . DefaultGossipInterval
alertmanagerDefaultPushPullInterval = cluster . DefaultPushPullInterval
alertmanagerDefaultConfigPollInterval = 60 * time . Second
2021-09-24 01:52:20 +08:00
// To start, the alertmanager needs at least one route defined.
// TODO: we should move this to Grafana settings and define this as the default.
2021-09-28 18:00:16 +08:00
alertmanagerDefaultConfiguration = ` {
2021-09-24 01:52:20 +08:00
"alertmanager_config" : {
"route" : {
"receiver" : "grafana-default-email"
} ,
"receivers" : [ {
"name" : "grafana-default-email" ,
"grafana_managed_receiver_configs" : [ {
"uid" : "" ,
"name" : "email receiver" ,
"type" : "email" ,
"isDefault" : true ,
"settings" : {
"addresses" : "<example@email.com>"
}
} ]
} ]
}
}
`
2021-09-28 18:00:16 +08:00
evaluatorDefaultEvaluationTimeout = 30 * time . Second
schedulerDefaultAdminConfigPollInterval = 60 * time . Second
schedulereDefaultExecuteAlerts = true
schedulerDefaultMaxAttempts = 3
schedulerDefaultLegacyMinInterval = 1
schedulerDefaultMinInterval = 10 * time . Second
2021-09-16 22:33:51 +08:00
)
2021-09-20 15:12:21 +08:00
type UnifiedAlertingSettings struct {
AdminConfigPollInterval time . Duration
AlertmanagerConfigPollInterval time . Duration
HAListenAddr string
HAAdvertiseAddr string
HAPeers [ ] string
HAPeerTimeout time . Duration
HAGossipInterval time . Duration
HAPushPullInterval time . Duration
2021-09-28 18:00:16 +08:00
MaxAttempts int64
MinInterval time . Duration
EvaluationTimeout time . Duration
ExecuteAlerts bool
2021-09-24 01:52:20 +08:00
DefaultConfiguration string
2021-09-20 15:12:21 +08:00
}
2021-09-28 18:00:16 +08:00
// ReadUnifiedAlertingSettings reads both the `unified_alerting` and `alerting` sections of the configuration while preferring configuration the `alerting` section.
// It first reads the `unified_alerting` section, then looks for non-defaults on the `alerting` section and prefers those.
2021-09-16 22:33:51 +08:00
func ( cfg * Cfg ) ReadUnifiedAlertingSettings ( iniFile * ini . File ) error {
2021-09-20 15:12:21 +08:00
uaCfg := UnifiedAlertingSettings { }
2021-09-16 22:33:51 +08:00
ua := iniFile . Section ( "unified_alerting" )
var err error
2021-09-28 18:00:16 +08:00
uaCfg . AdminConfigPollInterval , err = gtime . ParseDuration ( valueAsString ( ua , "admin_config_poll_interval" , ( schedulerDefaultAdminConfigPollInterval ) . String ( ) ) )
2021-09-16 22:33:51 +08:00
if err != nil {
return err
}
2021-09-28 18:00:16 +08:00
uaCfg . AlertmanagerConfigPollInterval , err = gtime . ParseDuration ( valueAsString ( ua , "alertmanager_config_poll_interval" , ( alertmanagerDefaultConfigPollInterval ) . String ( ) ) )
2021-09-16 22:33:51 +08:00
if err != nil {
return err
}
2021-09-28 18:00:16 +08:00
uaCfg . HAPeerTimeout , err = gtime . ParseDuration ( valueAsString ( ua , "ha_peer_timeout" , ( alertmanagerDefaultPeerTimeout ) . String ( ) ) )
2021-09-16 22:33:51 +08:00
if err != nil {
return err
}
2021-09-28 18:00:16 +08:00
uaCfg . HAGossipInterval , err = gtime . ParseDuration ( valueAsString ( ua , "ha_gossip_interval" , ( alertmanagerDefaultGossipInterval ) . String ( ) ) )
2021-09-16 22:33:51 +08:00
if err != nil {
return err
}
2021-09-28 18:00:16 +08:00
uaCfg . HAPushPullInterval , err = gtime . ParseDuration ( valueAsString ( ua , "ha_push_pull_interval" , ( alertmanagerDefaultPushPullInterval ) . String ( ) ) )
2021-09-16 22:33:51 +08:00
if err != nil {
return err
}
2021-09-28 18:00:16 +08:00
uaCfg . HAListenAddr = ua . Key ( "ha_listen_address" ) . MustString ( alertmanagerDefaultClusterAddr )
2021-09-20 15:12:21 +08:00
uaCfg . HAAdvertiseAddr = ua . Key ( "ha_advertise_address" ) . MustString ( "" )
2021-09-16 22:33:51 +08:00
peers := ua . Key ( "ha_peers" ) . MustString ( "" )
2021-09-20 15:12:21 +08:00
uaCfg . HAPeers = make ( [ ] string , 0 )
2021-09-16 22:33:51 +08:00
if peers != "" {
for _ , peer := range strings . Split ( peers , "," ) {
peer = strings . TrimSpace ( peer )
2021-09-20 15:12:21 +08:00
uaCfg . HAPeers = append ( uaCfg . HAPeers , peer )
2021-09-16 22:33:51 +08:00
}
}
2021-09-28 18:00:16 +08:00
2021-09-24 01:52:20 +08:00
// TODO load from ini file
2021-09-28 18:00:16 +08:00
uaCfg . DefaultConfiguration = alertmanagerDefaultConfiguration
alerting := iniFile . Section ( "alerting" )
uaExecuteAlerts := ua . Key ( "execute_alerts" ) . MustBool ( schedulereDefaultExecuteAlerts )
if uaExecuteAlerts { // unified option equals the default (true)
legacyExecuteAlerts := alerting . Key ( "execute_alerts" ) . MustBool ( schedulereDefaultExecuteAlerts )
if ! legacyExecuteAlerts {
cfg . Logger . Warn ( "falling back to legacy setting of 'execute_alerts'; please use the configuration option in the `unified_alerting` section if Grafana 8 alerts are enabled." )
}
uaExecuteAlerts = legacyExecuteAlerts
}
uaCfg . ExecuteAlerts = uaExecuteAlerts
// if the unified alerting options equal the defaults, apply the respective legacy one
uaEvaluationTimeout , err := gtime . ParseDuration ( valueAsString ( ua , "evaluation_timeout" , evaluatorDefaultEvaluationTimeout . String ( ) ) )
if err != nil || uaEvaluationTimeout == evaluatorDefaultEvaluationTimeout { // unified option is invalid duration or equals the default
legaceEvaluationTimeout := time . Duration ( alerting . Key ( "evaluation_timeout_seconds" ) . MustInt64 ( int64 ( evaluatorDefaultEvaluationTimeout . Seconds ( ) ) ) ) * time . Second
if legaceEvaluationTimeout != evaluatorDefaultEvaluationTimeout {
cfg . Logger . Warn ( "falling back to legacy setting of 'evaluation_timeout_seconds'; please use the configuration option in the `unified_alerting` section if Grafana 8 alerts are enabled." )
}
uaEvaluationTimeout = legaceEvaluationTimeout
}
uaCfg . EvaluationTimeout = uaEvaluationTimeout
uaMaxAttempts := ua . Key ( "max_attempts" ) . MustInt64 ( schedulerDefaultMaxAttempts )
if uaMaxAttempts == schedulerDefaultMaxAttempts { // unified option or equals the default
legacyMaxAttempts := alerting . Key ( "max_attempts" ) . MustInt64 ( schedulerDefaultMaxAttempts )
if legacyMaxAttempts != schedulerDefaultMaxAttempts {
cfg . Logger . Warn ( "falling back to legacy setting of 'max_attempts'; please use the configuration option in the `unified_alerting` section if Grafana 8 alerts are enabled." )
}
uaMaxAttempts = legacyMaxAttempts
}
uaCfg . MaxAttempts = uaMaxAttempts
uaMinInterval , err := gtime . ParseDuration ( valueAsString ( ua , "min_interval" , schedulerDefaultMinInterval . String ( ) ) )
if err != nil || uaMinInterval == schedulerDefaultMinInterval { // unified option is invalid duration or equals the default
// if the legacy option is invalid, fallback to 10 (unified alerting min interval default)
legacyMinInterval := time . Duration ( alerting . Key ( "min_interval_seconds" ) . MustInt64 ( int64 ( schedulerDefaultMinInterval . Seconds ( ) ) ) ) * time . Second
if legacyMinInterval != schedulerDefaultLegacyMinInterval {
cfg . Logger . Warn ( "falling back to legacy setting of 'min_interval_seconds'; please use the configuration option in the `unified_alerting` section if Grafana 8 alerts are enabled." )
}
uaMinInterval = legacyMinInterval
}
uaCfg . MinInterval = uaMinInterval
2021-09-20 15:12:21 +08:00
cfg . UnifiedAlerting = uaCfg
2021-09-16 22:33:51 +08:00
return nil
}
2021-09-28 18:00:16 +08:00
func GetAlertmanagerDefaultConfiguration ( ) string {
return alertmanagerDefaultConfiguration
}