diff --git a/engine/apps/alerts/models/channel_filter.py b/engine/apps/alerts/models/channel_filter.py index b1f1dae2..fb369088 100644 --- a/engine/apps/alerts/models/channel_filter.py +++ b/engine/apps/alerts/models/channel_filter.py @@ -113,20 +113,7 @@ class ChannelFilter(OrderedModel): return satisfied_filter def is_satisfying(self, raw_request_data, title, message=None): - AlertReceiveChannel = apps.get_model("alerts", "AlertReceiveChannel") - - return ( - self.is_default - or self.check_filter(json.dumps(raw_request_data)) - or self.check_filter(str(title)) - or - # Special case for Amazon SNS - ( - self.check_filter(str(message)) - if self.alert_receive_channel.integration == AlertReceiveChannel.INTEGRATION_AMAZON_SNS - else False - ) - ) + return self.is_default or self.check_filter(json.dumps(raw_request_data)) or self.check_filter(str(title)) def check_filter(self, value): return re.search(self.filtering_term, value) diff --git a/engine/apps/alerts/tests/test_alert_group_renderer.py b/engine/apps/alerts/tests/test_alert_group_renderer.py index 5253832e..aa7df113 100644 --- a/engine/apps/alerts/tests/test_alert_group_renderer.py +++ b/engine/apps/alerts/tests/test_alert_group_renderer.py @@ -2,7 +2,7 @@ import pytest from apps.alerts.incident_appearance.templaters import AlertSlackTemplater from apps.alerts.models import AlertGroup -from apps.integrations.metadata.configuration import grafana +from config_integrations import grafana @pytest.mark.django_db diff --git a/engine/apps/alerts/tests/test_default_templates.py b/engine/apps/alerts/tests/test_default_templates.py index 69288fb6..63cfd0b8 100644 --- a/engine/apps/alerts/tests/test_default_templates.py +++ b/engine/apps/alerts/tests/test_default_templates.py @@ -10,9 +10,9 @@ from apps.alerts.incident_appearance.templaters import ( AlertWebTemplater, ) from apps.alerts.models import Alert, AlertReceiveChannel -from apps.integrations.metadata.configuration import grafana from common.jinja_templater import jinja_template_env from common.utils import getattrd +from config_integrations import grafana @pytest.mark.django_db diff --git a/engine/apps/integrations/metadata/configuration/amazon_sns.py b/engine/apps/integrations/metadata/configuration/amazon_sns.py deleted file mode 100644 index 954542d0..00000000 --- a/engine/apps/integrations/metadata/configuration/amazon_sns.py +++ /dev/null @@ -1,99 +0,0 @@ -# Main -enabled = True -title = "Amazon SNS" -slug = "amazon_sns" -short_description = None -is_displayed_on_web = True -description = None -is_featured = False -is_able_to_autoresolve = True -is_demo_alert_enabled = True - -description = None - -# Default templates -slack_title = """\ -{% if payload|length == 0 -%} -{% set title = payload.get("AlarmName", "Alert") %} -{%- else -%} -{% set title = "Alert" %} -{%- endif %} - -*<{{ grafana_oncall_link }}|#{{ grafana_oncall_incident_id }} {{ title }}>* via {{ integration_name }} -{% if source_link %} - (*<{{ source_link }}|source>*) -{%- endif %}""" - -slack_message = """\ -{% if payload|length == 1 and "message" in payload -%} -{{ payload.get("message", "Non-JSON payload received. Please make sure you publish monitoring Alarms to SNS, not logs: https://docs.amixr.io/#/integrations/amazon_sns") }} -{%- else -%} -*State* {{ payload.get("NewStateValue", "NO") }} -Region: {{ payload.get("Region", "Undefined") }} -_Description_: {{ payload.get("AlarmDescription", "Undefined") }} -{%- endif %} -""" - -slack_image_url = None - -web_title = """\ -{% if payload|length == 0 -%} -{{ payload.get("AlarmName", "Alert")}} -{%- else -%} -Alert -{%- endif %}""" - -web_message = """\ -{% if payload|length == 1 and "message" in payload -%} -{{ payload.get("message", "Non-JSON payload received. Please make sure you publish monitoring Alarms to SNS, not logs: https://docs.amixr.io/#/integrations/amazon_sns") }} -{%- else -%} -**State** {{ payload.get("NewStateValue", "NO") }} -Region: {{ payload.get("Region", "Undefined") }} -*Description*: {{ payload.get("AlarmDescription", "Undefined") }} -{%- endif %} -""" - -web_image_url = slack_image_url - -sms_title = web_title - -phone_call_title = web_title - -email_title = web_title - -email_message = "{{ payload|tojson_pretty }}" - -telegram_title = sms_title - -telegram_message = """\ -{% if payload|length == 1 and "message" in payload -%} -{{ payload.get("message", "Non-JSON payload received. Please make sure you publish monitoring Alarms to SNS, not logs: https://docs.amixr.io/#/integrations/amazon_sns") }} -{%- else -%} -State {{ payload.get("NewStateValue", "NO") }} -Region: {{ payload.get("Region", "Undefined") }} -Description: {{ payload.get("AlarmDescription", "Undefined") }} -{%- endif %} -""" - -telegram_image_url = slack_image_url - -source_link = """\ -{% if payload|length == 0 -%} -{% if payload.get("Trigger", {}).get("Namespace") == "AWS/ElasticBeanstalk" -%} -https://console.aws.amazon.com/elasticbeanstalk/home?region={{ payload.get("TopicArn").split(":")[3] }} -{%- else -%} -https://console.aws.amazon.com/cloudwatch//home?region={{ payload.get("TopicArn").split(":")[3] }} -{%- endif %} -{%- endif %}""" - -grouping_id = web_title - -resolve_condition = """\ -{{ payload.get("NewStateValue", "") == "OK" }} -""" - -acknowledge_condition = None - -group_verbose_name = web_title - -example_payload = {"foo": "bar"} diff --git a/engine/apps/slack/scenarios/alertgroup_appearance.py b/engine/apps/slack/scenarios/alertgroup_appearance.py index edf0a704..1ccba05f 100644 --- a/engine/apps/slack/scenarios/alertgroup_appearance.py +++ b/engine/apps/slack/scenarios/alertgroup_appearance.py @@ -56,7 +56,11 @@ class OpenAlertAppearanceDialogStep( raw_request_data = json.dumps(alert_group.alerts.first().raw_request_data, sort_keys=True, indent=4) # This is a special case for amazon sns notifications in str format CHEKED - if alert_group.channel.integration == AlertReceiveChannel.INTEGRATION_AMAZON_SNS and raw_request_data == "{}": + if ( + AlertReceiveChannel.INTEGRATION_AMAZON_SNS is not None + and alert_group.channel.integration == AlertReceiveChannel.INTEGRATION_AMAZON_SNS + and raw_request_data == "{}" + ): raw_request_data = alert_group.alerts.first().message raw_request_data_chunks = [ diff --git a/engine/apps/integrations/metadata/configuration/alertmanager.py b/engine/config_integrations/alertmanager.py similarity index 100% rename from engine/apps/integrations/metadata/configuration/alertmanager.py rename to engine/config_integrations/alertmanager.py diff --git a/engine/config_integrations/elastalert.py b/engine/config_integrations/elastalert.py new file mode 100644 index 00000000..3ede0fb4 --- /dev/null +++ b/engine/config_integrations/elastalert.py @@ -0,0 +1,66 @@ +# Main +enabled = True +title = "Elastalert" +slug = "elastalert" +short_description = "Elastic" +is_displayed_on_web = True +description = None +is_featured = False +is_able_to_autoresolve = True +is_demo_alert_enabled = True + +description = None + +# Default templates +slack_title = """\ +*<{{ grafana_oncall_link }}|#{{ grafana_oncall_incident_id }} Incident>* via {{ integration_name }} +{% if source_link %} + (*<{{ source_link }}|source>*) +{%- endif %}""" + +slack_message = "```{{ payload|tojson_pretty }}```" + +slack_image_url = None + +web_title = "Incident" + +web_message = """\ +``` +{{ payload|tojson_pretty }} +``` +""" + +web_image_url = slack_image_url + +sms_title = web_title + +phone_call_title = sms_title + +email_title = web_title + +email_message = "{{ payload|tojson_pretty }}" + +telegram_title = sms_title + +telegram_message = "{{ payload|tojson_pretty }}" + +telegram_image_url = slack_image_url + +source_link = None + +grouping_id = '{{ payload.get("alert_uid", "")}}' + +resolve_condition = """\ +{%- if "is_amixr_heartbeat_restored" in payload -%} +{# We don't know the payload format from your integration. #} +{# The heartbeat alerts will go here so we check for our own key #} +{{ payload["is_amixr_heartbeat_restored"] }} +{%- else -%} +{{ payload.get("state", "").upper() == "OK" }}' +{%- endif %}""" + +acknowledge_condition = None + +group_verbose_name = "Incident" + +example_payload = {"message": "This alert was sent by user for the demonstration purposes"} diff --git a/engine/apps/integrations/metadata/configuration/formatted_webhook.py b/engine/config_integrations/formatted_webhook.py similarity index 100% rename from engine/apps/integrations/metadata/configuration/formatted_webhook.py rename to engine/config_integrations/formatted_webhook.py diff --git a/engine/apps/integrations/metadata/configuration/grafana.py b/engine/config_integrations/grafana.py similarity index 100% rename from engine/apps/integrations/metadata/configuration/grafana.py rename to engine/config_integrations/grafana.py diff --git a/engine/apps/integrations/metadata/configuration/grafana_alerting.py b/engine/config_integrations/grafana_alerting.py similarity index 100% rename from engine/apps/integrations/metadata/configuration/grafana_alerting.py rename to engine/config_integrations/grafana_alerting.py diff --git a/engine/apps/integrations/metadata/configuration/heartbeat.py b/engine/config_integrations/heartbeat.py similarity index 100% rename from engine/apps/integrations/metadata/configuration/heartbeat.py rename to engine/config_integrations/heartbeat.py diff --git a/engine/apps/integrations/metadata/configuration/inbound_email.py b/engine/config_integrations/inbound_email.py similarity index 100% rename from engine/apps/integrations/metadata/configuration/inbound_email.py rename to engine/config_integrations/inbound_email.py diff --git a/engine/config_integrations/kapacitor.py b/engine/config_integrations/kapacitor.py new file mode 100644 index 00000000..d5f013fe --- /dev/null +++ b/engine/config_integrations/kapacitor.py @@ -0,0 +1,65 @@ +# Main +enabled = True +title = "Kapacitor" +slug = "kapacitor" +short_description = "InfluxDB" +description = None +is_displayed_on_web = True +is_featured = False +is_able_to_autoresolve = True +is_demo_alert_enabled = True + +description = None + +# Default templates +slack_title = """\ +*<{{ grafana_oncall_link }}|#{{ grafana_oncall_incident_id }} {{ payload.get("id", "Title undefined (check Slack Title Template)") }}>* via {{ integration_name }} +{% if source_link %} + (*<{{ source_link }}|source>*) +{%- endif %}""" + +slack_message = """\ +```{{ payload|tojson_pretty }}``` +""" + +slack_image_url = None + +web_title = '{{ payload.get("id", "Title undefined (check Web Title Template)") }}' + +web_message = """\ +``` +{{ payload|tojson_pretty }} +``` +""" + +web_image_url = slack_image_url + +sms_title = web_title + +phone_call_title = web_title + +email_title = web_title + +email_message = slack_message + +telegram_title = sms_title + +telegram_message = "{{ payload|tojson_pretty }}" + +telegram_image_url = slack_image_url + +source_link = None + +grouping_id = '{{ payload.get("id", "") }}' + +resolve_condition = '{{ payload.get("level", "").startswith("OK") }}' + +acknowledge_condition = None + +group_verbose_name = '{{ payload.get("id", "") }}' + +example_payload = { + "id": "TestAlert", + "message": "This alert was sent by user for the demonstration purposes", + "data": "{foo: bar}", +} diff --git a/engine/apps/integrations/metadata/configuration/maintenance.py b/engine/config_integrations/maintenance.py similarity index 100% rename from engine/apps/integrations/metadata/configuration/maintenance.py rename to engine/config_integrations/maintenance.py diff --git a/engine/apps/integrations/metadata/configuration/manual.py b/engine/config_integrations/manual.py similarity index 100% rename from engine/apps/integrations/metadata/configuration/manual.py rename to engine/config_integrations/manual.py diff --git a/engine/apps/integrations/metadata/configuration/slack_channel.py b/engine/config_integrations/slack_channel.py similarity index 100% rename from engine/apps/integrations/metadata/configuration/slack_channel.py rename to engine/config_integrations/slack_channel.py diff --git a/engine/apps/integrations/metadata/configuration/webhook.py b/engine/config_integrations/webhook.py similarity index 100% rename from engine/apps/integrations/metadata/configuration/webhook.py rename to engine/config_integrations/webhook.py diff --git a/engine/settings/base.py b/engine/settings/base.py index 0495440e..9b6cca81 100644 --- a/engine/settings/base.py +++ b/engine/settings/base.py @@ -428,15 +428,16 @@ FEATURE_EXTRA_MESSAGING_BACKENDS_ENABLED = getenv_boolean("FEATURE_EXTRA_MESSAGI EXTRA_MESSAGING_BACKENDS = [] INSTALLED_ONCALL_INTEGRATIONS = [ - "apps.integrations.metadata.configuration.alertmanager", - "apps.integrations.metadata.configuration.grafana", - "apps.integrations.metadata.configuration.grafana_alerting", - "apps.integrations.metadata.configuration.formatted_webhook", - "apps.integrations.metadata.configuration.webhook", - "apps.integrations.metadata.configuration.amazon_sns", - "apps.integrations.metadata.configuration.heartbeat", - "apps.integrations.metadata.configuration.inbound_email", - "apps.integrations.metadata.configuration.maintenance", - "apps.integrations.metadata.configuration.manual", - "apps.integrations.metadata.configuration.slack_channel", + "config_integrations.alertmanager", + "config_integrations.grafana", + "config_integrations.grafana_alerting", + "config_integrations.formatted_webhook", + "config_integrations.webhook", + "config_integrations.kapacitor", + "config_integrations.elastalert", + "config_integrations.heartbeat", + "config_integrations.inbound_email", + "config_integrations.maintenance", + "config_integrations.manual", + "config_integrations.slack_channel", ]