Skip to content

Commit 63c47ee

Browse files
authored
Merge pull request #786 from SumoLogic/aman_tf_monitor_playbooks
Adding support for linking playbooks to monitors
2 parents 2c8ddb8 + 645d13b commit 63c47ee

File tree

5 files changed

+153
-0
lines changed

5 files changed

+153
-0
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
## X.Y.Z (Unreleased)
22
* Add new change notes here
33

4+
FEATURES:
5+
* **Updated sumologic_monitor resource:** Added support for automated playbooks in monitors
6+
47
## 3.1.1 (July 8, 2025)
58

69
ENHANCEMENTS:

sumologic/resource_sumologic_monitors_library_monitor.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,14 @@ func getMonitorBaseSchema() map[string]*schema.Schema {
208208
Optional: true,
209209
},
210210

211+
"automated_playbook_ids": {
212+
Type: schema.TypeList,
213+
Optional: true,
214+
Elem: &schema.Schema{
215+
Type: schema.TypeString,
216+
},
217+
},
218+
211219
"slo_id": {
212220
Type: schema.TypeString,
213221
Optional: true,
@@ -897,6 +905,7 @@ func resourceSumologicMonitorsLibraryMonitorRead(d *schema.ResourceData, meta in
897905
d.Set("status", monitor.Status)
898906
d.Set("group_notifications", monitor.GroupNotifications)
899907
d.Set("playbook", monitor.Playbook)
908+
d.Set("automated_playbook_ids", monitor.AutomatedPlaybookIds)
900909
d.Set("alert_name", monitor.AlertName)
901910
d.Set("slo_id", monitor.SloID)
902911
d.Set("notification_group_fields", monitor.NotificationGroupFields)
@@ -1759,6 +1768,12 @@ func resourceToMonitorsLibraryMonitor(d *schema.ResourceData) MonitorsLibraryMon
17591768
notificationGroupFields[i] = rawGroupFields[i].(string)
17601769
}
17611770

1771+
rawPlaybookIds := d.Get("automated_playbook_ids").([]interface{})
1772+
automatedPlaybookIds := make([]string, len(rawPlaybookIds))
1773+
for i := range rawPlaybookIds {
1774+
automatedPlaybookIds[i] = rawPlaybookIds[i].(string)
1775+
}
1776+
17621777
return MonitorsLibraryMonitor{
17631778
CreatedBy: d.Get("created_by").(string),
17641779
Name: d.Get("name").(string),
@@ -1784,6 +1799,7 @@ func resourceToMonitorsLibraryMonitor(d *schema.ResourceData) MonitorsLibraryMon
17841799
Status: status,
17851800
GroupNotifications: d.Get("group_notifications").(bool),
17861801
Playbook: d.Get("playbook").(string),
1802+
AutomatedPlaybookIds: automatedPlaybookIds,
17871803
AlertName: d.Get("alert_name").(string),
17881804
SloID: d.Get("slo_id").(string),
17891805
NotificationGroupFields: notificationGroupFields,

sumologic/resource_sumologic_monitors_library_monitor_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,36 @@ func TestAccSumologicMonitorsLibraryMonitor_basic(t *testing.T) {
190190
},
191191
})
192192
}
193+
194+
func TestAccSumologicMonitorsLibraryMonitor_create_monitor_with_linked_playbook(t *testing.T) {
195+
var monitorsLibraryMonitor MonitorsLibraryMonitor
196+
testNameSuffix := acctest.RandString(16)
197+
198+
testName := "terraform_test_monitor_" + testNameSuffix
199+
200+
// NOTE: This playbook ID refers to a static playbook `[Do Not Delete] Playbook Used in Terraform Tests`. Replace with a valid playbook ID in your environment.
201+
playbook_id := "6877cae1fb301f15fca89f67"
202+
203+
resource.Test(t, resource.TestCase{
204+
PreCheck: func() { testAccPreCheck(t) },
205+
Providers: testAccProviders,
206+
CheckDestroy: testAccCheckMonitorsLibraryMonitorDestroy(),
207+
Steps: []resource.TestStep{
208+
{
209+
Config: testAccSumologicMonitorWithLinkedPlaybook(testName, playbook_id),
210+
Check: resource.ComposeTestCheckFunc(
211+
testAccCheckMonitorsLibraryMonitorExists("sumologic_monitor.test", &monitorsLibraryMonitor),
212+
resource.TestCheckResourceAttr("sumologic_monitor.test", "automated_playbook_ids.0", playbook_id)),
213+
},
214+
{
215+
ResourceName: "sumologic_monitor.test",
216+
ImportState: true,
217+
ImportStateVerify: false,
218+
},
219+
},
220+
})
221+
}
222+
193223
func TestAccSumologicMonitorsLibraryMonitor_create(t *testing.T) {
194224
var monitorsLibraryMonitor MonitorsLibraryMonitor
195225
testNameSuffix := acctest.RandString(16)
@@ -796,6 +826,56 @@ func testAccCheckMonitorsLibraryMonitorAttributes(name string) resource.TestChec
796826
}
797827
}
798828

