1
0
mirror of https://github.com/coreos/prometheus-operator.git synced 2026-02-05 06:45:27 +01:00

Feat: Add Config Generator for Alertmanager's Mattermost Receiver (#8188)

This commit is contained in:
Nutmos
2025-12-18 22:45:01 +08:00
committed by GitHub
parent 83507b9c57
commit 3265109af3
9 changed files with 158 additions and 3 deletions

View File

@@ -419,6 +419,7 @@
"finalizer",
"selfsigned",
"FIPS",
"FIPSSTS"
"FIPSSTS",
"checkmark"
]
}

View File

@@ -2357,6 +2357,13 @@ func (r *receiver) sanitize(amVersion semver.Version, logger *slog.Logger) error
return err
}
}
for _, conf := range r.MattermostConfigs {
if err := conf.sanitize(amVersion, withLogger); err != nil {
return err
}
}
return nil
}
@@ -2766,6 +2773,25 @@ func (rc *rocketChatConfig) sanitize(amVersion semver.Version, logger *slog.Logg
return rc.HTTPConfig.sanitize(amVersion, logger)
}
func (mc *mattermostConfig) sanitize(amVersion semver.Version, logger *slog.Logger) error {
mattermostAllowed := amVersion.GTE(semver.MustParse("0.30.0"))
if !mattermostAllowed {
return fmt.Errorf(`invalid syntax in receivers config; mattermost integration is available in Alertmanager >= 0.30.0`)
}
if mc.WebhookURL == "" && mc.WebhookURLFile == "" {
return fmt.Errorf(`one of 'webhook_url' or 'webhook_url_file' must be configured`)
}
if mc.WebhookURL != "" && mc.WebhookURLFile != "" {
msg := "'webhook_url' and 'webhook_url_file' are mutually exclusive for mattermost receiver config - 'webhook_url' has taken precedence"
logger.Warn(msg)
mc.WebhookURLFile = ""
}
return mc.HTTPConfig.sanitize(amVersion, logger)
}
func (ir *inhibitRule) sanitize(amVersion semver.Version, logger *slog.Logger) error {
matchersV2Allowed := amVersion.GTE(semver.MustParse("0.22.0"))

View File

@@ -3909,6 +3909,9 @@ func TestSanitizeConfig(t *testing.T) {
versionSMTPTLSConfigAllowed := semver.Version{Major: 0, Minor: 28}
versionSMTPTLSConfigNotAllowed := semver.Version{Major: 0, Minor: 27}
versionMattermostConfigAllowed := semver.Version{Major: 0, Minor: 30}
versionMattermostConfigNotAllowed := semver.Version{Major: 0, Minor: 29}
versionTimeoutConfigAllowed := semver.Version{Major: 0, Minor: 30}
versionTimeoutConfigNotAllowed := semver.Version{Major: 0, Minor: 29}
@@ -4604,6 +4607,58 @@ func TestSanitizeConfig(t *testing.T) {
},
golden: "summary_add_in_supported_versions_for_MSTeams_config.golden",
},
{
name: "Test config version mattermost allowed",
againstVersion: versionMattermostConfigAllowed,
in: &alertmanagerConfig{
Receivers: []*receiver{
{
MattermostConfigs: []*mattermostConfig{
{
WebhookURL: "www.test.com",
Text: "test text",
},
},
},
},
},
golden: "test_config_version_mattermost_allowed.golden",
},
{
name: "Test drop config version mattermost not allowed",
againstVersion: versionMattermostConfigNotAllowed,
in: &alertmanagerConfig{
Receivers: []*receiver{
{
MattermostConfigs: []*mattermostConfig{
{
WebhookURL: "www.test.com",
Text: "test text",
},
},
},
},
},
expectErr: true,
},
{
name: "Test webhook_url takes precedence in mattermost config",
againstVersion: versionMattermostConfigAllowed,
in: &alertmanagerConfig{
Receivers: []*receiver{
{
MattermostConfigs: []*mattermostConfig{
{
WebhookURL: "www.test.com",
WebhookURLFile: "/test",
Text: "test text",
},
},
},
},
},
golden: "test_webhook_url_takes_precedence_in_mattermost_config.golden",
},
{
name: "Test timeout is dropped in pagerduty config for unsupported versions",
againstVersion: versionTimeoutConfigNotAllowed,

View File

@@ -0,0 +1,14 @@
route:
receiver: "null"
routes:
- receiver: mynamespace/myamc/test
matchers:
- namespace="mynamespace"
continue: true
receivers:
- name: "null"
- name: mynamespace/myamc/test
mattermost_configs:
- webhook_url: https://mattermost.example.com
text: test text
templates: []

View File

@@ -0,0 +1,6 @@
receivers:
- name: ""
mattermost_configs:
- webhook_url: www.test.com
text: test text
templates: []

View File

@@ -0,0 +1,6 @@
receivers:
- name: ""
mattermost_configs:
- webhook_url: www.test.com
text: test text
templates: []

View File

@@ -119,6 +119,7 @@ type receiver struct {
MSTeamsV2Configs []*msTeamsV2Config `yaml:"msteamsv2_configs,omitempty"`
JiraConfigs []*jiraConfig `yaml:"jira_configs,omitempty"`
RocketChatConfigs []*rocketChatConfig `yaml:"rocketchat_configs,omitempty"`
MattermostConfigs []*mattermostConfig `yaml:"mattermost_configs,omitempty" json:"mattermost_configs,omitempty"`
}
type webhookConfig struct {
@@ -490,4 +491,52 @@ type rocketChatConfig struct {
Actions []*rocketchatAttachmentAction `yaml:"actions,omitempty"`
}
type mattermostConfig struct {
SendResolved *bool `yaml:"send_resolved,omitempty" json:"send_resolved,omitempty"`
WebhookURL string `yaml:"webhook_url,omitempty" json:"webhook_url,omitempty"`
WebhookURLFile string `yaml:"webhook_url_file,omitempty" json:"webhook_url_file,omitempty"`
Channel string `yaml:"channel,omitempty" json:"channel,omitempty"`
Username string `yaml:"username,omitempty" json:"username,omitempty"`
Text string `yaml:"text" json:"text"`
IconURL string `yaml:"icon_url,omitempty" json:"icon_url,omitempty"`
IconEmoji string `yaml:"icon_emoji,omitempty" json:"icon_emoji,omitempty"`
Attachments []*mattermostAttachmentConfig `yaml:"attachments,omitempty" json:"attachments,omitempty"`
Props *mattermostPropsConfig `yaml:"props,omitempty" json:"props,omitempty"`
Priority *mattermostPriorityConfig `yaml:"priority,omitempty" json:"priority,omitempty"`
HTTPConfig *httpClientConfig `yaml:"http_config,omitempty" json:"http_config,omitempty"`
}
type mattermostAttachmentConfig struct {
Fallback string `yaml:"fallback,omitempty" json:"fallback,omitempty"`
Color string `yaml:"color,omitempty" json:"color,omitempty"`
Pretext string `yaml:"pretext,omitempty" json:"pretext,omitempty"`
Text string `yaml:"text,omitempty" json:"text,omitempty"`
AuthorName string `yaml:"author_name,omitempty" json:"author_name,omitempty"`
AuthorLink string `yaml:"author_link,omitempty" json:"author_link,omitempty"`
AuthorIcon string `yaml:"author_icon,omitempty" json:"author_icon,omitempty"`
Title string `yaml:"title,omitempty" json:"title,omitempty"`
TitleLink string `yaml:"title_link,omitempty" json:"title_link,omitempty"`
Fields []mattermostField `yaml:"fields,omitempty" json:"fields,omitempty"`
ThumbURL string `yaml:"thumb_url,omitempty" json:"thumb_url,omitempty"`
Footer string `yaml:"footer,omitempty" json:"footer,omitempty"`
FooterIcon string `yaml:"footer_icon,omitempty" json:"footer_icon,omitempty"`
ImageURL string `yaml:"image_url,omitempty" json:"image_url,omitempty"`
}
type mattermostField struct {
Title string `yaml:"title,omitempty" json:"title,omitempty"`
Value string `yaml:"value,omitempty" json:"value,omitempty"`
Short bool `yaml:"short,omitempty" json:"short,omitempty"`
}
type mattermostPropsConfig struct {
Card *string `yaml:"card,omitempty" json:"card,omitempty"`
}
type mattermostPriorityConfig struct {
Priority string `yaml:"priority,omitempty" json:"priority,omitempty"`
RequestedAck *bool `yaml:"requested_ack,omitempty" json:"requested_ack,omitempty"`
PersistentNotifications *bool `yaml:"persistent_notifications,omitempty" json:"persistent_notifications,omitempty"`
}
type timeInterval config.TimeInterval

View File

@@ -114,7 +114,6 @@ func validateReceivers(receivers []monitoringv1alpha1.Receiver) (map[string]stru
if err := validateMSTeamsV2Configs(receiver.MSTeamsV2Configs); err != nil {
return nil, fmt.Errorf("failed to validate 'msteamsv2Config' - receiver %s: %w", receiver.Name, err)
}
}
return receiverNames, nil

View File

@@ -114,7 +114,6 @@ func validateReceivers(receivers []monitoringv1beta1.Receiver) (map[string]struc
if err := validateMSTeamsV2Configs(receiver.MSTeamsV2Configs); err != nil {
return nil, fmt.Errorf("failed to validate 'msteamsv2Config' - receiver %s: %w", receiver.Name, err)
}
}
return receiverNames, nil