From 1d2ff5f2228064e0c295039a9a8760a2b5edd8b0 Mon Sep 17 00:00:00 2001 From: Nathaniel May Date: Thu, 28 Oct 2021 15:57:35 -0400 Subject: [PATCH] add adapter logging interface --- core/dbt/events/README.md | 13 +++++++++++++ core/dbt/events/__init__.py | 1 + core/dbt/events/adapter_endpoint.py | 22 ++++++++++++++++++++++ core/dbt/events/types.py | 25 +++++++++++++++++++++++++ 4 files changed, 61 insertions(+) create mode 100644 core/dbt/events/adapter_endpoint.py diff --git a/core/dbt/events/README.md b/core/dbt/events/README.md index c821d251589..80a08bebf78 100644 --- a/core/dbt/events/README.md +++ b/core/dbt/events/README.md @@ -7,3 +7,16 @@ The event module provides types that represent what is happening in dbt in `even # Adding a New Event In `events.types` add a new class that represents the new event. This may be a simple class with no values, or it may require some values to construct downstream messaging. Only include the data necessary to construct this message within this class. If it fits into one of the existing hierarchies, add it as a subclass of the base class, and add it as a member of the union type so that all of the mypy checks will include it. Finally, add the type to the body of the functions that compose the final messages. + +# Adapter Maintainers +To integrate existing log messages from adapters, you likely have a line of code like this in your adapter already: +```python +from dbt.logger import GLOBAL_LOGGER as logger +``` + +Simply change it to these two lines with your adapter's database name, and all your existing call sites will now use the new system for v1.0: +```python +from dbt.events import AdapterLogger +logger = AdapterLogger("") +# e.g. AdapterLogger("Snowflake") +``` diff --git a/core/dbt/events/__init__.py b/core/dbt/events/__init__.py index e69de29bb2d..d0fc24d7bb5 100644 --- a/core/dbt/events/__init__.py +++ b/core/dbt/events/__init__.py @@ -0,0 +1 @@ +from .adapter_endpoint import AdapterLogger # noqa: F401 diff --git a/core/dbt/events/adapter_endpoint.py b/core/dbt/events/adapter_endpoint.py new file mode 100644 index 00000000000..7d71e7976e0 --- /dev/null +++ b/core/dbt/events/adapter_endpoint.py @@ -0,0 +1,22 @@ +from dataclasses import dataclass +from dbt.events.functions import fire_event +from dbt.events.types import ( + AdapterEventDebug, AdapterEventInfo, AdapterEventWarning, AdapterEventError +) + + +@dataclass +class AdapterLogger(): + name: str + + def debug(self, msg: str): + fire_event(AdapterEventDebug(name=self.name, raw_msg=msg)) + + def info(self, msg: str): + fire_event(AdapterEventInfo(name=self.name, raw_msg=msg)) + + def warning(self, msg: str): + fire_event(AdapterEventWarning(name=self.name, raw_msg=msg)) + + def error(self, msg: str): + fire_event(AdapterEventError(name=self.name, raw_msg=msg)) diff --git a/core/dbt/events/types.py b/core/dbt/events/types.py index 15e6003abde..8c2d98bacd5 100644 --- a/core/dbt/events/types.py +++ b/core/dbt/events/types.py @@ -52,6 +52,31 @@ def cli_msg(self) -> str: raise Exception("cli_msg not implemented for cli event") +@dataclass +class AdapterEventBase(): + name: str + raw_msg: str + + def cli_msg(self) -> str: + return f"{self.name} adapter: {self.raw_msg}" + + +class AdapterEventDebug(DebugLevel, AdapterEventBase, CliEventABC): + pass + + +class AdapterEventInfo(InfoLevel, AdapterEventBase, CliEventABC): + pass + + +class AdapterEventWarning(WarnLevel, AdapterEventBase, CliEventABC): + pass + + +class AdapterEventError(ErrorLevel, AdapterEventBase, CliEventABC): + pass + + class ParsingStart(InfoLevel, CliEventABC): def cli_msg(self) -> str: return "Start parsing."