diff --git a/engine/apps/alerts/integration_options_mixin.py b/engine/apps/alerts/integration_options_mixin.py
index a747d899..0594e0f6 100644
--- a/engine/apps/alerts/integration_options_mixin.py
+++ b/engine/apps/alerts/integration_options_mixin.py
@@ -49,6 +49,11 @@ class IntegrationOptionsMixin:
integration_config.slug: integration_config.short_description for integration_config in _config
}
INTEGRATION_FEATURED = [integration_config.slug for integration_config in _config if integration_config.is_featured]
+ INTEGRATION_FEATURED_TAG_NAME = {
+ integration_config.slug: integration_config.featured_tag_name
+ for integration_config in _config
+ if hasattr(integration_config, "featured_tag_name")
+ }
# The following attributes dynamically generated and used by apps.alerts.incident_appearance.renderers, templaters
# e.g. INTEGRATION_TO_DEFAULT_SLACK_TITLE_TEMPLATE, INTEGRATION_TO_DEFAULT_SLACK_MESSAGE_TEMPLATE, etc...
diff --git a/engine/apps/api/views/alert_receive_channel.py b/engine/apps/api/views/alert_receive_channel.py
index 95cb3120..cd4e2552 100644
--- a/engine/apps/api/views/alert_receive_channel.py
+++ b/engine/apps/api/views/alert_receive_channel.py
@@ -198,6 +198,9 @@ class AlertReceiveChannelView(
"display_name": integration_title,
"short_description": AlertReceiveChannel.INTEGRATION_SHORT_DESCRIPTION[integration_id],
"featured": integration_id in AlertReceiveChannel.INTEGRATION_FEATURED,
+ "featured_tag_name": AlertReceiveChannel.INTEGRATION_FEATURED_TAG_NAME[integration_id]
+ if integration_id in AlertReceiveChannel.INTEGRATION_FEATURED_TAG_NAME
+ else None,
}
# if integration is featured we show it in the beginning
if choice["featured"]:
diff --git a/engine/config_integrations/grafana_alerting.py b/engine/config_integrations/grafana_alerting.py
index 0b72ff20..5b0deb0c 100644
--- a/engine/config_integrations/grafana_alerting.py
+++ b/engine/config_integrations/grafana_alerting.py
@@ -8,6 +8,7 @@ short_description = (
description = None
is_displayed_on_web = True
is_featured = True
+featured_tag_name = "Quick Connect"
is_able_to_autoresolve = True
is_demo_alert_enabled = True
diff --git a/engine/config_integrations/webhook.py b/engine/config_integrations/webhook.py
index 823bc837..0041c8c1 100644
--- a/engine/config_integrations/webhook.py
+++ b/engine/config_integrations/webhook.py
@@ -2,9 +2,10 @@
enabled = True
title = "Webhook"
slug = "webhook"
-short_description = None
+short_description = "If your monitoring system isn't listed, choose Webhook for generic templates, and feel free to modify them as needed."
description = None
-is_featured = False
+is_featured = True
+featured_tag_name = "Generic"
is_displayed_on_web = True
is_able_to_autoresolve = True
is_demo_alert_enabled = True
diff --git a/grafana-plugin/src/containers/IntegrationContainers/CollapsedIntegrationRouteDisplay/CollapsedIntegrationRouteDisplay.tsx b/grafana-plugin/src/containers/IntegrationContainers/CollapsedIntegrationRouteDisplay/CollapsedIntegrationRouteDisplay.tsx
index 383be9b6..8a3504ac 100644
--- a/grafana-plugin/src/containers/IntegrationContainers/CollapsedIntegrationRouteDisplay/CollapsedIntegrationRouteDisplay.tsx
+++ b/grafana-plugin/src/containers/IntegrationContainers/CollapsedIntegrationRouteDisplay/CollapsedIntegrationRouteDisplay.tsx
@@ -55,7 +55,10 @@ const CollapsedIntegrationRouteDisplay: React.FC
{routeWording === 'Default' && (
@@ -93,7 +96,7 @@ const CollapsedIntegrationRouteDisplay: React.FC
- Escalate to
+ Trigger escalation chain:
{escalationChain?.name && (
-
- No Escalation chain
-
+ No Escalation chain selected
)}
diff --git a/grafana-plugin/src/containers/IntegrationContainers/ExpandedIntegrationRouteDisplay/ExpandedIntegrationRouteDisplay.tsx b/grafana-plugin/src/containers/IntegrationContainers/ExpandedIntegrationRouteDisplay/ExpandedIntegrationRouteDisplay.tsx
index 4c6bf8ee..cf24abe8 100644
--- a/grafana-plugin/src/containers/IntegrationContainers/ExpandedIntegrationRouteDisplay/ExpandedIntegrationRouteDisplay.tsx
+++ b/grafana-plugin/src/containers/IntegrationContainers/ExpandedIntegrationRouteDisplay/ExpandedIntegrationRouteDisplay.tsx
@@ -113,7 +113,7 @@ const ExpandedIntegrationRouteDisplay: React.FC
@@ -129,6 +129,16 @@ const ExpandedIntegrationRouteDisplay: React.FC
+ {routeIndex !== channelFiltersTotal.length - 1 && (
+
+
+
+ If the Routing Template is True, group the alerts using the Grouping Template, publish them to
+ messengers, and trigger the escalation chain.
+
+
+
+ )}
{/* Show Routing Template only for If/Else Routes, not for Default */}
{!isDefault && (
@@ -206,9 +216,13 @@ const ExpandedIntegrationRouteDisplay: React.FC
-
-
-
+
{
+
+ Integration receives alerts on an unique API URL, interprets them using set of templates tailored for
+ monitoring system and starts escalations.
+
{
{alertReceiveChannelChoice.display_name}
- {alertReceiveChannelChoice.featured && }
+ {alertReceiveChannelChoice.featured && alertReceiveChannelChoice.featured_tag_name && (
+
+ )}
{alertReceiveChannelChoice.short_description}
diff --git a/grafana-plugin/src/models/alert_receive_channel/alert_receive_channel.types.ts b/grafana-plugin/src/models/alert_receive_channel/alert_receive_channel.types.ts
index 8ab3eb5f..59f23648 100644
--- a/grafana-plugin/src/models/alert_receive_channel/alert_receive_channel.types.ts
+++ b/grafana-plugin/src/models/alert_receive_channel/alert_receive_channel.types.ts
@@ -13,6 +13,7 @@ export interface AlertReceiveChannelOption {
value: number;
featured: boolean;
short_description: string;
+ featured_tag_name: string;
}
export interface AlertReceiveChannelCounters {
@@ -43,6 +44,7 @@ export interface AlertReceiveChannel {
heartbeat: Heartbeat | null;
is_available_for_integration_heartbeat: boolean;
routes_count: number;
+ connected_escalations_chains_count: number;
allow_delete: boolean;
deleted?: boolean;
}
diff --git a/grafana-plugin/src/pages/integration_2/Integration2.helper.ts b/grafana-plugin/src/pages/integration_2/Integration2.helper.ts
index aefa772f..4f0f430c 100644
--- a/grafana-plugin/src/pages/integration_2/Integration2.helper.ts
+++ b/grafana-plugin/src/pages/integration_2/Integration2.helper.ts
@@ -46,6 +46,15 @@ const IntegrationHelper = {
return routeIndex ? 'Else' : 'If';
},
+ getRouteConditionTooltipWording(channelFilters: Array, routeIndex: number) {
+ const totalCount = Object.keys(channelFilters).length;
+
+ if (routeIndex === totalCount - 1) {
+ return 'If the alert payload does not match to the previous routes, it will be directed to this default route.';
+ }
+ return 'If the alert payload evaluates the route template as True, it will be directed to this route. It will not be evaluated against the subsequent routes.';
+ },
+
getMaintenanceText(maintenanceUntill: number, mode: number = undefined) {
const date = dayjs(new Date(maintenanceUntill * 1000));
const now = dayjs();
diff --git a/grafana-plugin/src/pages/integration_2/Integration2.tsx b/grafana-plugin/src/pages/integration_2/Integration2.tsx
index 17c2b7d5..fd495170 100644
--- a/grafana-plugin/src/pages/integration_2/Integration2.tsx
+++ b/grafana-plugin/src/pages/integration_2/Integration2.tsx
@@ -207,7 +207,6 @@ class Integration2 extends React.Component
@@ -255,7 +254,10 @@ class Integration2 extends React.Component