829+
func testAccSumologicMonitorWithLinkedPlaybook(testName, playbookId string) string {
830+
return fmt.Sprintf(`
831+
resource "sumologic_monitor" "test" {
832+
name = "terraform_test_monitor_%s"
833+
description = "terraform_test_monitor_description"
834+
type = "MonitorsLibraryMonitor"
835+
is_disabled = false
836+
content_type = "Monitor"
837+
monitor_type = "Logs"
838+
evaluation_delay = "60m"
839+
time_zone = "America/New_York"
840+
queries {
841+
row_id = "A"
842+
query = "_sourceCategory=monitor-manager error"
843+
}
844+
triggers {
845+
threshold_type = "GreaterThan"
846+
threshold = 40.0
847+
time_range = "-60m"
848+
occurrence_type = "ResultCount"
849+
trigger_source = "AllResults"
850+
trigger_type = "Critical"
851+
detection_method = "StaticCondition"
852+
}
853+
triggers {
854+
threshold_type = "LessThanOrEqual"
855+
threshold = 40.0
856+
time_range = "-60m"
857+
occurrence_type = "ResultCount"
858+
trigger_source = "AllResults"
859+
trigger_type = "ResolvedCritical"
860+
detection_method = "StaticCondition"
861+
resolution_window = "5m"
862+
}
863+
notifications {
864+
notification {
865+
connection_type = "Email"
866+
recipients = ["[email protected]"]
867+
subject = "test tf monitor"
868+
time_zone = "PST"
869+
message_body = "test"
870+
}
871+
run_for_trigger_types = ["Critical", "ResolvedCritical"]
872+
}
873+
playbook = "This is a test playbook"
874+
automated_playbook_ids = ["%s"]
875+
alert_name = "Alert from {{Name}}"
876+
}`, testName, playbookId)
877+
}
878+
799879
func testAccSumologicMonitorsLibraryMonitor(testName string) string {
800880
return fmt.Sprintf(`
801881
resource "sumologic_monitor" "test" {

sumologic/sumologic_monitors_library_monitor.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ type MonitorsLibraryMonitor struct {
146146
Status []string `json:"status"`
147147
GroupNotifications bool `json:"groupNotifications"`
148148
Playbook string `json:"playbook,omitempty"`
149+
AutomatedPlaybookIds []string `json:"automatedPlaybookIds,omitempty"`
149150
AlertName string `json:"alertName,omitempty"`
150151
SloID string `json:"sloId,omitempty"`
151152
NotificationGroupFields []string `json:"notificationGroupFields,omitempty"`

website/docs/r/monitor.html.markdown

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,59 @@ resource "sumologic_monitor" "tf_example_metrics_anomaly_monitor" {
417417
}
418418
```
419419

420+
## Example Monitor with linked Playbook
421+
```hcl
422+
resource "sumologic_monitor" "tf_monitor_with_playbook" {
423+
name = "Terraform Monitor with Playbook"
424+
description = "tf monitor with Playbook"
425+
type = "MonitorsLibraryMonitor"
426+
is_disabled = false
427+
content_type = "Monitor"
428+
monitor_type = "Metrics"
429+
evaluation_delay = "1m"
430+
tags = {
431+
"team" = "monitoring"
432+
"application" = "sumologic"
433+
}
434+
435+
queries {
436+
row_id = "A"
437+
query = "metric=CPU* _sourceCategory=event-action"
438+
}
439+
440+
trigger_conditions {
441+
metrics_static_condition {
442+
critical {
443+
time_range = "15m"
444+
occurrence_type = "Always"
445+
alert {
446+
threshold = 40.0
447+
threshold_type = "GreaterThan"
448+
min_data_points = 5
449+
}
450+
resolution {
451+
threshold = 40.0
452+
threshold_type = "LessThanOrEqual"
453+
}
454+
}
455+
}
456+
}
457+
notifications {
458+
notification {
459+
connection_type = "Email"
460+
recipients = ["[email protected]"]
461+
subject = "Triggered {{TriggerType}} Alert on Monitor {{Name}}"
462+
time_zone = "PST"
463+
message_body = "Triggered {{TriggerType}} Alert on {{Name}}: {{QueryURL}}"
464+
}
465+
run_for_trigger_types = ["Critical", "ResolvedCritical"]
466+
}
467+
playbook = "test playbook"
468+
automated_playbook_ids = ["683a60a123ad6099e4d1333e"]
469+
notification_group_fields = ["metric"]
470+
}
471+
```
472+
420473
## Monitor Folders
421474

422475
NOTE: Monitor folders are considered a different resource from Library content folders. See [sumologic_monitor_folder][2] for more details.

0 commit comments

Comments
 (0)