diff --git a/README.md b/README.md index 77a2a19..f455c60 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,9 @@ use_privmsg: yes # # The formatting is based on golang's text/template . msg_template: "Alert {{ .Labels.alertname }} on {{ .Labels.instance }} is {{ .Status }}" +# By default, firing and resolved messages use the template defined as msg_template. +# Define msg_template_resolved to define a different template for resolved messages. +# msg_template_resolved: "Resolved: {{ .Labels.alertname }} on {{ .Labels.instance }}" # Note: When sending only one message per alert group the default # msg_template is set to # "Alert {{ .GroupLabels.alertname }} for {{ .GroupLabels.job }} is {{ .Status }}" diff --git a/config.go b/config.go index 3308595..3416da8 100644 --- a/config.go +++ b/config.go @@ -45,6 +45,7 @@ type Config struct { IRCVerifySSL bool `yaml:"irc_verify_ssl"` IRCChannels []IRCChannel `yaml:"irc_channels"` MsgTemplate string `yaml:"msg_template"` + MsgTemplateResolved string `yaml:"msg_template_resolved"` MsgOnce bool `yaml:"msg_once_per_alert_group"` UsePrivmsg bool `yaml:"use_privmsg"` AlertBufferSize int `yaml:"alert_buffer_size"` @@ -99,6 +100,9 @@ func LoadConfig(configFile string) (*Config, error) { config.MsgTemplate = defaultMsgTemplate } } + if config.MsgTemplateResolved == "" { + config.MsgTemplateResolved = config.MsgTemplate + } loadedConfig, _ := yaml.Marshal(config) logging.Debug("Loaded config:\n%s", loadedConfig) diff --git a/format.go b/format.go index 4de8a97..c826591 100644 --- a/format.go +++ b/format.go @@ -27,6 +27,7 @@ import ( type Formatter struct { MsgTemplate *template.Template + MsgTemplateResolved *template.Template MsgOnce bool } @@ -44,16 +45,27 @@ func NewFormatter(config *Config) (*Formatter, error) { if err != nil { return nil, err } + tmplresolved, err := template.New("msg").Funcs(funcMap).Parse(config.MsgTemplateResolved) + if err != nil { + return nil, err + } return &Formatter{ MsgTemplate: tmpl, + MsgTemplateResolved: tmplresolved, MsgOnce: config.MsgOnce, }, nil } -func (f *Formatter) FormatMsg(ircChannel string, data interface{}) []string { +func (f *Formatter) FormatMsg(ircChannel string, data interface{}, status string) []string { output := bytes.Buffer{} var msg string - if err := f.MsgTemplate.Execute(&output, data); err != nil { + var msgtemplate *template.Template + if status == "resolved" { + msgtemplate = f.MsgTemplateResolved + } else { + msgtemplate = f.MsgTemplate + } + if err := msgtemplate.Execute(&output, data); err != nil { msg_bytes, _ := json.Marshal(data) msg = string(msg_bytes) logging.Error("Could not apply msg template on alert (%s): %s", @@ -75,13 +87,13 @@ func (f *Formatter) GetMsgsFromAlertMessage(ircChannel string, data *promtmpl.Data) []AlertMsg { msgs := []AlertMsg{} if f.MsgOnce { - for _, msg := range f.FormatMsg(ircChannel, data) { + for _, msg := range f.FormatMsg(ircChannel, data, data.Status) { msgs = append(msgs, AlertMsg{Channel: ircChannel, Alert: msg}) } } else { for _, alert := range data.Alerts { - for _, msg := range f.FormatMsg(ircChannel, alert) { + for _, msg := range f.FormatMsg(ircChannel, alert, data.Status) { msgs = append(msgs, AlertMsg{Channel: ircChannel, Alert: msg}) } diff --git a/format_test.go b/format_test.go index ed6b442..15d219d 100644 --- a/format_test.go +++ b/format_test.go @@ -133,3 +133,20 @@ func TestMultilineTemplates(t *testing.T) { CreateFormatterAndCheckOutput(t, &testingConfig, expectedAlertMsgs) } + +func TestResolvedTemplate(t *testing.T) { + testingConfig := Config{ + MsgTemplateResolved: "Resolved: {{ .Labels.alertname }}", + } + expectedAlertMsgs := []AlertMsg{ + AlertMsg{ + Channel: "#somechannel", + Alert: "Resolved: airDown", + }, + AlertMsg{ + Channel: "#somechannel", + Alert: "Resolved: airDown", + }, + } + CreateFormatterAndCheckOutput(t, &testingConfig, expectedAlertMsgs) +}