Skip to content

Commit 5e9f5e4

Browse files
authored
Add opsgenie sink extra details from alert labels (#1587)
1 parent 06f43f3 commit 5e9f5e4

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

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

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ def __init__(self, sink_config: OpsGenieSinkConfigWrapper, registry):
3232
if sink_config.opsgenie_sink.host is not None:
3333
self.conf.host = sink_config.opsgenie_sink.host
3434

35+
if sink_config.opsgenie_sink.extra_details_labels is not None:
36+
self.conf.extra_details_labels = sink_config.opsgenie_sink.extra_details_labels
37+
3538
self.api_client = opsgenie_sdk.api_client.ApiClient(configuration=self.conf)
3639
self.alert_api = opsgenie_sdk.AlertApi(api_client=self.api_client)
3740

@@ -52,20 +55,15 @@ def __close_alert(self, finding: Finding):
5255

5356
def __open_alert(self, finding: Finding, platform_enabled: bool):
5457
description = self.__to_description(finding, platform_enabled)
58+
details = self.__to_details(finding)
5559
self.tags.insert(0, self.cluster_name)
5660
body = opsgenie_sdk.CreateAlertPayload(
5761
source="Robusta",
5862
message=finding.title,
5963
description=description,
6064
alias=finding.fingerprint,
6165
responders=[{"name": team, "type": "team"} for team in self.teams],
62-
details={
63-
"Resource": finding.subject.name,
64-
"Cluster": self.cluster_name,
65-
"Namespace": finding.subject.namespace,
66-
"Node": finding.subject.node,
67-
"Source": str(finding.source.name),
68-
},
66+
details=details,
6967
tags=self.tags,
7068
entity=finding.service_key,
7169
priority=PRIORITY_MAP.get(finding.severity, "P3"),
@@ -96,6 +94,23 @@ def __to_description(self, finding: Finding, platform_enabled: bool) -> str:
9694

9795
return f"{description}{self.__enrichments_as_text(finding.enrichments)}"
9896

97+
def __to_details(self, finding: Finding) -> dict:
98+
details = {
99+
"Resource": finding.subject.name,
100+
"Cluster": self.cluster_name,
101+
"Namespace": finding.subject.namespace,
102+
"Node": finding.subject.node,
103+
"Source": str(finding.source.name),
104+
}
105+
lower_details_key = [k.lower() for k in details.keys()]
106+
# If there are extra details labels in the config extra_details_labels,
107+
# add them without altering the already existing details.
108+
if self.conf.extra_details_labels:
109+
for key, value in finding.subject.labels:
110+
if key in self.conf.extra_details_labels and not key in lower_details_key:
111+
details[key] = value
112+
return details
113+
99114
@classmethod
100115
def __enrichments_as_text(cls, enrichments: List[Enrichment]) -> str:
101116
transformer = Transformer()

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class OpsGenieSinkParams(SinkBaseParams):
99
teams: List[str] = []
1010
tags: List[str] = []
1111
host: Optional[str] = None # NOTE: If None, the default value will be used from opsgenie_sdk
12+
extra_details_labels: Optional[bool] = None
1213

1314
@classmethod
1415
def _get_sink_type(cls):

0 commit comments

Comments
 (0)