From 233ba8ae2b8a338a4a3779bd345c55f1f293839b Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Fri, 12 Apr 2024 08:57:17 -0600 Subject: [PATCH] test parsing slack messages --- message.go | 93 ++++++++- message_test.go | 113 ++++++++++ testdata/slack_events/human_message.json | 51 ++++- .../slack_events/human_thread_message.json | 53 ++++- ...an_thread_message_from_opsgenie_alert.json | 53 ++++- testdata/slack_events/opsgenie_alert.json | 128 +++++++++++- testdata/slack_events/opsgenie_alert_2.json | 193 ++++++++++++++++- testdata/slack_events/opsgenie_alert_3.json | 128 +++++++++++- .../slack_events/opsgenie_alert_resolved.json | 194 +++++++++++++++++- .../opsgenie_alert_resolved_fyi.json | 56 ++++- 10 files changed, 1052 insertions(+), 10 deletions(-) create mode 100644 message_test.go diff --git a/message.go b/message.go index 6728ec8..21c535f 100644 --- a/message.go +++ b/message.go @@ -1,6 +1,11 @@ package main -import "encoding/json" +import ( + "encoding/json" + "fmt" + "strconv" + "strings" +) type Message struct { ID string @@ -39,3 +44,89 @@ func Deserialize(b []byte) (Message, error) { err := json.Unmarshal(b, &m) return m, err } + +type ( + slackMessage struct { + TS uint64 `json:"event_time"` + Event slackEvent + } + + slackEvent struct { + ID string `json:"event_ts"` + Channel string + // human + ParentID string `json:"thread_ts"` + Text string + Blocks []slackBlock + // bot + Bot slackBot `json:"bot_profile"` + Attachments []slackAttachment + } + + slackBlock struct { + Elements []slackElement + } + + slackElement struct { + Elements []slackElement + RichText string `json:"text"` + } + + slackBot struct { + Name string + } + + slackAttachment struct { + Color string + Title string + Text string + Fields []slackField + Actions []slackAction + } + + slackField struct { + Value string + Title string + } + + slackAction struct{} +) + +func ParseSlack(b []byte) (Message, error) { + s, err := parseSlack(b) + if err != nil { + return Message{}, err + } + + if s.Event.Bot.Name != "" { + return Message{ + ID: strconv.FormatUint(s.TS, 10), + TS: s.TS, + Source: fmt.Sprintf(`https://renderinc.slack.com/archives/%s/p%s`, s.Event.Channel, strings.ReplaceAll(s.Event.ID, ".", "")), + Channel: s.Event.Channel, + Thread: s.Event.ID, + EventName: strings.Split(s.Event.Attachments[0].Title, ": Firing: ")[1], + Event: strings.Split(s.Event.Attachments[0].Title, ":")[0], + Plaintext: s.Event.Attachments[0].Text, + Asset: "TODO", + }, nil + } + + return Message{ + ID: strconv.FormatUint(s.TS, 10), + TS: s.TS, + Source: fmt.Sprintf(`https://renderinc.slack.com/archives/%s/p%s`, s.Event.Channel, strings.ReplaceAll(s.Event.ParentID, ".", "")), + Channel: s.Event.Channel, + Thread: s.Event.ParentID, + EventName: "TODO", + Event: "TODO", + Plaintext: s.Event.Text, + Asset: "TODO", + }, nil +} + +func parseSlack(b []byte) (slackMessage, error) { + var result slackMessage + err := json.Unmarshal(b, &result) + return result, err +} diff --git a/message_test.go b/message_test.go new file mode 100644 index 0000000..a73026a --- /dev/null +++ b/message_test.go @@ -0,0 +1,113 @@ +package main + +import ( + "fmt" + "os" + "path" + "testing" +) + +func TestParseSlackTestdata(t *testing.T) { + cases := map[string]struct { + slackMessage slackMessage + message Message + }{ + "human_thread_message_from_opsgenie_alert.json": { + slackMessage: slackMessage{ + TS: 1712930706, + Event: slackEvent{ + ID: "1712930706.598629", + Channel: "C06U1DDBBU4", + ParentID: "1712927439.728409", + Text: "I gotta do this", + Blocks: []slackBlock{{ + Elements: []slackElement{{ + Elements: []slackElement{{ + RichText: "I gotta do this", + }}, + }}, + }}, + Bot: slackBot{ + Name: "", + }, + Attachments: []slackAttachment{}, + }, + }, + message: Message{ + ID: "1712930706", + TS: 1712930706, + Source: "https://renderinc.slack.com/archives/C06U1DDBBU4/p1712927439728409", + Channel: "C06U1DDBBU4", + Thread: "1712927439.728409", + EventName: "TODO", + Event: "TODO", + Plaintext: "I gotta do this", + Asset: "TODO", + }, + }, + "opsgenie_alert.json": { + slackMessage: slackMessage{ + TS: 1712927439, + Event: slackEvent{ + ID: "1712927439.728409", + Channel: "C06U1DDBBU4", + Bot: slackBot{ + Name: "Opsgenie for Alert Management", + }, + Attachments: []slackAttachment{{ + Color: "F4511E", + Title: "#11071: [Grafana]: Firing: Alertconfig Workflow Failed", + Text: "At least one alertconfig run has failed unexpectedly.\nDashboard: \nPanel: \nSource: ", + Fields: []slackField{ + {Value: "P3", Title: "Priority"}, + {Value: "alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb", Title: "Tags"}, + {Value: "Datastores Non-Critical", Title: "Routed Teams"}, + }, + Actions: []slackAction{{}, {}, {}}, + }}, + }, + }, + message: Message{ + ID: "1712927439", + TS: 1712927439, + Source: "https://renderinc.slack.com/archives/C06U1DDBBU4/p1712927439728409", + Channel: "C06U1DDBBU4", + Thread: "1712927439.728409", + EventName: "Alertconfig Workflow Failed", + Event: "#11071", + Plaintext: "At least one alertconfig run has failed unexpectedly.\nDashboard: \nPanel: \nSource: ", + Asset: "TODO", + }, + }, + } + + for name, d := range cases { + want := d + t.Run(name, func(t *testing.T) { + b, err := os.ReadFile(path.Join("testdata", "slack_events", name)) + if err != nil { + t.Fatal(err) + } + + t.Run("parseSlack", func(t *testing.T) { + got, err := parseSlack(b) + if err != nil { + t.Fatal(err) + } + if fmt.Sprintf("%+v", got) != fmt.Sprintf("%+v", want.slackMessage) { + t.Errorf("wanted \n\t%+v, got\n\t%+v", want.slackMessage, got) + } + }) + + t.Run("ParseSlack", func(t *testing.T) { + got, err := ParseSlack(b) + if err != nil { + t.Fatal(err) + } + if got != want.message { + t.Errorf("wanted \n\t%+v, got\n\t%+v", want.message, got) + } + }) + }) + } +} diff --git a/testdata/slack_events/human_message.json b/testdata/slack_events/human_message.json index 6259def..a808a7b 100644 --- a/testdata/slack_events/human_message.json +++ b/testdata/slack_events/human_message.json @@ -1 +1,50 @@ -{"hint":"a message", "token":"redacted","team_id":"T9RQLQ0KV","context_team_id":"T9RQLQ0KV","context_enterprise_id":null,"api_app_id":"A06TYH7CALB","event":{"user":"U06868T6ADV","type":"message","ts":"1712878479.415559","client_msg_id":"fce57841-0446-4720-aa1d-557e162c7667","text":"BOTH OF YOU GET IN HERE HEEEHEEEHEEE","team":"T9RQLQ0KV","blocks":[{"type":"rich_text","block_id":"6G5BZ","elements":[{"type":"rich_text_section","elements":[{"type":"text","text":"BOTH OF YOU GET IN HERE HEEEHEEEHEEE"}]}]}],"channel":"C06U1DDBBU4","event_ts":"1712878479.415559","channel_type":"channel"},"type":"event_callback","event_id":"Ev06U1F01XMJ","event_time":1712878479,"authorizations":[{"enterprise_id":null,"team_id":"T9RQLQ0KV","user_id":"U06TS9M7ABG","is_bot":true,"is_enterprise_install":false}],"is_ext_shared_channel":false,"event_context":"4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUOVJRTFEwS1YiLCJhaWQiOiJBMDZUWUg3Q0FMQiIsImNpZCI6IkMwNlUxRERCQlU0In0"} +{ + "hint": "a message", + "token": "redacted", + "team_id": "T9RQLQ0KV", + "context_team_id": "T9RQLQ0KV", + "context_enterprise_id": null, + "api_app_id": "A06TYH7CALB", + "event": { + "user": "U06868T6ADV", + "type": "message", + "ts": "1712878479.415559", + "client_msg_id": "fce57841-0446-4720-aa1d-557e162c7667", + "text": "BOTH OF YOU GET IN HERE HEEEHEEEHEEE", + "team": "T9RQLQ0KV", + "blocks": [ + { + "type": "rich_text", + "block_id": "6G5BZ", + "elements": [ + { + "type": "rich_text_section", + "elements": [ + { + "type": "text", + "text": "BOTH OF YOU GET IN HERE HEEEHEEEHEEE" + } + ] + } + ] + } + ], + "channel": "C06U1DDBBU4", + "event_ts": "1712878479.415559", + "channel_type": "channel" + }, + "type": "event_callback", + "event_id": "Ev06U1F01XMJ", + "event_time": 1712878479, + "authorizations": [ + { + "enterprise_id": null, + "team_id": "T9RQLQ0KV", + "user_id": "U06TS9M7ABG", + "is_bot": true, + "is_enterprise_install": false + } + ], + "is_ext_shared_channel": false, + "event_context": "4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUOVJRTFEwS1YiLCJhaWQiOiJBMDZUWUg3Q0FMQiIsImNpZCI6IkMwNlUxRERCQlU0In0" +} diff --git a/testdata/slack_events/human_thread_message.json b/testdata/slack_events/human_thread_message.json index 388bab6..5438e09 100644 --- a/testdata/slack_events/human_thread_message.json +++ b/testdata/slack_events/human_thread_message.json @@ -1 +1,52 @@ -{"hint":"a thread message", "token":"redacted","team_id":"T9RQLQ0KV","context_team_id":"T9RQLQ0KV","context_enterprise_id":null,"api_app_id":"A06TYH7CALB","event":{"user":"U06868T6ADV","type":"message","ts":"1712878566.650149","client_msg_id":"5d9d586b-eee0-40f8-b15e-66245c073a4c","text":"in a thread","team":"T9RQLQ0KV","thread_ts":"1712877772.926539","parent_user_id":"U06868T6ADV","blocks":[{"type":"rich_text","block_id":"KHSCu","elements":[{"type":"rich_text_section","elements":[{"type":"text","text":"in a thread"}]}]}],"channel":"C06U1DDBBU4","event_ts":"1712878566.650149","channel_type":"channel"},"type":"event_callback","event_id":"Ev06TW3WE58V","event_time":1712878566,"authorizations":[{"enterprise_id":null,"team_id":"T9RQLQ0KV","user_id":"U06TS9M7ABG","is_bot":true,"is_enterprise_install":false}],"is_ext_shared_channel":false,"event_context":"4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUOVJRTFEwS1YiLCJhaWQiOiJBMDZUWUg3Q0FMQiIsImNpZCI6IkMwNlUxRERCQlU0In0"} +{ + "hint": "a thread message", + "token": "redacted", + "team_id": "T9RQLQ0KV", + "context_team_id": "T9RQLQ0KV", + "context_enterprise_id": null, + "api_app_id": "A06TYH7CALB", + "event": { + "user": "U06868T6ADV", + "type": "message", + "ts": "1712878566.650149", + "client_msg_id": "5d9d586b-eee0-40f8-b15e-66245c073a4c", + "text": "in a thread", + "team": "T9RQLQ0KV", + "thread_ts": "1712877772.926539", + "parent_user_id": "U06868T6ADV", + "blocks": [ + { + "type": "rich_text", + "block_id": "KHSCu", + "elements": [ + { + "type": "rich_text_section", + "elements": [ + { + "type": "text", + "text": "in a thread" + } + ] + } + ] + } + ], + "channel": "C06U1DDBBU4", + "event_ts": "1712878566.650149", + "channel_type": "channel" + }, + "type": "event_callback", + "event_id": "Ev06TW3WE58V", + "event_time": 1712878566, + "authorizations": [ + { + "enterprise_id": null, + "team_id": "T9RQLQ0KV", + "user_id": "U06TS9M7ABG", + "is_bot": true, + "is_enterprise_install": false + } + ], + "is_ext_shared_channel": false, + "event_context": "4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUOVJRTFEwS1YiLCJhaWQiOiJBMDZUWUg3Q0FMQiIsImNpZCI6IkMwNlUxRERCQlU0In0" +} diff --git a/testdata/slack_events/human_thread_message_from_opsgenie_alert.json b/testdata/slack_events/human_thread_message_from_opsgenie_alert.json index cebfe6a..ae16f72 100644 --- a/testdata/slack_events/human_thread_message_from_opsgenie_alert.json +++ b/testdata/slack_events/human_thread_message_from_opsgenie_alert.json @@ -1 +1,52 @@ -{"hint": "a thread reply to an alert", "token":"redacted","team_id":"T9RQLQ0KV","context_team_id":"T9RQLQ0KV","context_enterprise_id":null,"api_app_id":"A06TYH7CALB","event":{"user":"U06868T6ADV","type":"message","ts":"1712930706.598629","client_msg_id":"880fc69f-de95-4c1e-90a7-aae701a40c21","text":"I gotta do this","team":"T9RQLQ0KV","thread_ts":"1712927439.728409","parent_user_id":"U03RUK7FBUY","blocks":[{"type":"rich_text","block_id":"Cp0IU","elements":[{"type":"rich_text_section","elements":[{"type":"text","text":"I gotta do this"}]}]}],"channel":"C06U1DDBBU4","event_ts":"1712930706.598629","channel_type":"channel"},"type":"event_callback","event_id":"Ev06UF3U1LM7","event_time":1712930706,"authorizations":[{"enterprise_id":null,"team_id":"T9RQLQ0KV","user_id":"U06TS9M7ABG","is_bot":true,"is_enterprise_install":false}],"is_ext_shared_channel":false,"event_context":"4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUOVJRTFEwS1YiLCJhaWQiOiJBMDZUWUg3Q0FMQiIsImNpZCI6IkMwNlUxRERCQlU0In0"} +{ + "hint": "a thread reply to an alert", + "token": "redacted", + "team_id": "T9RQLQ0KV", + "context_team_id": "T9RQLQ0KV", + "context_enterprise_id": null, + "api_app_id": "A06TYH7CALB", + "event": { + "user": "U06868T6ADV", + "type": "message", + "ts": "1712930706.598629", + "client_msg_id": "880fc69f-de95-4c1e-90a7-aae701a40c21", + "text": "I gotta do this", + "team": "T9RQLQ0KV", + "thread_ts": "1712927439.728409", + "parent_user_id": "U03RUK7FBUY", + "blocks": [ + { + "type": "rich_text", + "block_id": "Cp0IU", + "elements": [ + { + "type": "rich_text_section", + "elements": [ + { + "type": "text", + "text": "I gotta do this" + } + ] + } + ] + } + ], + "channel": "C06U1DDBBU4", + "event_ts": "1712930706.598629", + "channel_type": "channel" + }, + "type": "event_callback", + "event_id": "Ev06UF3U1LM7", + "event_time": 1712930706, + "authorizations": [ + { + "enterprise_id": null, + "team_id": "T9RQLQ0KV", + "user_id": "U06TS9M7ABG", + "is_bot": true, + "is_enterprise_install": false + } + ], + "is_ext_shared_channel": false, + "event_context": "4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUOVJRTFEwS1YiLCJhaWQiOiJBMDZUWUg3Q0FMQiIsImNpZCI6IkMwNlUxRERCQlU0In0" +} diff --git a/testdata/slack_events/opsgenie_alert.json b/testdata/slack_events/opsgenie_alert.json index 26e03d4..c11d14e 100644 --- a/testdata/slack_events/opsgenie_alert.json +++ b/testdata/slack_events/opsgenie_alert.json @@ -1 +1,127 @@ -{"hint": "a new alert from opsgenie", "token":"redacted","team_id":"T9RQLQ0KV","context_team_id":"T9RQLQ0KV","context_enterprise_id":null,"api_app_id":"A06TYH7CALB","event":{"user":"U03RUK7FBUY","type":"message","ts":"1712927439.728409","bot_id":"B03RHGBPH2M","app_id":"A286WATV2","text":"","team":"T9RQLQ0KV","bot_profile":{"id":"B03RHGBPH2M","deleted":false,"name":"Opsgenie for Alert Management","updated":1658887059,"app_id":"A286WATV2","icons":{"image_36":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_36.png","image_48":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_48.png","image_72":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_72.png"},"team_id":"T9RQLQ0KV"},"attachments":[{"id":1,"color":"F4511E","fallback":"New alert: \"[Grafana]: Firing: Alertconfig Workflow Failed\" \nTags: alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb","text":"At least one alertconfig run has failed unexpectedly.\nDashboard: \nPanel: \nSource: ","title":"#11071: [Grafana]: Firing: Alertconfig Workflow Failed","title_link":"https:\/\/opsg.in\/a\/i\/render\/38152bc5-bc5d-411d-9feb-d285af5b6481-1712927439305","author_name":"New Alert created via Grafana - Datastore Slack","callback_id":"bbd4a269-08a9-470e-ba79-ce238ac03dc7_05fa2e9b-bec4-4a7e-842d-36043d267a13_11071","fields":[{"value":"P3","title":"Priority","short":true},{"value":"alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb","title":"Tags","short":true},{"value":"Datastores Non-Critical","title":"Routed Teams","short":true}],"mrkdwn_in":["pretext","text"],"actions":[{"id":"1","name":"acknowledge","text":"Acknowledge","type":"button","value":"ack","style":"default"},{"id":"2","name":"close","text":"Close","type":"button","value":"close","style":"primary"},{"id":"3","name":"action","text":"Other actions...","type":"select","data_source":"static","options":[{"text":"Assign","value":"assign"},{"text":"Take Ownership","value":"own"},{"text":"Snooze","value":"snooze"},{"text":"Add Note","value":"addNote"},{"text":"Update Priority","value":"updatePriority"}]}]}],"channel":"C06U1DDBBU4","event_ts":"1712927439.728409","channel_type":"channel"},"type":"event_callback","event_id":"Ev06UEPF5BSM","event_time":1712927439,"authorizations":[{"enterprise_id":null,"team_id":"T9RQLQ0KV","user_id":"U06TS9M7ABG","is_bot":true,"is_enterprise_install":false}],"is_ext_shared_channel":false,"event_context":"4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUOVJRTFEwS1YiLCJhaWQiOiJBMDZUWUg3Q0FMQiIsImNpZCI6IkMwNlUxRERCQlU0In0"} +{ + "hint": "a new alert from opsgenie", + "token": "redacted", + "team_id": "T9RQLQ0KV", + "context_team_id": "T9RQLQ0KV", + "context_enterprise_id": null, + "api_app_id": "A06TYH7CALB", + "event": { + "user": "U03RUK7FBUY", + "type": "message", + "ts": "1712927439.728409", + "bot_id": "B03RHGBPH2M", + "app_id": "A286WATV2", + "text": "", + "team": "T9RQLQ0KV", + "bot_profile": { + "id": "B03RHGBPH2M", + "deleted": false, + "name": "Opsgenie for Alert Management", + "updated": 1658887059, + "app_id": "A286WATV2", + "icons": { + "image_36": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_36.png", + "image_48": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_48.png", + "image_72": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_72.png" + }, + "team_id": "T9RQLQ0KV" + }, + "attachments": [ + { + "id": 1, + "color": "F4511E", + "fallback": "New alert: \"[Grafana]: Firing: Alertconfig Workflow Failed\" \nTags: alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb", + "text": "At least one alertconfig run has failed unexpectedly.\nDashboard: \nPanel: \nSource: ", + "title": "#11071: [Grafana]: Firing: Alertconfig Workflow Failed", + "title_link": "https://opsg.in/a/i/render/38152bc5-bc5d-411d-9feb-d285af5b6481-1712927439305", + "author_name": "New Alert created via Grafana - Datastore Slack", + "callback_id": "bbd4a269-08a9-470e-ba79-ce238ac03dc7_05fa2e9b-bec4-4a7e-842d-36043d267a13_11071", + "fields": [ + { + "value": "P3", + "title": "Priority", + "short": true + }, + { + "value": "alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb", + "title": "Tags", + "short": true + }, + { + "value": "Datastores Non-Critical", + "title": "Routed Teams", + "short": true + } + ], + "mrkdwn_in": [ + "pretext", + "text" + ], + "actions": [ + { + "id": "1", + "name": "acknowledge", + "text": "Acknowledge", + "type": "button", + "value": "ack", + "style": "default" + }, + { + "id": "2", + "name": "close", + "text": "Close", + "type": "button", + "value": "close", + "style": "primary" + }, + { + "id": "3", + "name": "action", + "text": "Other actions...", + "type": "select", + "data_source": "static", + "options": [ + { + "text": "Assign", + "value": "assign" + }, + { + "text": "Take Ownership", + "value": "own" + }, + { + "text": "Snooze", + "value": "snooze" + }, + { + "text": "Add Note", + "value": "addNote" + }, + { + "text": "Update Priority", + "value": "updatePriority" + } + ] + } + ] + } + ], + "channel": "C06U1DDBBU4", + "event_ts": "1712927439.728409", + "channel_type": "channel" + }, + "type": "event_callback", + "event_id": "Ev06UEPF5BSM", + "event_time": 1712927439, + "authorizations": [ + { + "enterprise_id": null, + "team_id": "T9RQLQ0KV", + "user_id": "U06TS9M7ABG", + "is_bot": true, + "is_enterprise_install": false + } + ], + "is_ext_shared_channel": false, + "event_context": "4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUOVJRTFEwS1YiLCJhaWQiOiJBMDZUWUg3Q0FMQiIsImNpZCI6IkMwNlUxRERCQlU0In0" +} diff --git a/testdata/slack_events/opsgenie_alert_2.json b/testdata/slack_events/opsgenie_alert_2.json index 02c145d..9d20673 100644 --- a/testdata/slack_events/opsgenie_alert_2.json +++ b/testdata/slack_events/opsgenie_alert_2.json @@ -1 +1,192 @@ -{"hint": "a new alert from opsgenie", "token":"redacted","team_id":"T9RQLQ0KV","context_team_id":"T9RQLQ0KV","context_enterprise_id":null,"api_app_id":"A06TYH7CALB","event":{"type":"message","subtype":"message_changed","message":{"user":"U03RUK7FBUY","type":"message","edited":{"user":"B03RHGBPH2M","ts":"1712925631.000000"},"bot_id":"B03RHGBPH2M","app_id":"A286WATV2","text":"","team":"T9RQLQ0KV","bot_profile":{"id":"B03RHGBPH2M","app_id":"A286WATV2","name":"Opsgenie for Alert Management","icons":{"image_36":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_36.png","image_48":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_48.png","image_72":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_72.png"},"deleted":false,"updated":1658887059,"team_id":"T9RQLQ0KV"},"attachments":[{"id":1,"color":"2ecc71","fallback":"\"[Grafana]: Firing: Alertconfig Workflow Failed\" \nTags: alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb","text":"At least one alertconfig run has failed unexpectedly.\nDashboard: \nPanel: \nSource: ","title":"#11070: [Grafana]: Firing: Alertconfig Workflow Failed","title_link":"https:\/\/opsg.in\/a\/i\/render\/ec6e7c4b-90a6-4c3c-94e9-901f6b7ada47-1712922031403","callback_id":"bbd4a269-08a9-470e-ba79-ce238ac03dc7_05fa2e9b-bec4-4a7e-842d-36043d267a13_11070","fields":[{"value":"P3","title":"Priority","short":true},{"value":"alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb","title":"Tags","short":true},{"value":"Datastores Non-Critical","title":"Routed Teams","short":true}],"mrkdwn_in":["text"]}],"ts":"1712922031.821339","source_team":"T9RQLQ0KV","user_team":"T9RQLQ0KV"},"previous_message":{"user":"U03RUK7FBUY","type":"message","ts":"1712922031.821339","bot_id":"B03RHGBPH2M","app_id":"A286WATV2","text":"","team":"T9RQLQ0KV","bot_profile":{"id":"B03RHGBPH2M","app_id":"A286WATV2","name":"Opsgenie for Alert Management","icons":{"image_36":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_36.png","image_48":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_48.png","image_72":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_72.png"},"deleted":false,"updated":1658887059,"team_id":"T9RQLQ0KV"},"attachments":[{"id":1,"color":"F4511E","fallback":"New alert: \"[Grafana]: Firing: Alertconfig Workflow Failed\" \nTags: alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb","text":"At least one alertconfig run has failed unexpectedly.\nDashboard: \nPanel: \nSource: ","title":"#11070: [Grafana]: Firing: Alertconfig Workflow Failed","title_link":"https:\/\/opsg.in\/a\/i\/render\/ec6e7c4b-90a6-4c3c-94e9-901f6b7ada47-1712922031403","author_name":"New Alert created via Grafana - Datastore Slack","callback_id":"bbd4a269-08a9-470e-ba79-ce238ac03dc7_05fa2e9b-bec4-4a7e-842d-36043d267a13_11070","fields":[{"value":"P3","title":"Priority","short":true},{"value":"alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb","title":"Tags","short":true},{"value":"Datastores Non-Critical","title":"Routed Teams","short":true}],"mrkdwn_in":["pretext","text"],"actions":[{"id":"1","name":"acknowledge","text":"Acknowledge","type":"button","value":"ack","style":"default"},{"id":"2","name":"close","text":"Close","type":"button","value":"close","style":"primary"},{"id":"3","name":"action","text":"Other actions...","type":"select","data_source":"static","options":[{"text":"Assign","value":"assign"},{"text":"Take Ownership","value":"own"},{"text":"Snooze","value":"snooze"},{"text":"Add Note","value":"addNote"},{"text":"Update Priority","value":"updatePriority"}]}]}]},"channel":"C06U1DDBBU4","hidden":true,"ts":"1712925631.000400","event_ts":"1712925631.000400","channel_type":"channel"},"type":"event_callback","event_id":"Ev06UQNCJKNC","event_time":1712925631,"authorizations":[{"enterprise_id":null,"team_id":"T9RQLQ0KV","user_id":"U06TS9M7ABG","is_bot":true,"is_enterprise_install":false}],"is_ext_shared_channel":false,"event_context":"4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUOVJRTFEwS1YiLCJhaWQiOiJBMDZUWUg3Q0FMQiIsImNpZCI6IkMwNlUxRERCQlU0In0"} +{ + "hint": "a new alert from opsgenie", + "token": "redacted", + "team_id": "T9RQLQ0KV", + "context_team_id": "T9RQLQ0KV", + "context_enterprise_id": null, + "api_app_id": "A06TYH7CALB", + "event": { + "type": "message", + "subtype": "message_changed", + "message": { + "user": "U03RUK7FBUY", + "type": "message", + "edited": { + "user": "B03RHGBPH2M", + "ts": "1712925631.000000" + }, + "bot_id": "B03RHGBPH2M", + "app_id": "A286WATV2", + "text": "", + "team": "T9RQLQ0KV", + "bot_profile": { + "id": "B03RHGBPH2M", + "app_id": "A286WATV2", + "name": "Opsgenie for Alert Management", + "icons": { + "image_36": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_36.png", + "image_48": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_48.png", + "image_72": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_72.png" + }, + "deleted": false, + "updated": 1658887059, + "team_id": "T9RQLQ0KV" + }, + "attachments": [ + { + "id": 1, + "color": "2ecc71", + "fallback": "\"[Grafana]: Firing: Alertconfig Workflow Failed\" \nTags: alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb", + "text": "At least one alertconfig run has failed unexpectedly.\nDashboard: \nPanel: \nSource: ", + "title": "#11070: [Grafana]: Firing: Alertconfig Workflow Failed", + "title_link": "https://opsg.in/a/i/render/ec6e7c4b-90a6-4c3c-94e9-901f6b7ada47-1712922031403", + "callback_id": "bbd4a269-08a9-470e-ba79-ce238ac03dc7_05fa2e9b-bec4-4a7e-842d-36043d267a13_11070", + "fields": [ + { + "value": "P3", + "title": "Priority", + "short": true + }, + { + "value": "alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb", + "title": "Tags", + "short": true + }, + { + "value": "Datastores Non-Critical", + "title": "Routed Teams", + "short": true + } + ], + "mrkdwn_in": [ + "text" + ] + } + ], + "ts": "1712922031.821339", + "source_team": "T9RQLQ0KV", + "user_team": "T9RQLQ0KV" + }, + "previous_message": { + "user": "U03RUK7FBUY", + "type": "message", + "ts": "1712922031.821339", + "bot_id": "B03RHGBPH2M", + "app_id": "A286WATV2", + "text": "", + "team": "T9RQLQ0KV", + "bot_profile": { + "id": "B03RHGBPH2M", + "app_id": "A286WATV2", + "name": "Opsgenie for Alert Management", + "icons": { + "image_36": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_36.png", + "image_48": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_48.png", + "image_72": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_72.png" + }, + "deleted": false, + "updated": 1658887059, + "team_id": "T9RQLQ0KV" + }, + "attachments": [ + { + "id": 1, + "color": "F4511E", + "fallback": "New alert: \"[Grafana]: Firing: Alertconfig Workflow Failed\" \nTags: alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb", + "text": "At least one alertconfig run has failed unexpectedly.\nDashboard: \nPanel: \nSource: ", + "title": "#11070: [Grafana]: Firing: Alertconfig Workflow Failed", + "title_link": "https://opsg.in/a/i/render/ec6e7c4b-90a6-4c3c-94e9-901f6b7ada47-1712922031403", + "author_name": "New Alert created via Grafana - Datastore Slack", + "callback_id": "bbd4a269-08a9-470e-ba79-ce238ac03dc7_05fa2e9b-bec4-4a7e-842d-36043d267a13_11070", + "fields": [ + { + "value": "P3", + "title": "Priority", + "short": true + }, + { + "value": "alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb", + "title": "Tags", + "short": true + }, + { + "value": "Datastores Non-Critical", + "title": "Routed Teams", + "short": true + } + ], + "mrkdwn_in": [ + "pretext", + "text" + ], + "actions": [ + { + "id": "1", + "name": "acknowledge", + "text": "Acknowledge", + "type": "button", + "value": "ack", + "style": "default" + }, + { + "id": "2", + "name": "close", + "text": "Close", + "type": "button", + "value": "close", + "style": "primary" + }, + { + "id": "3", + "name": "action", + "text": "Other actions...", + "type": "select", + "data_source": "static", + "options": [ + { + "text": "Assign", + "value": "assign" + }, + { + "text": "Take Ownership", + "value": "own" + }, + { + "text": "Snooze", + "value": "snooze" + }, + { + "text": "Add Note", + "value": "addNote" + }, + { + "text": "Update Priority", + "value": "updatePriority" + } + ] + } + ] + } + ] + }, + "channel": "C06U1DDBBU4", + "hidden": true, + "ts": "1712925631.000400", + "event_ts": "1712925631.000400", + "channel_type": "channel" + }, + "type": "event_callback", + "event_id": "Ev06UQNCJKNC", + "event_time": 1712925631, + "authorizations": [ + { + "enterprise_id": null, + "team_id": "T9RQLQ0KV", + "user_id": "U06TS9M7ABG", + "is_bot": true, + "is_enterprise_install": false + } + ], + "is_ext_shared_channel": false, + "event_context": "4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUOVJRTFEwS1YiLCJhaWQiOiJBMDZUWUg3Q0FMQiIsImNpZCI6IkMwNlUxRERCQlU0In0" +} diff --git a/testdata/slack_events/opsgenie_alert_3.json b/testdata/slack_events/opsgenie_alert_3.json index 0f3d36d..1c4395b 100644 --- a/testdata/slack_events/opsgenie_alert_3.json +++ b/testdata/slack_events/opsgenie_alert_3.json @@ -1 +1,127 @@ -{"hint": "an alert firing that has a render_id", "token":"redacted","team_id":"T9RQLQ0KV","context_team_id":"T9RQLQ0KV","context_enterprise_id":null,"api_app_id":"A06TYH7CALB","event":{"user":"U03RUK7FBUY","type":"message","ts":"1712911957.023359","bot_id":"B03RHGBPH2M","app_id":"A286WATV2","text":"","team":"T9RQLQ0KV","bot_profile":{"id":"B03RHGBPH2M","deleted":false,"name":"Opsgenie for Alert Management","updated":1658887059,"app_id":"A286WATV2","icons":{"image_36":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_36.png","image_48":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_48.png","image_72":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_72.png"},"team_id":"T9RQLQ0KV"},"attachments":[{"id":1,"color":"F4511E","fallback":"New alert: \"[Grafana]: Firing: [Oregon-1] Wal Receive Count Alert\" \nTags: alertname:[oregon-1] WAL Receive Count alert, business_hours:true, cluster:oregon-1, contacts:\"OpsGenie - Datastore\",\"Slack - Datastore, grafana_folder:[Generated] oregon-1, template-source:ab1da08c-129f-4f08-b505-db44929eb8","text":"Replica for dpg-cn7te6nsc6pc73ak5pig-b cannot start streaming replication, because the primary has already deleted the needed WAL segment.\n\nSync the replica from scratch using the runbook.\nRunbook: \nSource: ","title":"#11067: [Grafana]: Firing: [Oregon-1] Wal Receive Count Alert","title_link":"https:\/\/opsg.in\/a\/i\/render\/c1565736-aac4-4a78-b7db-65e4d90a59f2-1712911956739","author_name":"New Alert created via Grafana - Datastore Slack","callback_id":"bbd4a269-08a9-470e-ba79-ce238ac03dc7_05fa2e9b-bec4-4a7e-842d-36043d267a13_11067","fields":[{"value":"P3","title":"Priority","short":true},{"value":"alertname:[oregon-1] WAL Receive Count alert, business_hours:true, cluster:oregon-1, contacts:\"OpsGenie - Datastore\",\"Slack - Datastore, grafana_folder:[Generated] oregon-1, template-source:ab1da08c-129f-4f08-b505-db44929eb8","title":"Tags","short":true},{"value":"Datastores Non-Critical","title":"Routed Teams","short":true}],"mrkdwn_in":["pretext","text"],"actions":[{"id":"1","name":"acknowledge","text":"Acknowledge","type":"button","value":"ack","style":"default"},{"id":"2","name":"close","text":"Close","type":"button","value":"close","style":"primary"},{"id":"3","name":"action","text":"Other actions...","type":"select","data_source":"static","options":[{"text":"Assign","value":"assign"},{"text":"Take Ownership","value":"own"},{"text":"Snooze","value":"snooze"},{"text":"Add Note","value":"addNote"},{"text":"Update Priority","value":"updatePriority"}]}]}],"channel":"C06U1DDBBU4","event_ts":"1712911957.023359","channel_type":"channel"},"type":"event_callback","event_id":"Ev06U0TNBXV0","event_time":1712911957,"authorizations":[{"enterprise_id":null,"team_id":"T9RQLQ0KV","user_id":"U06TS9M7ABG","is_bot":true,"is_enterprise_install":false}],"is_ext_shared_channel":false,"event_context":"4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUOVJRTFEwS1YiLCJhaWQiOiJBMDZUWUg3Q0FMQiIsImNpZCI6IkMwNlUxRERCQlU0In0"} +{ + "hint": "an alert firing that has a render_id", + "token": "redacted", + "team_id": "T9RQLQ0KV", + "context_team_id": "T9RQLQ0KV", + "context_enterprise_id": null, + "api_app_id": "A06TYH7CALB", + "event": { + "user": "U03RUK7FBUY", + "type": "message", + "ts": "1712911957.023359", + "bot_id": "B03RHGBPH2M", + "app_id": "A286WATV2", + "text": "", + "team": "T9RQLQ0KV", + "bot_profile": { + "id": "B03RHGBPH2M", + "deleted": false, + "name": "Opsgenie for Alert Management", + "updated": 1658887059, + "app_id": "A286WATV2", + "icons": { + "image_36": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_36.png", + "image_48": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_48.png", + "image_72": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_72.png" + }, + "team_id": "T9RQLQ0KV" + }, + "attachments": [ + { + "id": 1, + "color": "F4511E", + "fallback": "New alert: \"[Grafana]: Firing: [Oregon-1] Wal Receive Count Alert\" \nTags: alertname:[oregon-1] WAL Receive Count alert, business_hours:true, cluster:oregon-1, contacts:\"OpsGenie - Datastore\",\"Slack - Datastore, grafana_folder:[Generated] oregon-1, template-source:ab1da08c-129f-4f08-b505-db44929eb8", + "text": "Replica for dpg-cn7te6nsc6pc73ak5pig-b cannot start streaming replication, because the primary has already deleted the needed WAL segment.\n\nSync the replica from scratch using the runbook.\nRunbook: \nSource: ", + "title": "#11067: [Grafana]: Firing: [Oregon-1] Wal Receive Count Alert", + "title_link": "https://opsg.in/a/i/render/c1565736-aac4-4a78-b7db-65e4d90a59f2-1712911956739", + "author_name": "New Alert created via Grafana - Datastore Slack", + "callback_id": "bbd4a269-08a9-470e-ba79-ce238ac03dc7_05fa2e9b-bec4-4a7e-842d-36043d267a13_11067", + "fields": [ + { + "value": "P3", + "title": "Priority", + "short": true + }, + { + "value": "alertname:[oregon-1] WAL Receive Count alert, business_hours:true, cluster:oregon-1, contacts:\"OpsGenie - Datastore\",\"Slack - Datastore, grafana_folder:[Generated] oregon-1, template-source:ab1da08c-129f-4f08-b505-db44929eb8", + "title": "Tags", + "short": true + }, + { + "value": "Datastores Non-Critical", + "title": "Routed Teams", + "short": true + } + ], + "mrkdwn_in": [ + "pretext", + "text" + ], + "actions": [ + { + "id": "1", + "name": "acknowledge", + "text": "Acknowledge", + "type": "button", + "value": "ack", + "style": "default" + }, + { + "id": "2", + "name": "close", + "text": "Close", + "type": "button", + "value": "close", + "style": "primary" + }, + { + "id": "3", + "name": "action", + "text": "Other actions...", + "type": "select", + "data_source": "static", + "options": [ + { + "text": "Assign", + "value": "assign" + }, + { + "text": "Take Ownership", + "value": "own" + }, + { + "text": "Snooze", + "value": "snooze" + }, + { + "text": "Add Note", + "value": "addNote" + }, + { + "text": "Update Priority", + "value": "updatePriority" + } + ] + } + ] + } + ], + "channel": "C06U1DDBBU4", + "event_ts": "1712911957.023359", + "channel_type": "channel" + }, + "type": "event_callback", + "event_id": "Ev06U0TNBXV0", + "event_time": 1712911957, + "authorizations": [ + { + "enterprise_id": null, + "team_id": "T9RQLQ0KV", + "user_id": "U06TS9M7ABG", + "is_bot": true, + "is_enterprise_install": false + } + ], + "is_ext_shared_channel": false, + "event_context": "4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUOVJRTFEwS1YiLCJhaWQiOiJBMDZUWUg3Q0FMQiIsImNpZCI6IkMwNlUxRERCQlU0In0" +} diff --git a/testdata/slack_events/opsgenie_alert_resolved.json b/testdata/slack_events/opsgenie_alert_resolved.json index ad0c1d2..1743f24 100644 --- a/testdata/slack_events/opsgenie_alert_resolved.json +++ b/testdata/slack_events/opsgenie_alert_resolved.json @@ -1,2 +1,192 @@ - -{"hint": "an edit to resolve an alert from opsgenie", "token":"redacted","team_id":"T9RQLQ0KV","context_team_id":"T9RQLQ0KV","context_enterprise_id":null,"api_app_id":"A06TYH7CALB","event":{"type":"message","subtype":"message_changed","message":{"user":"U03RUK7FBUY","type":"message","edited":{"user":"B03RHGBPH2M","ts":"1712916339.000000"},"bot_id":"B03RHGBPH2M","app_id":"A286WATV2","text":"","team":"T9RQLQ0KV","bot_profile":{"id":"B03RHGBPH2M","app_id":"A286WATV2","name":"Opsgenie for Alert Management","icons":{"image_36":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_36.png","image_48":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_48.png","image_72":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_72.png"},"deleted":false,"updated":1658887059,"team_id":"T9RQLQ0KV"},"attachments":[{"id":1,"color":"2ecc71","fallback":"\"[Grafana]: Firing: Alertconfig Workflow Failed\" \nTags: alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb","text":"At least one alertconfig run has failed unexpectedly.\nDashboard: \nPanel: \nSource: ","title":"#11069: [Grafana]: Firing: Alertconfig Workflow Failed","title_link":"https:\/\/opsg.in\/a\/i\/render\/ba6f8300-b869-4aba-9d02-c142237ae59e-1712912739431","callback_id":"bbd4a269-08a9-470e-ba79-ce238ac03dc7_05fa2e9b-bec4-4a7e-842d-36043d267a13_11069","fields":[{"value":"P3","title":"Priority","short":true},{"value":"alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb","title":"Tags","short":true},{"value":"Datastores Non-Critical","title":"Routed Teams","short":true}],"mrkdwn_in":["text"]}],"ts":"1712912739.723049","source_team":"T9RQLQ0KV","user_team":"T9RQLQ0KV"},"previous_message":{"user":"U03RUK7FBUY","type":"message","ts":"1712912739.723049","bot_id":"B03RHGBPH2M","app_id":"A286WATV2","text":"","team":"T9RQLQ0KV","bot_profile":{"id":"B03RHGBPH2M","app_id":"A286WATV2","name":"Opsgenie for Alert Management","icons":{"image_36":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_36.png","image_48":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_48.png","image_72":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_72.png"},"deleted":false,"updated":1658887059,"team_id":"T9RQLQ0KV"},"attachments":[{"id":1,"color":"F4511E","fallback":"New alert: \"[Grafana]: Firing: Alertconfig Workflow Failed\" \nTags: alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb","text":"At least one alertconfig run has failed unexpectedly.\nDashboard: \nPanel: \nSource: ","title":"#11069: [Grafana]: Firing: Alertconfig Workflow Failed","title_link":"https:\/\/opsg.in\/a\/i\/render\/ba6f8300-b869-4aba-9d02-c142237ae59e-1712912739431","author_name":"New Alert created via Grafana - Datastore Slack","callback_id":"bbd4a269-08a9-470e-ba79-ce238ac03dc7_05fa2e9b-bec4-4a7e-842d-36043d267a13_11069","fields":[{"value":"P3","title":"Priority","short":true},{"value":"alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb","title":"Tags","short":true},{"value":"Datastores Non-Critical","title":"Routed Teams","short":true}],"mrkdwn_in":["pretext","text"],"actions":[{"id":"1","name":"acknowledge","text":"Acknowledge","type":"button","value":"ack","style":"default"},{"id":"2","name":"close","text":"Close","type":"button","value":"close","style":"primary"},{"id":"3","name":"action","text":"Other actions...","type":"select","data_source":"static","options":[{"text":"Assign","value":"assign"},{"text":"Take Ownership","value":"own"},{"text":"Snooze","value":"snooze"},{"text":"Add Note","value":"addNote"},{"text":"Update Priority","value":"updatePriority"}]}]}]},"channel":"C06U1DDBBU4","hidden":true,"ts":"1712916339.000300","event_ts":"1712916339.000300","channel_type":"channel"},"type":"event_callback","event_id":"Ev06TLMY8FJB","event_time":1712916339,"authorizations":[{"enterprise_id":null,"team_id":"T9RQLQ0KV","user_id":"U06TS9M7ABG","is_bot":true,"is_enterprise_install":false}],"is_ext_shared_channel":false,"event_context":"4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUOVJRTFEwS1YiLCJhaWQiOiJBMDZUWUg3Q0FMQiIsImNpZCI6IkMwNlUxRERCQlU0In0"} +{ + "hint": "an edit to resolve an alert from opsgenie", + "token": "redacted", + "team_id": "T9RQLQ0KV", + "context_team_id": "T9RQLQ0KV", + "context_enterprise_id": null, + "api_app_id": "A06TYH7CALB", + "event": { + "type": "message", + "subtype": "message_changed", + "message": { + "user": "U03RUK7FBUY", + "type": "message", + "edited": { + "user": "B03RHGBPH2M", + "ts": "1712916339.000000" + }, + "bot_id": "B03RHGBPH2M", + "app_id": "A286WATV2", + "text": "", + "team": "T9RQLQ0KV", + "bot_profile": { + "id": "B03RHGBPH2M", + "app_id": "A286WATV2", + "name": "Opsgenie for Alert Management", + "icons": { + "image_36": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_36.png", + "image_48": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_48.png", + "image_72": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_72.png" + }, + "deleted": false, + "updated": 1658887059, + "team_id": "T9RQLQ0KV" + }, + "attachments": [ + { + "id": 1, + "color": "2ecc71", + "fallback": "\"[Grafana]: Firing: Alertconfig Workflow Failed\" \nTags: alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb", + "text": "At least one alertconfig run has failed unexpectedly.\nDashboard: \nPanel: \nSource: ", + "title": "#11069: [Grafana]: Firing: Alertconfig Workflow Failed", + "title_link": "https://opsg.in/a/i/render/ba6f8300-b869-4aba-9d02-c142237ae59e-1712912739431", + "callback_id": "bbd4a269-08a9-470e-ba79-ce238ac03dc7_05fa2e9b-bec4-4a7e-842d-36043d267a13_11069", + "fields": [ + { + "value": "P3", + "title": "Priority", + "short": true + }, + { + "value": "alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb", + "title": "Tags", + "short": true + }, + { + "value": "Datastores Non-Critical", + "title": "Routed Teams", + "short": true + } + ], + "mrkdwn_in": [ + "text" + ] + } + ], + "ts": "1712912739.723049", + "source_team": "T9RQLQ0KV", + "user_team": "T9RQLQ0KV" + }, + "previous_message": { + "user": "U03RUK7FBUY", + "type": "message", + "ts": "1712912739.723049", + "bot_id": "B03RHGBPH2M", + "app_id": "A286WATV2", + "text": "", + "team": "T9RQLQ0KV", + "bot_profile": { + "id": "B03RHGBPH2M", + "app_id": "A286WATV2", + "name": "Opsgenie for Alert Management", + "icons": { + "image_36": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_36.png", + "image_48": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_48.png", + "image_72": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_72.png" + }, + "deleted": false, + "updated": 1658887059, + "team_id": "T9RQLQ0KV" + }, + "attachments": [ + { + "id": 1, + "color": "F4511E", + "fallback": "New alert: \"[Grafana]: Firing: Alertconfig Workflow Failed\" \nTags: alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb", + "text": "At least one alertconfig run has failed unexpectedly.\nDashboard: \nPanel: \nSource: ", + "title": "#11069: [Grafana]: Firing: Alertconfig Workflow Failed", + "title_link": "https://opsg.in/a/i/render/ba6f8300-b869-4aba-9d02-c142237ae59e-1712912739431", + "author_name": "New Alert created via Grafana - Datastore Slack", + "callback_id": "bbd4a269-08a9-470e-ba79-ce238ac03dc7_05fa2e9b-bec4-4a7e-842d-36043d267a13_11069", + "fields": [ + { + "value": "P3", + "title": "Priority", + "short": true + }, + { + "value": "alertname:Alertconfig Workflow Failed, grafana_folder:Datastores, rule_uid:a7639f7e-6950-41be-850a-b22119f74cbb", + "title": "Tags", + "short": true + }, + { + "value": "Datastores Non-Critical", + "title": "Routed Teams", + "short": true + } + ], + "mrkdwn_in": [ + "pretext", + "text" + ], + "actions": [ + { + "id": "1", + "name": "acknowledge", + "text": "Acknowledge", + "type": "button", + "value": "ack", + "style": "default" + }, + { + "id": "2", + "name": "close", + "text": "Close", + "type": "button", + "value": "close", + "style": "primary" + }, + { + "id": "3", + "name": "action", + "text": "Other actions...", + "type": "select", + "data_source": "static", + "options": [ + { + "text": "Assign", + "value": "assign" + }, + { + "text": "Take Ownership", + "value": "own" + }, + { + "text": "Snooze", + "value": "snooze" + }, + { + "text": "Add Note", + "value": "addNote" + }, + { + "text": "Update Priority", + "value": "updatePriority" + } + ] + } + ] + } + ] + }, + "channel": "C06U1DDBBU4", + "hidden": true, + "ts": "1712916339.000300", + "event_ts": "1712916339.000300", + "channel_type": "channel" + }, + "type": "event_callback", + "event_id": "Ev06TLMY8FJB", + "event_time": 1712916339, + "authorizations": [ + { + "enterprise_id": null, + "team_id": "T9RQLQ0KV", + "user_id": "U06TS9M7ABG", + "is_bot": true, + "is_enterprise_install": false + } + ], + "is_ext_shared_channel": false, + "event_context": "4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUOVJRTFEwS1YiLCJhaWQiOiJBMDZUWUg3Q0FMQiIsImNpZCI6IkMwNlUxRERCQlU0In0" +} diff --git a/testdata/slack_events/opsgenie_alert_resolved_fyi.json b/testdata/slack_events/opsgenie_alert_resolved_fyi.json index 7b9305f..ddfdce0 100644 --- a/testdata/slack_events/opsgenie_alert_resolved_fyi.json +++ b/testdata/slack_events/opsgenie_alert_resolved_fyi.json @@ -1 +1,55 @@ -{"hint": "a teeny closed alert message", "token":"redacted","team_id":"T9RQLQ0KV","context_team_id":"T9RQLQ0KV","context_enterprise_id":null,"api_app_id":"A06TYH7CALB","event":{"user":"U03RUK7FBUY","type":"message","ts":"1712925631.682559","bot_id":"B03RHGBPH2M","app_id":"A286WATV2","text":"","team":"T9RQLQ0KV","bot_profile":{"id":"B03RHGBPH2M","deleted":false,"name":"Opsgenie for Alert Management","updated":1658887059,"app_id":"A286WATV2","icons":{"image_36":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_36.png","image_48":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_48.png","image_72":"https:\/\/avatars.slack-edge.com\/2019-05-30\/652285939191_7831939cc30ef7159561_72.png"},"team_id":"T9RQLQ0KV"},"attachments":[{"id":1,"color":"2ecc71","fallback":"Alert API closed alert \"[Grafana]: Firing: Alertconfig Workflow Failed\"","text":"Alert API closed alert \"[Grafana]: Firing: Alertconfig Workflow Failed\""}],"channel":"C06U1DDBBU4","event_ts":"1712925631.682559","channel_type":"channel"},"type":"event_callback","event_id":"Ev06U1R10TPV","event_time":1712925631,"authorizations":[{"enterprise_id":null,"team_id":"T9RQLQ0KV","user_id":"U06TS9M7ABG","is_bot":true,"is_enterprise_install":false}],"is_ext_shared_channel":false,"event_context":"4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUOVJRTFEwS1YiLCJhaWQiOiJBMDZUWUg3Q0FMQiIsImNpZCI6IkMwNlUxRERCQlU0In0"} +{ + "hint": "a teeny closed alert message", + "token": "redacted", + "team_id": "T9RQLQ0KV", + "context_team_id": "T9RQLQ0KV", + "context_enterprise_id": null, + "api_app_id": "A06TYH7CALB", + "event": { + "user": "U03RUK7FBUY", + "type": "message", + "ts": "1712925631.682559", + "bot_id": "B03RHGBPH2M", + "app_id": "A286WATV2", + "text": "", + "team": "T9RQLQ0KV", + "bot_profile": { + "id": "B03RHGBPH2M", + "deleted": false, + "name": "Opsgenie for Alert Management", + "updated": 1658887059, + "app_id": "A286WATV2", + "icons": { + "image_36": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_36.png", + "image_48": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_48.png", + "image_72": "https://avatars.slack-edge.com/2019-05-30/652285939191_7831939cc30ef7159561_72.png" + }, + "team_id": "T9RQLQ0KV" + }, + "attachments": [ + { + "id": 1, + "color": "2ecc71", + "fallback": "Alert API closed alert \"[Grafana]: Firing: Alertconfig Workflow Failed\"", + "text": "Alert API closed alert \"[Grafana]: Firing: Alertconfig Workflow Failed\"" + } + ], + "channel": "C06U1DDBBU4", + "event_ts": "1712925631.682559", + "channel_type": "channel" + }, + "type": "event_callback", + "event_id": "Ev06U1R10TPV", + "event_time": 1712925631, + "authorizations": [ + { + "enterprise_id": null, + "team_id": "T9RQLQ0KV", + "user_id": "U06TS9M7ABG", + "is_bot": true, + "is_enterprise_install": false + } + ], + "is_ext_shared_channel": false, + "event_context": "4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUOVJRTFEwS1YiLCJhaWQiOiJBMDZUWUg3Q0FMQiIsImNpZCI6IkMwNlUxRERCQlU0In0" +}