diff --git a/CHANGELOG.md b/CHANGELOG.md index 44479387..a9189887 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Support prescribed labels ([#3848](https://github.com/grafana/oncall/pull/3848)) - Add status change trigger type to webhooks ([#3920](https://github.com/grafana/oncall/pull/3920)) - Add `EMAIL_USE_SSL` environment setting by @WoodyWoodsta ([#3911](https://github.com/grafana/oncall/pull/3911)) +- Add `parse_json` Jinja2 template filter by @KarimDarwish ([#3929](https://github.com/grafana/oncall/pull/3929)) ### Fixed diff --git a/docs/sources/configure/jinja2-templating/index.md b/docs/sources/configure/jinja2-templating/index.md index 39c8fae6..4eb2b0a4 100644 --- a/docs/sources/configure/jinja2-templating/index.md +++ b/docs/sources/configure/jinja2-templating/index.md @@ -227,3 +227,5 @@ Built-in functions: - Usage example: `{{ payload.ruleName | regex_match(".*") }}` - `b64decode` - performs a base64 string decode - Usage example: `{{ payload.data | b64decode }}` +- `parse_json` - parses a given json string to an object + - Usage example: `{{ (payload.data | b64decode | parse_json).name }}` diff --git a/engine/common/jinja_templater/filters.py b/engine/common/jinja_templater/filters.py index a14a3ad5..3eb98442 100644 --- a/engine/common/jinja_templater/filters.py +++ b/engine/common/jinja_templater/filters.py @@ -68,3 +68,10 @@ def b64decode(value): return base64.b64decode(value).decode("utf-8") except (ValueError, AttributeError, TypeError): return None + + +def parse_json(value): + try: + return json.loads(value) + except (ValueError, AttributeError, TypeError): + return None diff --git a/engine/common/jinja_templater/jinja_template_env.py b/engine/common/jinja_templater/jinja_template_env.py index 1941bff8..d9204928 100644 --- a/engine/common/jinja_templater/jinja_template_env.py +++ b/engine/common/jinja_templater/jinja_template_env.py @@ -9,6 +9,7 @@ from .filters import ( datetimeformat_as_timezone, iso8601_to_time, json_dumps, + parse_json, regex_match, regex_replace, regex_search, @@ -33,3 +34,4 @@ jinja_template_env.filters["regex_match"] = regex_match jinja_template_env.filters["regex_search"] = regex_search jinja_template_env.filters["json_dumps"] = json_dumps jinja_template_env.filters["b64decode"] = b64decode +jinja_template_env.filters["parse_json"] = parse_json diff --git a/engine/common/tests/test_apply_jinja_template.py b/engine/common/tests/test_apply_jinja_template.py index 54d84fdd..e127fb7d 100644 --- a/engine/common/tests/test_apply_jinja_template.py +++ b/engine/common/tests/test_apply_jinja_template.py @@ -187,3 +187,16 @@ def test_apply_jinja_template_to_alert_payload_and_labels(mock_apply_jinja_templ ) def test_templated_value_is_truthy(value, expected): assert templated_value_is_truthy(value) == expected + + +def test_apply_jinja_template_parse_json(): + payload = {"message": base64.b64encode(b'{"name": "test"}').decode("utf-8")} + expected_name = "test" + + assert ( + apply_jinja_template( + "{{ (payload.message | b64decode | parse_json).name }}", + payload, + ) + == expected_name + )