Skip to content

Commit d83314d

Browse files
authored
Add adapter telemetry method for core model run snowplow event. (#328)
1 parent 951d98d commit d83314d

File tree

5 files changed

+57
-0
lines changed

5 files changed

+57
-0
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
kind: Under the Hood
2+
body: Add adapter telemetry.
3+
time: 2024-10-16T03:31:59.334011-07:00
4+
custom:
5+
Author: versusfacit
6+
Issue: "301"

dbt/adapters/base/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@
1212
BaseRelation,
1313
RelationType,
1414
SchemaSearchMap,
15+
AdapterTrackingRelationInfo,
1516
)

dbt/adapters/base/impl.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from contextlib import contextmanager
55
from datetime import datetime
66
from enum import Enum
7+
from importlib import import_module
78
from multiprocessing.context import SpawnContext
89
from typing import (
910
Any,
@@ -61,12 +62,14 @@
6162
ComponentName,
6263
InformationSchema,
6364
SchemaSearchMap,
65+
AdapterTrackingRelationInfo,
6466
)
6567
from dbt.adapters.cache import RelationsCache, _make_ref_key_dict
6668
from dbt.adapters.capability import Capability, CapabilityDict
6769
from dbt.adapters.contracts.connection import Credentials
6870
from dbt.adapters.contracts.macros import MacroResolverProtocol
6971
from dbt.adapters.contracts.relation import RelationConfig
72+
7073
from dbt.adapters.events.types import (
7174
CacheMiss,
7275
CatalogGenerationError,
@@ -1744,6 +1747,30 @@ def capabilities(cls) -> CapabilityDict:
17441747
def supports(cls, capability: Capability) -> bool:
17451748
return bool(cls.capabilities()[capability])
17461749

1750+
@classmethod
1751+
def get_adapter_run_info(cls, config: RelationConfig) -> AdapterTrackingRelationInfo:
1752+
adapter_class_name, *_ = cls.__name__.split("Adapter")
1753+
adapter_name = adapter_class_name.lower()
1754+
1755+
if adapter_name == "base":
1756+
adapter_version = ""
1757+
else:
1758+
adapter_version = import_module(f"dbt.adapters.{adapter_name}.__version__").version
1759+
1760+
return AdapterTrackingRelationInfo(
1761+
adapter_name=adapter_name,
1762+
base_adapter_version=import_module("dbt.adapters.__about__").version,
1763+
adapter_version=adapter_version,
1764+
model_adapter_details=cls._get_adapter_specific_run_info(config),
1765+
)
1766+
1767+
@classmethod
1768+
def _get_adapter_specific_run_info(cls, config) -> Dict[str, Any]:
1769+
"""
1770+
Adapter maintainers should overwrite this method to return any run metadata that should be captured during a run.
1771+
"""
1772+
return {}
1773+
17471774

17481775
COLUMNS_EQUAL_SQL = """
17491776
with diff_count as (

dbt/adapters/base/relation.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,3 +542,11 @@ def flatten(self, allow_multiple_databases: bool = False) -> "SchemaSearchMap":
542542
)
543543

544544
return new
545+
546+
547+
@dataclass(frozen=True, eq=False, repr=False)
548+
class AdapterTrackingRelationInfo(FakeAPIObject, Hashable):
549+
adapter_name: str
550+
base_adapter_version: str
551+
adapter_version: str
552+
model_adapter_details: Any

tests/unit/test_adapter_telemetry.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import dbt.adapters.__about__
2+
3+
from dbt.adapters.base.impl import BaseAdapter
4+
from dbt.adapters.base.relation import AdapterTrackingRelationInfo
5+
6+
7+
def test_telemetry_returns():
8+
res = BaseAdapter.get_adapter_run_info({})
9+
10+
assert res.adapter_name == "base"
11+
assert res.base_adapter_version == dbt.adapters.__about__.version
12+
assert res.adapter_version == ""
13+
assert res.model_adapter_details == {}
14+
15+
assert type(res) is AdapterTrackingRelationInfo

0 commit comments

Comments
 (0)