From cd770e85ea76fb7d593a64218427feee486f8a92 Mon Sep 17 00:00:00 2001 From: Vadim Stepanov Date: Tue, 3 Jan 2023 17:44:56 +0000 Subject: [PATCH 1/2] Catch DoesNotExist in post_slack_rate_limit_message (#1067) --- engine/apps/slack/tasks.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/engine/apps/slack/tasks.py b/engine/apps/slack/tasks.py index 6dbd0a18..29a92691 100644 --- a/engine/apps/slack/tasks.py +++ b/engine/apps/slack/tasks.py @@ -467,7 +467,13 @@ def post_or_update_log_report_message_task(alert_group_pk, slack_team_identity_p ) def post_slack_rate_limit_message(integration_id): AlertReceiveChannel = apps.get_model("alerts", "AlertReceiveChannel") - integration = AlertReceiveChannel.objects.get(pk=integration_id) + + try: + integration = AlertReceiveChannel.objects.get(pk=integration_id) + except AlertReceiveChannel.DoesNotExist: + logger.warning(f"AlertReceiveChannel {integration_id} doesn't exist") + return + if not compare_escalations(post_slack_rate_limit_message.request.id, integration.rate_limit_message_task_id): logger.info( f"post_slack_rate_limit_message. integration {integration_id}. ID mismatch. " From 7c26eb559b1b623af791aa640897eced2b5938b5 Mon Sep 17 00:00:00 2001 From: Michael Derynck Date: Tue, 3 Jan 2023 19:30:59 +0000 Subject: [PATCH 2/2] Improve handling of template exceptions during group data creation (#1068) # What this PR does With the addition of tighter controls on jinja templates handle exceptions while rendering group data as follows: - Title will cache error message as title and display to user and the error will be logged - Group distinction will be left as None and the error will be logged - Is resolve signal will be treated as False and the error will be logged - Is acknowledge signal will be treated as False and the error will be logged ## Which issue(s) this PR fixes https://github.com/grafana/oncall-private/issues/1542 --- engine/apps/alerts/models/alert.py | 32 ++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/engine/apps/alerts/models/alert.py b/engine/apps/alerts/models/alert.py index 9a6c383e..3a1c7fe5 100644 --- a/engine/apps/alerts/models/alert.py +++ b/engine/apps/alerts/models/alert.py @@ -13,6 +13,7 @@ from apps.alerts.constants import TASK_DELAY_SECONDS from apps.alerts.incident_appearance.templaters import TemplateLoader from apps.alerts.tasks import distribute_alert, send_alert_group_signal from common.jinja_templater import apply_jinja_template +from common.jinja_templater.apply_jinja_template import JinjaTemplateError, JinjaTemplateWarning from common.public_primary_keys import generate_public_primary_key, increase_public_primary_key_length logger = logging.getLogger(__name__) @@ -189,12 +190,23 @@ class Alert(models.Model): # set web_title_cache to web title to allow alert group searching based on web_title_cache web_title_template = template_manager.get_attr_template("title", alert_receive_channel, render_for="web") if web_title_template: - web_title_cache = apply_jinja_template(web_title_template, raw_request_data) + try: + web_title_cache = apply_jinja_template(web_title_template, raw_request_data) + except (JinjaTemplateError, JinjaTemplateWarning) as e: + web_title_cache = e.fallback_message + logger.warning( + f"web_title_cache error on channel={alert_receive_channel.public_primary_key}: {e.fallback_message}" + ) else: web_title_cache = None if grouping_id_template is not None: - group_distinction = apply_jinja_template(grouping_id_template, raw_request_data) + try: + group_distinction = apply_jinja_template(grouping_id_template, raw_request_data) + except (JinjaTemplateError, JinjaTemplateWarning) as e: + logger.warning( + f"grouping_id_template error on channel={alert_receive_channel.public_primary_key}: {e.fallback_message}" + ) # Insert random uuid to prevent grouping of demo alerts or alerts with group_distinction=None if is_demo or not group_distinction: @@ -204,13 +216,25 @@ class Alert(models.Model): group_distinction = hashlib.md5(str(group_distinction).encode()).hexdigest() if resolve_condition_template is not None: - is_resolve_signal = apply_jinja_template(resolve_condition_template, payload=raw_request_data) + try: + is_resolve_signal = apply_jinja_template(resolve_condition_template, payload=raw_request_data) + except (JinjaTemplateError, JinjaTemplateWarning) as e: + logger.warning( + f"resolve_condition_template error on channel={alert_receive_channel.public_primary_key}: {e.fallback_message}" + ) + if isinstance(is_resolve_signal, str): is_resolve_signal = is_resolve_signal.strip().lower() in ["1", "true", "ok"] else: is_resolve_signal = False if acknowledge_condition_template is not None: - is_acknowledge_signal = apply_jinja_template(acknowledge_condition_template, payload=raw_request_data) + try: + is_acknowledge_signal = apply_jinja_template(acknowledge_condition_template, payload=raw_request_data) + except (JinjaTemplateError, JinjaTemplateWarning) as e: + logger.warning( + f"acknowledge_condition_template error on channel={alert_receive_channel.public_primary_key}: {e.fallback_message}" + ) + if isinstance(is_acknowledge_signal, str): is_acknowledge_signal = is_acknowledge_signal.strip().lower() in ["1", "true", "ok"] else: