Skip to content

Commit 942c279

Browse files
committed
pr changes
1 parent bfeeb99 commit 942c279

File tree

6 files changed

+56
-67
lines changed

6 files changed

+56
-67
lines changed

docs/playbook-reference/actions/miscellaneous.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ ArgoCD
88

99
.. robusta-action:: playbooks.robusta_playbooks.argo_cd.argo_app_sync
1010

11+
Slack-OpsGenie sync
12+
^^^^^^^^^^^^^^
13+
14+
.. robusta-action:: playbooks.robusta_playbooks.sink_enrichments.opsgenie_slack_enricher
15+
1116
Kubernetes Optimization
1217
-----------------------
1318

playbooks/robusta_playbooks/sink_enrichments.py

Lines changed: 42 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -34,44 +34,52 @@ def ack_opsgenie_alert_from_slack(event: ExecutionBaseEvent, params: OpsGenieAck
3434
"""
3535
Sends an ack to opsgenie alert
3636
"""
37-
def ack_opsgenie_alert() -> None:
38-
event.emit_event(
39-
"opsgenie_ack",
40-
fingerprint=params.alert_fingerprint,
41-
user=params.slack_username,
42-
note=f"This alert was ack-ed from a Robusta Slack message by {params.slack_username}"
43-
)
44-
45-
if not params.slack_message:
46-
logging.warning("No action Slack found, unable to update slack message.")
47-
return
48-
49-
# slack action block
50-
actions = params.slack_message.get("actions", [])
51-
if not actions:
52-
logging.warning("No actions found in the Slack message.")
53-
return
54-
55-
block_id = actions[0].get("block_id")
56-
if not block_id:
57-
logging.warning("Block ID is missing in the first action of the Slack message.")
58-
return
59-
60-
event.emit_event(
61-
"replace_callback_with_string",
62-
slack_message=params.slack_message,
63-
block_id=block_id,
64-
message_string=f"✅ *OpsGenie Ack by @{params.slack_username}*"
65-
)
66-
67-
ack_opsgenie_alert()
37+
event.emit_event(
38+
"opsgenie_ack",
39+
fingerprint=params.alert_fingerprint,
40+
user=params.slack_username,
41+
note=f"This alert was ack-ed from a Robusta Slack message by {params.slack_username}"
42+
)
43+
44+
if not params.slack_message:
45+
logging.warning("No action Slack found, unable to update slack message.")
46+
return
47+
48+
# slack action block
49+
actions = params.slack_message.get("actions", [])
50+
if not actions:
51+
logging.warning("No actions found in the Slack message.")
52+
return
53+
54+
block_id = actions[0].get("block_id")
55+
if not block_id:
56+
logging.warning("Block ID is missing in the first action of the Slack message.")
57+
return
58+
59+
event.emit_event(
60+
"replace_callback_with_string",
61+
slack_message=params.slack_message,
62+
block_id=block_id,
63+
message_string=f"✅ *OpsGenie Ack by @{params.slack_username}*"
64+
)
65+
66+
67+
class OpsGenieLinkParams(ActionParams):
68+
"""
69+
:var url_base: The base url for your opsgenie account for example: "robusta-test-url.app.eu.opsgenie.com"
70+
"""
71+
url_base: str
6872

6973

7074
@action
71-
def ack_slack_opsgenie_enricher(alert: PrometheusKubernetesAlert):
75+
def opsgenie_slack_enricher(alert: PrometheusKubernetesAlert, params: OpsGenieLinkParams):
7276
"""
73-
Add a button to the alert - clicking it will ask chat gpt to help find a solution.
77+
Add a button to the alert - clicking it will ask chat gpt to help find a solution.
7478
"""
79+
normalized_url_base = normalize_url_base(params.url_base)
80+
alert.add_link(Link(url=f"https://{normalized_url_base}/alert/list?query=alias:{alert.alert.fingerprint}",
81+
name="OpsGenie Alert", type=LinkType.OPSGENIE_LIST_ALERT_BY_ALIAS))
82+
7583
alert.add_enrichment(
7684
[
7785
CallbackBlock(
@@ -88,12 +96,6 @@ def ack_slack_opsgenie_enricher(alert: PrometheusKubernetesAlert):
8896
)
8997

9098

91-
class OpsGenieLinkParams(ActionParams):
92-
"""
93-
:var url_base: The base url for your opsgenie account for example: "robusta-test-url.app.eu.opsgenie.com"
94-
"""
95-
url_base: Optional[str] = None
96-
9799

98100
def normalize_url_base(url_base: str) -> str:
99101
"""
@@ -104,13 +106,4 @@ def normalize_url_base(url_base: str) -> str:
104106
url_base = parsed_url.netloc if parsed_url.netloc else parsed_url.path
105107

106108
# Remove trailing slash if present
107-
return url_base.rstrip('/')
108-
109-
110-
@action
111-
def opsgenie_link_enricher(alert: PrometheusKubernetesAlert, params: OpsGenieLinkParams):
112-
"""
113-
Adds a link to finding of for the opsgenie alert.
114-
"""
115-
normalized_url_base = normalize_url_base(params.url_base)
116-
alert.add_link(Link(url=f"https://{normalized_url_base}/alert/list?query=alias:{alert.alert.fingerprint}", name="OpsGenie Alert", type=LinkType.OPSGENIE))
109+
return url_base.rstrip('/')

src/robusta/core/reporting/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
from abc import ABC, abstractmethod
77
from datetime import datetime
88
from enum import Enum
9-
from strenum import StrEnum
109
from typing import Any, Dict, List, Optional, Union
1110
from urllib.parse import urlencode
1211

1312
from pydantic.main import BaseModel
13+
from strenum import StrEnum
1414

1515
from robusta.core.discovery.top_service_resolver import TopServiceResolver
1616
from robusta.core.model.env_vars import ROBUSTA_UI_DOMAIN
@@ -94,7 +94,7 @@ def to_emoji(self) -> str:
9494
class LinkType(StrEnum):
9595
VIDEO = "video"
9696
PROMETHEUS_GENERATOR_URL = "prometheus_generator_url"
97-
OPSGENIE = "opsgenie"
97+
OPSGENIE_LIST_ALERT_BY_ALIAS = "opsgenie_list_alert_by_alias"
9898

9999

100100
class Link(BaseModel):

src/robusta/core/sinks/opsgenie/opsgenie_sink.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def handle_event(self, event_name: str, **kwargs):
4242
if event_name == "opsgenie_ack":
4343
self.__ack_alert(**kwargs)
4444
else:
45-
logging.warning("OpsGenieSink subscriber called with unknown event")
45+
logging.warning(f"OpsGenieSink subscriber called with unknown event {event_name}")
4646

4747
def __close_alert(self, finding: Finding):
4848
body = opsgenie_sdk.CloseAlertPayload(
@@ -63,7 +63,7 @@ def __ack_alert(self, fingerprint: str, user: str, note: str):
6363
body = opsgenie_sdk.AcknowledgeAlertPayload(
6464
user=user,
6565
note=note,
66-
source="Robusta OpsGenie Ack",
66+
source="Robusta",
6767
)
6868
try:
6969
self.alert_api.acknowledge_alert(

src/robusta/core/sinks/slack/slack_sink.py

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -107,31 +107,23 @@ def __replace_callback_with_string(self, slack_message, block_id, message_string
107107
raise ValueError("Missing required fields: channel_id, message_ts, or blocks.")
108108

109109
# Update the specific block
110-
updated_blocks = []
111-
block_found = False
112-
113-
for block in blocks:
110+
for i, block in enumerate(blocks):
114111
if block.get("block_id") == block_id:
115-
updated_blocks.append({
112+
blocks[i] = {
116113
"type": "section",
117114
"block_id": block_id,
118115
"text": {
119116
"type": "mrkdwn",
120117
"text": message_string
121118
}
122-
})
123-
block_found = True
124-
else:
125-
updated_blocks.append(block)
126-
127-
if not block_found:
128-
raise ValueError(f"No block found with block_id: {block_id}")
119+
}
120+
break
129121

130122
# Call the shorter update function
131123
return self.slack_sender.update_slack_message(
132124
channel=channel_id,
133125
ts=message_ts,
134-
blocks=updated_blocks,
126+
blocks=blocks,
135127
text=message_string
136128
)
137129

src/robusta/integrations/receiver.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ class SlackUserID(BaseModel):
7373
class SlackActionsMessage(BaseModel):
7474
actions: List[SlackActionRequest]
7575
user: Optional[SlackUserID]
76-
message: Optional[Dict[str, Any]]
7776

7877

7978
class ActionRequestReceiver:

0 commit comments

Comments
 (0)