From 450a1396e3327f58ced07d97a93912556548eeb0 Mon Sep 17 00:00:00 2001 From: Jayapriya Pai Date: Mon, 3 Feb 2025 16:25:43 +0530 Subject: [PATCH] feat: add timeout field in Webhook receiver Signed-off-by: Jayapriya Pai Co-Authored-by Nutmos --- CHANGELOG.md | 1 + pkg/alertmanager/amcfg.go | 6 ++++ pkg/alertmanager/amcfg_test.go | 32 +++++++++++++++++++ ...bhook_config_for_supported_versions.golden | 5 +++ ...ook_config_for_unsupported_versions.golden | 5 +++ pkg/alertmanager/types.go | 1 + 6 files changed, 50 insertions(+) create mode 100644 pkg/alertmanager/testdata/test_webhook_timeout_is_added_in_webhook_config_for_supported_versions.golden create mode 100644 pkg/alertmanager/testdata/test_webhook_timeout_is_dropped_in_webhook_config_for_unsupported_versions.golden diff --git a/CHANGELOG.md b/CHANGELOG.md index efaa62ef4..1958cddfc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * [FEATURE] Add `keepIdentifyingResourceAttributes` field in OTLPConfig for `Prometheus` and `PrometheusAgent` CRDs. #7240 * [FEATURE] Add `fallbackScrapeProtocol` field to ScrapeClass for `Prometheus` and `PrometheusAgent` CRDs. #7288 * [FEATURE] Support `MSTeamsV2Config` receiver in Alertmanager configuration Secret. #7296 +* [FEATURE] Add `Timeout` field in Webhook receiver in Alertmanager configuration Secret. #7312 * [FEATURE] Add `scrapeFailureLogFile` field to the Prometheus and PrometheusAgent CRDs. #7038 #7311 * [BUGFIX] Validate respective api URL field in PagerDutyConfigs, DiscordConfigs, SlackConfigs and WebhookConfigs in AlertManagerConfig CRD. #6585 diff --git a/pkg/alertmanager/amcfg.go b/pkg/alertmanager/amcfg.go index 1cdc14194..b75d32fbf 100644 --- a/pkg/alertmanager/amcfg.go +++ b/pkg/alertmanager/amcfg.go @@ -2240,6 +2240,12 @@ func (whc *webhookConfig) sanitize(amVersion semver.Version, logger *slog.Logger whc.URLFile = "" } + if whc.Timeout != nil && amVersion.LT(semver.MustParse("0.28.0")) { + msg := "'timeout' supported in Alertmanager >= 0.28.0 only - dropping field from provided config" + logger.Warn(msg, "current_version", amVersion.String()) + whc.Timeout = nil + } + return nil } diff --git a/pkg/alertmanager/amcfg_test.go b/pkg/alertmanager/amcfg_test.go index 7b56bd051..9ba2a4cb2 100644 --- a/pkg/alertmanager/amcfg_test.go +++ b/pkg/alertmanager/amcfg_test.go @@ -3649,6 +3649,38 @@ func TestSanitizeWebhookConfig(t *testing.T) { }, golden: "test_url_takes_precedence_in_webhook_config.golden", }, + { + name: "Test timeout is dropped in webhook config for unsupported versions", + againstVersion: semver.Version{Major: 0, Minor: 26}, + in: &alertmanagerConfig{ + Receivers: []*receiver{ + { + WebhookConfigs: []*webhookConfig{ + { + Timeout: ptr.To(model.Duration(time.Minute)), + }, + }, + }, + }, + }, + golden: "test_webhook_timeout_is_dropped_in_webhook_config_for_unsupported_versions.golden", + }, + { + name: "Test timeout is added in webhook config for supported versions", + againstVersion: semver.Version{Major: 0, Minor: 28}, + in: &alertmanagerConfig{ + Receivers: []*receiver{ + { + WebhookConfigs: []*webhookConfig{ + { + Timeout: ptr.To(model.Duration(time.Minute)), + }, + }, + }, + }, + }, + golden: "test_webhook_timeout_is_added_in_webhook_config_for_supported_versions.golden", + }, } { t.Run(tc.name, func(t *testing.T) { err := tc.in.sanitize(tc.againstVersion, logger) diff --git a/pkg/alertmanager/testdata/test_webhook_timeout_is_added_in_webhook_config_for_supported_versions.golden b/pkg/alertmanager/testdata/test_webhook_timeout_is_added_in_webhook_config_for_supported_versions.golden new file mode 100644 index 000000000..59e6cfa43 --- /dev/null +++ b/pkg/alertmanager/testdata/test_webhook_timeout_is_added_in_webhook_config_for_supported_versions.golden @@ -0,0 +1,5 @@ +receivers: +- name: "" + webhook_configs: + - timeout: 1m +templates: [] diff --git a/pkg/alertmanager/testdata/test_webhook_timeout_is_dropped_in_webhook_config_for_unsupported_versions.golden b/pkg/alertmanager/testdata/test_webhook_timeout_is_dropped_in_webhook_config_for_unsupported_versions.golden new file mode 100644 index 000000000..021ae0372 --- /dev/null +++ b/pkg/alertmanager/testdata/test_webhook_timeout_is_dropped_in_webhook_config_for_unsupported_versions.golden @@ -0,0 +1,5 @@ +receivers: +- name: "" + webhook_configs: + - {} +templates: [] diff --git a/pkg/alertmanager/types.go b/pkg/alertmanager/types.go index bbd214ba1..6a170097e 100644 --- a/pkg/alertmanager/types.go +++ b/pkg/alertmanager/types.go @@ -120,6 +120,7 @@ type webhookConfig struct { URLFile string `yaml:"url_file,omitempty" json:"url_file,omitempty"` HTTPConfig *httpClientConfig `yaml:"http_config,omitempty" json:"http_config,omitempty"` MaxAlerts int32 `yaml:"max_alerts,omitempty" json:"max_alerts,omitempty"` + Timeout *model.Duration `yaml:"timeout,omitempty" json:"timeout,omitempty"` } type pagerdutyConfig struct {