Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,13 @@
*.yml
*.yaml
/.build
/.release
/release
/.tarballs
/vendor
/.idea
/release
/.idea


!.golangci.yml
!/cli/testdata/*.yml
Expand Down
1 change: 1 addition & 0 deletions compressing
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
' assets'
92 changes: 64 additions & 28 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,12 @@ func resolveFilepaths(baseDir string, cfg *Config) {
for _, cfg := range receiver.TelegramConfigs {
cfg.HTTPConfig.SetDirectory(baseDir)
}
for _, cfg := range receiver.ZeusTelegramConfigs {
cfg.HTTPConfig.SetDirectory(baseDir)
}
for _, cfg := range receiver.ZeusEmailConfigs {
cfg.HTTPConfig.SetDirectory(baseDir)
}
for _, cfg := range receiver.DiscordConfigs {
cfg.HTTPConfig.SetDirectory(baseDir)
}
Expand Down Expand Up @@ -563,6 +569,22 @@ func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error {
telegram.APIUrl = c.Global.TelegramAPIUrl
}
}
for _, zeusTelegram := range rcv.ZeusTelegramConfigs {
if zeusTelegram.HTTPConfig == nil {
zeusTelegram.HTTPConfig = c.Global.HTTPConfig
}
if zeusTelegram.APIURL == nil {
zeusTelegram.APIURL = c.Global.ZeusTelegramAPIUrl
}
}
for _, zeusEmail := range rcv.ZeusEmailConfigs {
if zeusEmail.HTTPConfig == nil {
zeusEmail.HTTPConfig = c.Global.HTTPConfig
}
if zeusEmail.APIURL == nil {
zeusEmail.APIURL = c.Global.ZeusEmailAPIUrl
}
}
for _, discord := range rcv.DiscordConfigs {
if discord.HTTPConfig == nil {
discord.HTTPConfig = c.Global.HTTPConfig
Expand Down Expand Up @@ -724,18 +746,20 @@ func DefaultGlobalConfig() GlobalConfig {
defaultSMTPTLSConfig := commoncfg.TLSConfig{}

return GlobalConfig{
ResolveTimeout: model.Duration(5 * time.Minute),
HTTPConfig: &defaultHTTPConfig,
SMTPHello: "localhost",
SMTPRequireTLS: true,
SMTPTLSConfig: &defaultSMTPTLSConfig,
PagerdutyURL: mustParseURL("https://events.pagerduty.com/v2/enqueue"),
OpsGenieAPIURL: mustParseURL("https://api.opsgenie.com/"),
WeChatAPIURL: mustParseURL("https://qyapi.weixin.qq.com/cgi-bin/"),
VictorOpsAPIURL: mustParseURL("https://alert.victorops.com/integrations/generic/20131114/alert/"),
TelegramAPIUrl: mustParseURL("https://api.telegram.org"),
WebexAPIURL: mustParseURL("https://webexapis.com/v1/messages"),
RocketchatAPIURL: mustParseURL("https://open.rocket.chat/"),
ResolveTimeout: model.Duration(5 * time.Minute),
HTTPConfig: &defaultHTTPConfig,
SMTPHello: "localhost",
SMTPRequireTLS: true,
SMTPTLSConfig: &defaultSMTPTLSConfig,
PagerdutyURL: mustParseURL("https://events.pagerduty.com/v2/enqueue"),
OpsGenieAPIURL: mustParseURL("https://api.opsgenie.com/"),
WeChatAPIURL: mustParseURL("https://qyapi.weixin.qq.com/cgi-bin/"),
VictorOpsAPIURL: mustParseURL("https://alert.victorops.com/integrations/generic/20131114/alert/"),
TelegramAPIUrl: mustParseURL("https://api.telegram.org"),
ZeusTelegramAPIUrl: mustParseURL(getZeusApiUrl() + "/zeus/telegram/message/"),
ZeusEmailAPIUrl: mustParseURL(getZeusApiUrl() + "/zeus/mail/message/"),
WebexAPIURL: mustParseURL("https://webexapis.com/v1/messages"),
RocketchatAPIURL: mustParseURL("https://open.rocket.chat/"),
}
}

Expand Down Expand Up @@ -828,6 +852,14 @@ func (hp HostPort) String() string {
return fmt.Sprintf("%s:%s", hp.Host, hp.Port)
}

func getZeusApiUrl() string {
if os.Getenv("ZEUS_API_URL") == "" {
return "http://localhost:8080"
} else {
return os.Getenv("ZEUS_API_URL")
}
}

// GlobalConfig defines configuration parameters that are valid globally
// unless overwritten.
type GlobalConfig struct {
Expand Down Expand Up @@ -861,6 +893,8 @@ type GlobalConfig struct {
VictorOpsAPIKey Secret `yaml:"victorops_api_key,omitempty" json:"victorops_api_key,omitempty"`
VictorOpsAPIKeyFile string `yaml:"victorops_api_key_file,omitempty" json:"victorops_api_key_file,omitempty"`
TelegramAPIUrl *URL `yaml:"telegram_api_url,omitempty" json:"telegram_api_url,omitempty"`
ZeusTelegramAPIUrl *URL `yaml:"zeus_telegram_api_url,omitempty" json:"zeus_telegram_api_url,omitempty"`
ZeusEmailAPIUrl *URL `yaml:"zeus_email_api_url,omitempty" json:"zeus_email_api_url,omitempty"`
WebexAPIURL *URL `yaml:"webex_api_url,omitempty" json:"webex_api_url,omitempty"`
RocketchatAPIURL *URL `yaml:"rocketchat_api_url,omitempty" json:"rocketchat_api_url,omitempty"`
RocketchatToken *Secret `yaml:"rocketchat_token,omitempty" json:"rocketchat_token,omitempty"`
Expand Down Expand Up @@ -1005,22 +1039,24 @@ type Receiver struct {
// A unique identifier for this receiver.
Name string `yaml:"name" json:"name"`

DiscordConfigs []*DiscordConfig `yaml:"discord_configs,omitempty" json:"discord_configs,omitempty"`
EmailConfigs []*EmailConfig `yaml:"email_configs,omitempty" json:"email_configs,omitempty"`
PagerdutyConfigs []*PagerdutyConfig `yaml:"pagerduty_configs,omitempty" json:"pagerduty_configs,omitempty"`
SlackConfigs []*SlackConfig `yaml:"slack_configs,omitempty" json:"slack_configs,omitempty"`
WebhookConfigs []*WebhookConfig `yaml:"webhook_configs,omitempty" json:"webhook_configs,omitempty"`
OpsGenieConfigs []*OpsGenieConfig `yaml:"opsgenie_configs,omitempty" json:"opsgenie_configs,omitempty"`
WechatConfigs []*WechatConfig `yaml:"wechat_configs,omitempty" json:"wechat_configs,omitempty"`
PushoverConfigs []*PushoverConfig `yaml:"pushover_configs,omitempty" json:"pushover_configs,omitempty"`
VictorOpsConfigs []*VictorOpsConfig `yaml:"victorops_configs,omitempty" json:"victorops_configs,omitempty"`
SNSConfigs []*SNSConfig `yaml:"sns_configs,omitempty" json:"sns_configs,omitempty"`
TelegramConfigs []*TelegramConfig `yaml:"telegram_configs,omitempty" json:"telegram_configs,omitempty"`
WebexConfigs []*WebexConfig `yaml:"webex_configs,omitempty" json:"webex_configs,omitempty"`
MSTeamsConfigs []*MSTeamsConfig `yaml:"msteams_configs,omitempty" json:"msteams_configs,omitempty"`
MSTeamsV2Configs []*MSTeamsV2Config `yaml:"msteamsv2_configs,omitempty" json:"msteamsv2_configs,omitempty"`
JiraConfigs []*JiraConfig `yaml:"jira_configs,omitempty" json:"jira_configs,omitempty"`
RocketchatConfigs []*RocketchatConfig `yaml:"rocketchat_configs,omitempty" json:"rocketchat_configs,omitempty"`
DiscordConfigs []*DiscordConfig `yaml:"discord_configs,omitempty" json:"discord_configs,omitempty"`
EmailConfigs []*EmailConfig `yaml:"email_configs,omitempty" json:"email_configs,omitempty"`
PagerdutyConfigs []*PagerdutyConfig `yaml:"pagerduty_configs,omitempty" json:"pagerduty_configs,omitempty"`
SlackConfigs []*SlackConfig `yaml:"slack_configs,omitempty" json:"slack_configs,omitempty"`
WebhookConfigs []*WebhookConfig `yaml:"webhook_configs,omitempty" json:"webhook_configs,omitempty"`
OpsGenieConfigs []*OpsGenieConfig `yaml:"opsgenie_configs,omitempty" json:"opsgenie_configs,omitempty"`
WechatConfigs []*WechatConfig `yaml:"wechat_configs,omitempty" json:"wechat_configs,omitempty"`
PushoverConfigs []*PushoverConfig `yaml:"pushover_configs,omitempty" json:"pushover_configs,omitempty"`
VictorOpsConfigs []*VictorOpsConfig `yaml:"victorops_configs,omitempty" json:"victorops_configs,omitempty"`
SNSConfigs []*SNSConfig `yaml:"sns_configs,omitempty" json:"sns_configs,omitempty"`
TelegramConfigs []*TelegramConfig `yaml:"telegram_configs,omitempty" json:"telegram_configs,omitempty"`
ZeusTelegramConfigs []*ZeusTelegramConfig `yaml:"zeus_telegram_configs,omitempty" json:"zeus_telegram_configs,omitempty"`
ZeusEmailConfigs []*ZeusEmailConfig `yaml:"zeus_email_configs,omitempty" json:"zeus_email_configs,omitempty"`
WebexConfigs []*WebexConfig `yaml:"webex_configs,omitempty" json:"webex_configs,omitempty"`
MSTeamsConfigs []*MSTeamsConfig `yaml:"msteams_configs,omitempty" json:"msteams_configs,omitempty"`
MSTeamsV2Configs []*MSTeamsV2Config `yaml:"msteamsv2_configs,omitempty" json:"msteamsv2_configs,omitempty"`
JiraConfigs []*JiraConfig `yaml:"jira_configs,omitempty" json:"jira_configs,omitempty"`
RocketchatConfigs []*RocketchatConfig `yaml:"rocketchat_configs,omitempty" json:"rocketchat_configs,omitempty"`
}

// UnmarshalYAML implements the yaml.Unmarshaler interface for Receiver.
Expand Down
93 changes: 93 additions & 0 deletions config/notifiers.go
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,21 @@ var (
ParseMode: "HTML",
}

DefaultZeusTelegramConfig = ZeusTelegramConfig{
NotifierConfig: NotifierConfig{
VSendResolved: true,
},
Text: `{{ template "telegram.default.message" . }}`,
ParseMode: "HTML",
}

DefaultZeusEmailConfig = ZeusEmailConfig{
NotifierConfig: NotifierConfig{
VSendResolved: false,
},
Message: `{{ template "email.default.html" . }}`,
}

DefaultMSTeamsConfig = MSTeamsConfig{
NotifierConfig: NotifierConfig{
VSendResolved: true,
Expand Down Expand Up @@ -839,6 +854,84 @@ func (c *TelegramConfig) UnmarshalYAML(unmarshal func(interface{}) error) error
return nil
}

type ZeusTelegramConfig struct {
NotifierConfig `yaml:",inline" json:",inline"`

HTTPConfig *commoncfg.HTTPClientConfig `yaml:"http_config,omitempty" json:"http_config,omitempty"`

SensitiveData []string `yaml:"sensitive_data,omitempty" json:"sensitive_data,omitempty"`
SensitiveDataRegexPattern string `yaml:"sensitive_data_regex_pattern" json:"sensitive_data_regex_pattern,omitempty"`
EventID string `yaml:"event_id" json:"event_id,omitempty"`
EventStatus string `yaml:"event_status" json:"event_status,omitempty"`
Severity string `yaml:"severity" json:"severity,omitempty"`
Sender string `yaml:"sender" json:"sender,omitempty"`
APIURL *URL `yaml:"api_url" json:"api_url,omitempty"`
BotToken string `yaml:"bot_token,omitempty" json:"token,omitempty"`
ChatID int64 `yaml:"chat_id,omitempty" json:"chat,omitempty"`
Subject string `yaml:"subject,omitempty" json:"subject,omitempty"`
Text string `yaml:"text,omitempty" json:"text,omitempty"`
ParseMode string `yaml:"parse_mode,omitempty" json:"parse_mode,omitempty"`
}

func (c *ZeusTelegramConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
*c = DefaultZeusTelegramConfig
type plain ZeusTelegramConfig
if err := unmarshal((*plain)(c)); err != nil {
return err
}
if c.BotToken == "" {
return errors.New("missing bot_token on zeus_telegram_config")
}
if c.ChatID == 0 {
return errors.New("missing chat_id on zeus_telegram_config")
}
if c.Text == "" {
return errors.New("missing text on zeus_telegram_config")
}
if c.Sender == "" {
return errors.New("missing sender on zeus_telegram_config")
}
if c.ParseMode != "" &&
c.ParseMode != "Markdown" &&
c.ParseMode != "MarkdownV2" &&
c.ParseMode != "HTML" {
return errors.New("unknown parse_mode on zeus_telegram_config, must be Markdown, MarkdownV2, HTML or empty string")
}
return nil
}

type ZeusEmailConfig struct {
NotifierConfig `yaml:",inline" json:",inline"`

HTTPConfig *commoncfg.HTTPClientConfig `yaml:"http_config,omitempty" json:"http_config,omitempty"`

SensitiveData []string `yaml:"sensitive_data,omitempty" json:"sensitive_data,omitempty"`
SensitiveDataRegexPattern string `yaml:"sensitive_data_regex_pattern" json:"sensitive_data_regex_pattern,omitempty"`
EventID string `yaml:"event_id" json:"event_id,omitempty"`
EventStatus string `yaml:"event_status" json:"event_status,omitempty"`
Severity string `yaml:"severity" json:"severity,omitempty"`
Sender string `yaml:"sender" json:"sender,omitempty"`
APIURL *URL `yaml:"api_url" json:"api_url,omitempty"`
Recipients []string `yaml:"recipients" json:"recipients,omitempty"`
Subject string `yaml:"subject,omitempty" json:"subject,omitempty"`
Message string `yaml:"message,omitempty" json:"message,omitempty"`
}

func (c *ZeusEmailConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
*c = DefaultZeusEmailConfig
type plain ZeusEmailConfig
if err := unmarshal((*plain)(c)); err != nil {
return err
}
if c.Message == "" {
return errors.New("missing message on zeus_email_config")
}
if c.Sender == "" {
return errors.New("missing sender on zeus_email_config")
}
return nil
}

type MSTeamsConfig struct {
NotifierConfig `yaml:",inline" json:",inline"`
HTTPConfig *commoncfg.HTTPClientConfig `yaml:"http_config,omitempty" json:"http_config,omitempty"`
Expand Down
8 changes: 8 additions & 0 deletions config/receiver/receiver.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
package receiver

import (
"github.com/prometheus/alertmanager/notify/zeusemail"
"log/slog"

commoncfg "github.com/prometheus/common/config"
Expand All @@ -37,6 +38,7 @@ import (
"github.com/prometheus/alertmanager/notify/webex"
"github.com/prometheus/alertmanager/notify/webhook"
"github.com/prometheus/alertmanager/notify/wechat"
"github.com/prometheus/alertmanager/notify/zeustelegram"
"github.com/prometheus/alertmanager/template"
"github.com/prometheus/alertmanager/types"
)
Expand Down Expand Up @@ -91,6 +93,12 @@ func BuildReceiverIntegrations(nc config.Receiver, tmpl *template.Template, logg
for i, c := range nc.TelegramConfigs {
add("telegram", i, c, func(l *slog.Logger) (notify.Notifier, error) { return telegram.New(c, tmpl, l, httpOpts...) })
}
for i, c := range nc.ZeusTelegramConfigs {
add("zeustelegram", i, c, func(l *slog.Logger) (notify.Notifier, error) { return zeustelegram.New(c, tmpl, l, httpOpts...) })
}
for i, c := range nc.ZeusEmailConfigs {
add("zeusemail", i, c, func(l *slog.Logger) (notify.Notifier, error) { return zeusemail.New(c, tmpl, l, httpOpts...) })
}
for i, c := range nc.DiscordConfigs {
add("discord", i, c, func(l *slog.Logger) (notify.Notifier, error) { return discord.New(c, tmpl, l, httpOpts...) })
}
Expand Down
2 changes: 0 additions & 2 deletions notify/msteams/msteams.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,7 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error)
if err != nil {
return false, err
}

n.logger.Debug("extracted group key", "key", key)

data := notify.GetTemplateData(ctx, n.tmpl, as, n.logger)
tmpl := notify.TmplText(n.tmpl, data, &err)
if err != nil {
Expand Down
2 changes: 2 additions & 0 deletions notify/notify.go
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,8 @@ func (m *Metrics) InitializeFor(receiver map[string][]Integration) {
"victorops",
"sns",
"telegram",
"zeustelegram",
"zeusemail",
"discord",
"webex",
"msteams",
Expand Down
1 change: 0 additions & 1 deletion notify/telegram/telegram.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,6 @@ func (n *Notifier) Notify(ctx context.Context, alert ...*types.Alert) (bool, err
if n.conf.ParseMode == "HTML" {
tmpl = notify.TmplHTML(n.tmpl, data, &err)
}

key, ok := notify.GroupKey(ctx)
if !ok {
return false, fmt.Errorf("group key missing")
Expand Down
Loading