From 793db573007397d6d4afa90c0eff6051e417a758 Mon Sep 17 00:00:00 2001 From: VersusFacit <67295367+VersusFacit@users.noreply.github.com> Date: Wed, 16 Oct 2024 03:26:22 -0700 Subject: [PATCH 1/6] Add adapter telemetry method for core model run snowplow event. --- dbt/adapters/base/impl.py | 12 ++++++++++++ dbt/adapters/base/relation.py | 7 +++++++ 2 files changed, 19 insertions(+) diff --git a/dbt/adapters/base/impl.py b/dbt/adapters/base/impl.py index f3788fe3..234e2401 100644 --- a/dbt/adapters/base/impl.py +++ b/dbt/adapters/base/impl.py @@ -4,6 +4,7 @@ from contextlib import contextmanager from datetime import datetime from enum import Enum +from importlib import import_module from multiprocessing.context import SpawnContext from typing import ( Any, @@ -61,12 +62,14 @@ ComponentName, InformationSchema, SchemaSearchMap, + AdapterTrackingRelationInfo, ) from dbt.adapters.cache import RelationsCache, _make_ref_key_dict from dbt.adapters.capability import Capability, CapabilityDict from dbt.adapters.contracts.connection import Credentials from dbt.adapters.contracts.macros import MacroResolverProtocol from dbt.adapters.contracts.relation import RelationConfig + from dbt.adapters.events.types import ( CacheMiss, CatalogGenerationError, @@ -1743,6 +1746,15 @@ def capabilities(cls) -> CapabilityDict: def supports(cls, capability: Capability) -> bool: return bool(cls.capabilities()[capability]) + @available + @classmethod + def get_adapter_run_info(cls, config: RelationConfig) -> AdapterTrackingRelationInfo: + return AdapterTrackingRelationInfo( + adapter_name="base_adapter", + version=import_module(f"dbt.adapters.__about__").version, + adapter_details={}, + ) + COLUMNS_EQUAL_SQL = """ with diff_count as ( diff --git a/dbt/adapters/base/relation.py b/dbt/adapters/base/relation.py index 80dbd34b..fdccab8b 100644 --- a/dbt/adapters/base/relation.py +++ b/dbt/adapters/base/relation.py @@ -531,3 +531,10 @@ def flatten(self, allow_multiple_databases: bool = False) -> "SchemaSearchMap": ) return new + + +@dataclass(frozen=True, eq=False, repr=False) +class AdapterTrackingRelationInfo(FakeAPIObject, Hashable): + adapter_name: str + version: str + adapter_details: Any From 31a772e87e28058c87e54536d493f1f36c6b066f Mon Sep 17 00:00:00 2001 From: VersusFacit <67295367+VersusFacit@users.noreply.github.com> Date: Wed, 16 Oct 2024 03:31:37 -0700 Subject: [PATCH 2/6] lint. --- dbt/adapters/base/impl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbt/adapters/base/impl.py b/dbt/adapters/base/impl.py index 234e2401..24088c8f 100644 --- a/dbt/adapters/base/impl.py +++ b/dbt/adapters/base/impl.py @@ -1751,7 +1751,7 @@ def supports(cls, capability: Capability) -> bool: def get_adapter_run_info(cls, config: RelationConfig) -> AdapterTrackingRelationInfo: return AdapterTrackingRelationInfo( adapter_name="base_adapter", - version=import_module(f"dbt.adapters.__about__").version, + version=import_module("dbt.adapters.__about__").version, adapter_details={}, ) From 9fcc7892edcedb4aaea2a9d0fe70b04733edb4ef Mon Sep 17 00:00:00 2001 From: VersusFacit <67295367+VersusFacit@users.noreply.github.com> Date: Wed, 16 Oct 2024 03:32:11 -0700 Subject: [PATCH 3/6] Changelog. --- .changes/unreleased/Under the Hood-20241016-033159.yaml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changes/unreleased/Under the Hood-20241016-033159.yaml diff --git a/.changes/unreleased/Under the Hood-20241016-033159.yaml b/.changes/unreleased/Under the Hood-20241016-033159.yaml new file mode 100644 index 00000000..27e6730f --- /dev/null +++ b/.changes/unreleased/Under the Hood-20241016-033159.yaml @@ -0,0 +1,6 @@ +kind: Under the Hood +body: Add adapter telemetry. +time: 2024-10-16T03:31:59.334011-07:00 +custom: + Author: versusfacit + Issue: "301" From 755f446a75c214a64013e8173e8e34e53bfccd9c Mon Sep 17 00:00:00 2001 From: VersusFacit <67295367+VersusFacit@users.noreply.github.com> Date: Fri, 18 Oct 2024 00:29:34 -0700 Subject: [PATCH 4/6] Float type up package for importers. --- dbt/adapters/base/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dbt/adapters/base/__init__.py b/dbt/adapters/base/__init__.py index ade1af3d..c30dd01f 100644 --- a/dbt/adapters/base/__init__.py +++ b/dbt/adapters/base/__init__.py @@ -12,4 +12,5 @@ BaseRelation, RelationType, SchemaSearchMap, + AdapterTrackingRelationInfo, ) From 298e9d8342b256b5b03014fe5e3d1f3062f5cd33 Mon Sep 17 00:00:00 2001 From: VersusFacit <67295367+VersusFacit@users.noreply.github.com> Date: Tue, 22 Oct 2024 04:26:36 -0700 Subject: [PATCH 5/6] Revamp based on code review comments and add unit test. --- dbt/adapters/base/impl.py | 23 +++++++++++++++++++---- dbt/adapters/base/relation.py | 3 ++- tests/unit/test_adapter_telemetry.py | 15 +++++++++++++++ 3 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 tests/unit/test_adapter_telemetry.py diff --git a/dbt/adapters/base/impl.py b/dbt/adapters/base/impl.py index 24088c8f..277cfcc5 100644 --- a/dbt/adapters/base/impl.py +++ b/dbt/adapters/base/impl.py @@ -1746,15 +1746,30 @@ def capabilities(cls) -> CapabilityDict: def supports(cls, capability: Capability) -> bool: return bool(cls.capabilities()[capability]) - @available @classmethod def get_adapter_run_info(cls, config: RelationConfig) -> AdapterTrackingRelationInfo: + adapter_class_name, *_ = cls.__name__.split("Adapter") + adapter_name = adapter_class_name.lower() + + if adapter_class_name == "Base": + adapter_version = "" + else: + adapter_version = import_module(f"dbt.adapters.dbt_{adapter_name}.__version__").version + return AdapterTrackingRelationInfo( - adapter_name="base_adapter", - version=import_module("dbt.adapters.__about__").version, - adapter_details={}, + adapter_name=adapter_name, + base_adapter_version=import_module("dbt.adapters.__about__").version, + adapter_version=adapter_version, + adapter_details=cls._get_adapter_specific_run_info(config), ) + @classmethod + def _get_adapter_specific_run_info(cls, config) -> Dict[str, Any]: + """ + Adapter maintainers should overwrite this method to return any run metadata that should be captured during a run. + """ + return {} + COLUMNS_EQUAL_SQL = """ with diff_count as ( diff --git a/dbt/adapters/base/relation.py b/dbt/adapters/base/relation.py index fdccab8b..870d1e19 100644 --- a/dbt/adapters/base/relation.py +++ b/dbt/adapters/base/relation.py @@ -536,5 +536,6 @@ def flatten(self, allow_multiple_databases: bool = False) -> "SchemaSearchMap": @dataclass(frozen=True, eq=False, repr=False) class AdapterTrackingRelationInfo(FakeAPIObject, Hashable): adapter_name: str - version: str + base_adapter_version: str + adapter_version: str adapter_details: Any diff --git a/tests/unit/test_adapter_telemetry.py b/tests/unit/test_adapter_telemetry.py new file mode 100644 index 00000000..b078830b --- /dev/null +++ b/tests/unit/test_adapter_telemetry.py @@ -0,0 +1,15 @@ +import dbt.adapters.__about__ + +from dbt.adapters.base.impl import BaseAdapter +from dbt.adapters.base.relation import AdapterTrackingRelationInfo + + +def test_telemetry_returns(): + res = BaseAdapter.get_adapter_run_info({}) + + assert res.adapter_name == "base" + assert res.base_adapter_version == dbt.adapters.__about__.version + assert res.adapter_version == "" + assert res.adapter_details == {} + + assert type(res).__name__ == "AdapterTrackingRelationInfo" From b7cd418a3f32722b4531a4ddbdf7621519c19ade Mon Sep 17 00:00:00 2001 From: VersusFacit <67295367+VersusFacit@users.noreply.github.com> Date: Tue, 22 Oct 2024 04:36:11 -0700 Subject: [PATCH 6/6] Fix linter by altering test. --- tests/unit/test_adapter_telemetry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/test_adapter_telemetry.py b/tests/unit/test_adapter_telemetry.py index b078830b..8770cb63 100644 --- a/tests/unit/test_adapter_telemetry.py +++ b/tests/unit/test_adapter_telemetry.py @@ -12,4 +12,4 @@ def test_telemetry_returns(): assert res.adapter_version == "" assert res.adapter_details == {} - assert type(res).__name__ == "AdapterTrackingRelationInfo" + assert type(res) is AdapterTrackingRelationInfo