Move time intervals to own section, add config validation

Signed-off-by: Ben Ridley <benridley29@gmail.com>
This commit is contained in:
ben 2020-10-06 14:48:16 +11:00 committed by Ben Ridley
parent ea5b925147
commit fe4b8399c3
1 changed files with 60 additions and 44 deletions

View File

@ -25,6 +25,7 @@ import (
"strings" "strings"
"time" "time"
"github.com/benridley/gotime"
"github.com/pkg/errors" "github.com/pkg/errors"
commoncfg "github.com/prometheus/common/config" commoncfg "github.com/prometheus/common/config"
"github.com/prometheus/common/model" "github.com/prometheus/common/model"
@ -221,26 +222,18 @@ func resolveFilepaths(baseDir string, cfg *Config) {
// A MuteTimeInterval represents a named set of time intervals for which a route should be muted. // A MuteTimeInterval represents a named set of time intervals for which a route should be muted.
type MuteTimeInterval struct { type MuteTimeInterval struct {
Name string `yaml:"name" json:"name"` Name string `yaml:"name" json:"name"`
TimeIntervals []TimeInterval `yaml:"time_intervals"` TimeIntervals []gotime.TimeInterval `yaml:"time_intervals"`
}
// A TimeInterval describes intervals of time.
type TimeInterval struct {
Times []string `yaml:"times"`
Weekdays []string `yaml:"weekdays"`
DaysOfMonth []string `yaml:"days_of_month"`
Months []string `yaml:"months"`
Years []string `yaml:"years"`
} }
// 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 *GlobalConfig `yaml:"global,omitempty" json:"global,omitempty"` Global *GlobalConfig `yaml:"global,omitempty" json:"global,omitempty"`
Route *Route `yaml:"route,omitempty" json:"route,omitempty"` Route *Route `yaml:"route,omitempty" json:"route,omitempty"`
InhibitRules []*InhibitRule `yaml:"inhibit_rules,omitempty" json:"inhibit_rules,omitempty"` InhibitRules []*InhibitRule `yaml:"inhibit_rules,omitempty" json:"inhibit_rules,omitempty"`
Receivers []*Receiver `yaml:"receivers,omitempty" json:"receivers,omitempty"` Receivers []*Receiver `yaml:"receivers,omitempty" json:"receivers,omitempty"`
Templates []string `yaml:"templates" json:"templates"` Templates []string `yaml:"templates" json:"templates"`
MuteTimeIntervals []MuteTimeInterval `yaml:"mute_time_intervals,omitempty" json:"mute_time_intervals,omitempty"`
// original is the input from which the config was parsed. // original is the input from which the config was parsed.
original string original string
@ -431,7 +424,15 @@ func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error {
} }
// Validate that all receivers used in the routing tree are defined. // Validate that all receivers used in the routing tree are defined.
return checkReceiver(c.Route, names) if err := checkReceiver(c.Route, names); err != nil {
return err
}
tiNames := make(map[string]struct{})
for _, mt := range c.MuteTimeIntervals {
tiNames[mt.Name] = struct{}{}
}
return checkTimeInterval(c.Route, tiNames)
} }
// checkReceiver returns an error if a node in the routing tree // checkReceiver returns an error if a node in the routing tree
@ -451,18 +452,34 @@ func checkReceiver(r *Route, receivers map[string]struct{}) error {
return nil return nil
} }
func checkTimeInterval(r *Route, timeIntervals map[string]struct{}) error {
for _, sr := range r.Routes {
if err := checkTimeInterval(sr, timeIntervals); err != nil {
return err
}
}
if len(r.MuteTimes) == 0 {
return nil
}
for _, mt := range r.MuteTimes {
if _, ok := timeIntervals[mt]; !ok {
return fmt.Errorf("undefined time interval %s used in route", mt)
}
}
return nil
}
// DefaultGlobalConfig returns GlobalConfig with default values. // DefaultGlobalConfig returns GlobalConfig with default values.
func DefaultGlobalConfig() GlobalConfig { func DefaultGlobalConfig() GlobalConfig {
return GlobalConfig{ return GlobalConfig{
ResolveTimeout: model.Duration(5 * time.Minute), ResolveTimeout: model.Duration(5 * time.Minute),
HTTPConfig: &commoncfg.HTTPClientConfig{}, HTTPConfig: &commoncfg.HTTPClientConfig{},
MuteTimeIntervals: []MuteTimeInterval{}, SMTPHello: "localhost",
SMTPHello: "localhost", SMTPRequireTLS: true,
SMTPRequireTLS: true, PagerdutyURL: mustParseURL("https://events.pagerduty.com/v2/enqueue"),
PagerdutyURL: mustParseURL("https://events.pagerduty.com/v2/enqueue"), OpsGenieAPIURL: mustParseURL("https://api.opsgenie.com/"),
OpsGenieAPIURL: mustParseURL("https://api.opsgenie.com/"), WeChatAPIURL: mustParseURL("https://qyapi.weixin.qq.com/cgi-bin/"),
WeChatAPIURL: mustParseURL("https://qyapi.weixin.qq.com/cgi-bin/"), VictorOpsAPIURL: mustParseURL("https://alert.victorops.com/integrations/generic/20131114/alert/"),
VictorOpsAPIURL: mustParseURL("https://alert.victorops.com/integrations/generic/20131114/alert/"),
} }
} }
@ -564,24 +581,23 @@ type GlobalConfig struct {
HTTPConfig *commoncfg.HTTPClientConfig `yaml:"http_config,omitempty" json:"http_config,omitempty"` HTTPConfig *commoncfg.HTTPClientConfig `yaml:"http_config,omitempty" json:"http_config,omitempty"`
SMTPFrom string `yaml:"smtp_from,omitempty" json:"smtp_from,omitempty"` SMTPFrom string `yaml:"smtp_from,omitempty" json:"smtp_from,omitempty"`
SMTPHello string `yaml:"smtp_hello,omitempty" json:"smtp_hello,omitempty"` SMTPHello string `yaml:"smtp_hello,omitempty" json:"smtp_hello,omitempty"`
SMTPSmarthost HostPort `yaml:"smtp_smarthost,omitempty" json:"smtp_smarthost,omitempty"` SMTPSmarthost HostPort `yaml:"smtp_smarthost,omitempty" json:"smtp_smarthost,omitempty"`
SMTPAuthUsername string `yaml:"smtp_auth_username,omitempty" json:"smtp_auth_username,omitempty"` SMTPAuthUsername string `yaml:"smtp_auth_username,omitempty" json:"smtp_auth_username,omitempty"`
SMTPAuthPassword Secret `yaml:"smtp_auth_password,omitempty" json:"smtp_auth_password,omitempty"` SMTPAuthPassword Secret `yaml:"smtp_auth_password,omitempty" json:"smtp_auth_password,omitempty"`
SMTPAuthSecret Secret `yaml:"smtp_auth_secret,omitempty" json:"smtp_auth_secret,omitempty"` SMTPAuthSecret Secret `yaml:"smtp_auth_secret,omitempty" json:"smtp_auth_secret,omitempty"`
SMTPAuthIdentity string `yaml:"smtp_auth_identity,omitempty" json:"smtp_auth_identity,omitempty"` SMTPAuthIdentity string `yaml:"smtp_auth_identity,omitempty" json:"smtp_auth_identity,omitempty"`
SMTPRequireTLS bool `yaml:"smtp_require_tls" json:"smtp_require_tls,omitempty"` SMTPRequireTLS bool `yaml:"smtp_require_tls" json:"smtp_require_tls,omitempty"`
SlackAPIURL *SecretURL `yaml:"slack_api_url,omitempty" json:"slack_api_url,omitempty"` SlackAPIURL *SecretURL `yaml:"slack_api_url,omitempty" json:"slack_api_url,omitempty"`
MuteTimeIntervals []MuteTimeInterval `yaml:"mute_time_intervals,omitempty" json:"mute_time_intervals,omitempty"` PagerdutyURL *URL `yaml:"pagerduty_url,omitempty" json:"pagerduty_url,omitempty"`
PagerdutyURL *URL `yaml:"pagerduty_url,omitempty" json:"pagerduty_url,omitempty"` OpsGenieAPIURL *URL `yaml:"opsgenie_api_url,omitempty" json:"opsgenie_api_url,omitempty"`
OpsGenieAPIURL *URL `yaml:"opsgenie_api_url,omitempty" json:"opsgenie_api_url,omitempty"` OpsGenieAPIKey Secret `yaml:"opsgenie_api_key,omitempty" json:"opsgenie_api_key,omitempty"`
OpsGenieAPIKey Secret `yaml:"opsgenie_api_key,omitempty" json:"opsgenie_api_key,omitempty"` WeChatAPIURL *URL `yaml:"wechat_api_url,omitempty" json:"wechat_api_url,omitempty"`
WeChatAPIURL *URL `yaml:"wechat_api_url,omitempty" json:"wechat_api_url,omitempty"` WeChatAPISecret Secret `yaml:"wechat_api_secret,omitempty" json:"wechat_api_secret,omitempty"`
WeChatAPISecret Secret `yaml:"wechat_api_secret,omitempty" json:"wechat_api_secret,omitempty"` WeChatAPICorpID string `yaml:"wechat_api_corp_id,omitempty" json:"wechat_api_corp_id,omitempty"`
WeChatAPICorpID string `yaml:"wechat_api_corp_id,omitempty" json:"wechat_api_corp_id,omitempty"` VictorOpsAPIURL *URL `yaml:"victorops_api_url,omitempty" json:"victorops_api_url,omitempty"`
VictorOpsAPIURL *URL `yaml:"victorops_api_url,omitempty" json:"victorops_api_url,omitempty"` VictorOpsAPIKey Secret `yaml:"victorops_api_key,omitempty" json:"victorops_api_key,omitempty"`
VictorOpsAPIKey Secret `yaml:"victorops_api_key,omitempty" json:"victorops_api_key,omitempty"`
} }
// UnmarshalYAML implements the yaml.Unmarshaler interface for GlobalConfig. // UnmarshalYAML implements the yaml.Unmarshaler interface for GlobalConfig.