From 6e7e572e86d1941c4e9cf506b43f6fbeea5c3dbc Mon Sep 17 00:00:00 2001 From: Quigley Malcolm Date: Tue, 18 Apr 2023 13:20:22 -0700 Subject: [PATCH] [BACKPORT 1.3.latest] Improved event log msg stringification (#7341) * Add tests for logging jinja2.Undefined objects [CT-2259](https://github.com/dbt-labs/dbt-core/issues/7108) identifies an issue wherein dbt-core 1.0-1.3 raise errors if a jinja2.Undefined object is attempted to be logged. This generally happened in the form of `{{ log(undefined_variable, info=True) }}`. This commit adding this test exists for two reasons 1. Ensure we don't have a regression in this going forward 2. Exist as a commit to be used for backport fixes for dbt-core 1.0-1.3 * Add tests for checking `DBT_ENV_SECRET_`s don't break logging [CT-1783](https://github.com/dbt-labs/dbt-core/issues/6568) describes a bug in dbt-core 1.0-1.3 wherein when a `DBT_ENV_SECRET_` all `{{ log("logging stuff", info=True) }}` invocations break. This commit adds a test for this for two reasons: 1. Ensure we don't regress to this behavior going forward 2. Act as a base commit for making the backport fixes to dbt-core 1.0-1.3 * Add changie info for changes * Ensure `log()` calls from jinja ensure the msg is stringified The simplest way to resolve [CT-2259](https://github.com/dbt-labs/dbt-core/issues/7108) and [CT-1783](https://github.com/dbt-labs/dbt-core/issues/6568) in backports to dbt-core < 1.4 is to ensure `msg` in `BaseContext.log()` is stringified. --------- Co-authored-by: leahwicz <60146280+leahwicz@users.noreply.github.com> --- .../unreleased/Fixes-20230331-095428.yaml | 6 +++++ core/dbt/context/base.py | 4 ++++ test/unit/test_base_context.py | 22 +++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 .changes/unreleased/Fixes-20230331-095428.yaml create mode 100644 test/unit/test_base_context.py diff --git a/.changes/unreleased/Fixes-20230331-095428.yaml b/.changes/unreleased/Fixes-20230331-095428.yaml new file mode 100644 index 00000000000..772ce077b7d --- /dev/null +++ b/.changes/unreleased/Fixes-20230331-095428.yaml @@ -0,0 +1,6 @@ +kind: Fixes +body: Improved failed event serialization handling and associated tests +time: 2023-03-31T09:54:28.701963-07:00 +custom: + Author: QMalcolm + Issue: 7113 7108 6568 diff --git a/core/dbt/context/base.py b/core/dbt/context/base.py index ed2d6548d16..8d70a5a057c 100644 --- a/core/dbt/context/base.py +++ b/core/dbt/context/base.py @@ -556,6 +556,10 @@ def log(msg: str, info: bool = False) -> str: {{ log("Running some_macro: " ~ arg1 ~ ", " ~ arg2) }} {% endmacro %}" """ + + if not isinstance(msg, str): + msg = str(msg) + if info: fire_event(MacroEventInfo(msg=msg)) else: diff --git a/test/unit/test_base_context.py b/test/unit/test_base_context.py new file mode 100644 index 00000000000..0dc2d93ddca --- /dev/null +++ b/test/unit/test_base_context.py @@ -0,0 +1,22 @@ +import os + +from dbt.context.base import BaseContext +from jinja2.runtime import Undefined + + +class TestBaseContext: + def test_log_jinja_undefined(self): + # regression test for CT-2259 + try: + os.environ["DBT_ENV_SECRET_LOG_TEST"] = "cats_are_cool" + BaseContext.log(msg=Undefined(), info=True) + except Exception as e: + assert False, f"Logging an jinja2.Undefined object raises an exception: {e}" + + def test_log_with_dbt_env_secret(self): + # regression test for CT-1783 + try: + os.environ["DBT_ENV_SECRET_LOG_TEST"] = "cats_are_cool" + BaseContext.log({"fact1": "I like cats"}, info=True) + except Exception as e: + assert False, f"Logging while a `DBT_ENV_SECRET` was set raised an exception: {e}"