Skip to content

Commit 0e05778

Browse files
add active-timings to rule's notification settings (#2292)
1 parent dd06529 commit 0e05778

File tree

3 files changed

+61
-3
lines changed

3 files changed

+61
-3
lines changed

docs/resources/rule_group.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ Required:
183183

184184
Optional:
185185

186+
- `active_timings` (List of String) A list of time interval names to apply to alerts that match this policy to suppress them unless they are sent at the specified time. Supported in Grafana 12.1.0 and later
186187
- `group_by` (List of String) A list of alert labels to group alerts into notifications by. Use the special label `...` to group alerts by all labels, effectively disabling grouping. If empty, no grouping is used. If specified, requires labels 'alertname' and 'grafana_folder' to be included.
187188
- `group_interval` (String) Minimum time interval between two notifications for the same group. Default is 5 minutes.
188189
- `group_wait` (String) Time to wait to buffer alerts of the same group before sending a notification. Default is 30 seconds.

internal/resources/grafana/resource_alerting_rule_group.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,14 @@ This resource requires Grafana 9.1.0 or later.
255255
Type: schema.TypeString,
256256
},
257257
},
258+
"active_timings": {
259+
Type: schema.TypeList,
260+
Optional: true,
261+
Description: "A list of time interval names to apply to alerts that match this policy to suppress them unless they are sent at the specified time. Supported in Grafana 12.1.0 and later",
262+
Elem: &schema.Schema{
263+
Type: schema.TypeString,
264+
},
265+
},
258266
"group_wait": {
259267
Type: schema.TypeString,
260268
Optional: true,
@@ -789,6 +797,13 @@ func packNotificationSettings(settings *models.AlertRuleNotificationSettings) (i
789797
}
790798
result["mute_timings"] = g
791799
}
800+
if len(settings.ActiveTimeIntervals) > 0 {
801+
g := make([]interface{}, 0, len(settings.ActiveTimeIntervals))
802+
for _, s := range settings.ActiveTimeIntervals {
803+
g = append(g, s)
804+
}
805+
result["active_timings"] = g
806+
}
792807
if settings.GroupWait != "" {
793808
result["group_wait"] = settings.GroupWait
794809
}
@@ -827,6 +842,9 @@ func unpackNotificationSettings(p interface{}) (*models.AlertRuleNotificationSet
827842
if v, ok := jsonData["mute_timings"]; ok && v != nil {
828843
result.MuteTimeIntervals = common.ListToStringSlice(v.([]interface{}))
829844
}
845+
if v, ok := jsonData["active_timings"]; ok && v != nil {
846+
result.ActiveTimeIntervals = common.ListToStringSlice(v.([]interface{}))
847+
}
830848
if v, ok := jsonData["group_wait"]; ok && v != nil {
831849
result.GroupWait = v.(string)
832850
}

internal/resources/grafana/resource_alerting_rule_group_test.go

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -843,7 +843,7 @@ func TestAccAlertRule_NotificationSettings(t *testing.T) {
843843
CheckDestroy: alertingRuleGroupCheckExists.destroyed(&group, nil),
844844
Steps: []resource.TestStep{
845845
{
846-
Config: testAccAlertRuleWithNotificationSettings(name, []string{"alertname", "grafana_folder", "test"}),
846+
Config: testAccAlertRuleWithNotificationSettings(name, []string{"alertname", "grafana_folder", "test"}, false),
847847
Check: resource.ComposeTestCheckFunc(
848848
alertingRuleGroupCheckExists.exists("grafana_rule_group.my_rule_group", &group),
849849
resource.TestCheckResourceAttr("grafana_rule_group.my_rule_group", "name", name),
@@ -865,6 +865,40 @@ func TestAccAlertRule_NotificationSettings(t *testing.T) {
865865
})
866866
}
867867

868+
func TestAccAlertRule_NotificationSettings_ActiveTimings(t *testing.T) {
869+
testutils.CheckOSSTestsEnabled(t, ">=12.1.0")
870+
871+
var group models.AlertRuleGroup
872+
var name = acctest.RandString(10)
873+
874+
resource.ParallelTest(t, resource.TestCase{
875+
ProtoV5ProviderFactories: testutils.ProtoV5ProviderFactories,
876+
CheckDestroy: alertingRuleGroupCheckExists.destroyed(&group, nil),
877+
Steps: []resource.TestStep{
878+
{
879+
Config: testAccAlertRuleWithNotificationSettings(name, []string{"alertname", "grafana_folder", "test"}, true),
880+
Check: resource.ComposeTestCheckFunc(
881+
alertingRuleGroupCheckExists.exists("grafana_rule_group.my_rule_group", &group),
882+
resource.TestCheckResourceAttr("grafana_rule_group.my_rule_group", "name", name),
883+
resource.TestCheckResourceAttr("grafana_rule_group.my_rule_group", "rule.#", "1"),
884+
resource.TestCheckResourceAttr("grafana_rule_group.my_rule_group", "rule.0.name", fmt.Sprintf("%s-alertrule", name)),
885+
resource.TestCheckResourceAttr("grafana_rule_group.my_rule_group", "rule.0.notification_settings.0.contact_point", fmt.Sprintf("%s-receiver", name)),
886+
resource.TestCheckResourceAttr("grafana_rule_group.my_rule_group", "rule.0.notification_settings.0.group_wait", "45s"),
887+
resource.TestCheckResourceAttr("grafana_rule_group.my_rule_group", "rule.0.notification_settings.0.group_interval", "6m"),
888+
resource.TestCheckResourceAttr("grafana_rule_group.my_rule_group", "rule.0.notification_settings.0.repeat_interval", "3h"),
889+
resource.TestCheckResourceAttr("grafana_rule_group.my_rule_group", "rule.0.notification_settings.0.mute_timings.#", "1"),
890+
resource.TestCheckResourceAttr("grafana_rule_group.my_rule_group", "rule.0.notification_settings.0.mute_timings.0", fmt.Sprintf("%s-mute-timing", name)),
891+
resource.TestCheckResourceAttr("grafana_rule_group.my_rule_group", "rule.0.notification_settings.0.active_timings.0", fmt.Sprintf("%s-mute-timing", name)),
892+
resource.TestCheckResourceAttr("grafana_rule_group.my_rule_group", "rule.0.notification_settings.0.group_by.#", "3"),
893+
resource.TestCheckResourceAttr("grafana_rule_group.my_rule_group", "rule.0.notification_settings.0.group_by.0", "alertname"),
894+
resource.TestCheckResourceAttr("grafana_rule_group.my_rule_group", "rule.0.notification_settings.0.group_by.1", "grafana_folder"),
895+
resource.TestCheckResourceAttr("grafana_rule_group.my_rule_group", "rule.0.notification_settings.0.group_by.2", "test"),
896+
),
897+
},
898+
},
899+
})
900+
}
901+
868902
func TestAccRecordingRule(t *testing.T) {
869903
testutils.CheckOSSTestsEnabled(t, ">=11.4.0")
870904

@@ -999,12 +1033,16 @@ resource "grafana_rule_group" "my_rule_group" {
9991033
}`, name)
10001034
}
10011035

1002-
func testAccAlertRuleWithNotificationSettings(name string, groupBy []string) string {
1036+
func testAccAlertRuleWithNotificationSettings(name string, groupBy []string, hasActiveTimings bool) string {
10031037
gr := ""
10041038
if len(groupBy) > 0 {
10051039
b, _ := json.Marshal(groupBy)
10061040
gr = "group_by = " + string(b)
10071041
}
1042+
activeTimings := ""
1043+
if hasActiveTimings {
1044+
activeTimings = "active_timings = [grafana_mute_timing.my_mute_timing.name]"
1045+
}
10081046
return fmt.Sprintf(`
10091047
resource "grafana_folder" "rule_folder" {
10101048
title = "%[1]s"
@@ -1060,9 +1098,10 @@ resource "grafana_rule_group" "my_rule_group" {
10601098
group_interval = "6m"
10611099
repeat_interval = "3h"
10621100
mute_timings = [grafana_mute_timing.my_mute_timing.name]
1101+
%[3]s
10631102
}
10641103
}
1065-
}`, name, gr)
1104+
}`, name, gr, activeTimings)
10661105
}
10671106

10681107
func testAccRecordingRule(name string, metric string, refID string) string {

0 commit comments

Comments
 (0)