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",
]