From 310ed0e9fbcb5f4bf6487b5398ef118219832e22 Mon Sep 17 00:00:00 2001 From: Abhishek Singh Date: Fri, 3 Nov 2023 17:01:29 -0700 Subject: [PATCH 1/3] Added session_info in dbt profile --- dbt/adapters/oracle/connections.py | 35 +++++++++++++++++++++--------- dbt_adbs_test_project/profiles.yml | 10 +++++++++ 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/dbt/adapters/oracle/connections.py b/dbt/adapters/oracle/connections.py index 327f77b..89dcebd 100644 --- a/dbt/adapters/oracle/connections.py +++ b/dbt/adapters/oracle/connections.py @@ -21,6 +21,7 @@ import enum import time import uuid +import platform import dbt.exceptions from dbt.adapters.base import Credentials @@ -113,6 +114,9 @@ class OracleAdapterCredentials(Credentials): # Base URL for ADB-S OML REST API oml_cloud_service_url: Optional[str] = None + # session info is stored in v$session for each dbt run + session_info: Optional[Dict[str, str]] = field(default_factory=dict) + _ALIASES = { 'dbname': 'database', @@ -137,7 +141,8 @@ def _connection_keys(self) -> Tuple[str]: 'service', 'connection_string', 'shardingkey', 'supershardingkey', 'cclass', 'purity', 'retry_count', - 'retry_delay', 'oml_cloud_service_url' + 'retry_delay', 'oml_cloud_service_url', + 'session_info' ) @classmethod @@ -175,6 +180,20 @@ def get_dsn(self) -> str: class OracleAdapterConnectionManager(SQLConnectionManager): TYPE = 'oracle' + @staticmethod + def get_session_info(credentials): + default_action = "DBT RUN" + default_client_identifier = f'dbt-oracle-client-{uuid.uuid4()}' + default_client_info = "_".join([platform.node(), platform.machine()]) + default_module = f'dbt-{dbt_version}' + return { + "action": credentials.session_info.get("action", default_action), + "client_identifier": credentials.session_info.get("client_identifier", default_client_identifier), + "client_info": credentials.session_info.get("client_info", default_client_info), + "module": credentials.session_info.get("module", default_module) + } + + @classmethod def open(cls, connection): if connection.state == 'open': @@ -219,15 +238,11 @@ def open(cls, connection): try: handle = oracledb.connect(**conn_config) - # client_identifier and module are saved in corresponding columns in v$session - action = "dbt run" - client_identifier = f'dbt-oracle-client-{uuid.uuid4()}' - module = f'dbt-{dbt_version}' - client_info = {"action": action, "client_identifier": client_identifier, "module": module} - logger.info(f"Session info :{json.dumps(client_info)}") - handle.module = module - handle.client_identifier = client_identifier - handle.action = action + # session_info is stored in v$session + session_info = cls.get_session_info(credentials=credentials) + logger.info(f"Session info :{json.dumps(session_info)}") + for k, v in session_info.items(): + setattr(handle, k, v) connection.handle = handle connection.state = 'open' except oracledb.DatabaseError as e: diff --git a/dbt_adbs_test_project/profiles.yml b/dbt_adbs_test_project/profiles.yml index b211f52..eb2c4f2 100644 --- a/dbt_adbs_test_project/profiles.yml +++ b/dbt_adbs_test_project/profiles.yml @@ -12,6 +12,11 @@ dbt_test: #database: "{{ env_var('DBT_ORACLE_DATABASE') }}" schema: "{{ env_var('DBT_ORACLE_SCHEMA') }}" oml_cloud_service_url: "{{ env_var('DBT_ORACLE_OML_CLOUD_SERVICE_URL')}}" + session_info: + action: "dbt run" + client_identifier: "dbt-mac-abhisoms" + client_info: "dbt Python3.9 thin driver" + module: "dbt-module-1.5.2" retry_count: 1 retry_delay: 5 shardingkey: @@ -42,6 +47,11 @@ dbt_test: database: "{{ env_var('DBT_ORACLE_DATABASE') }}" tns_name: "{{ env_var('DBT_ORACLE_TNS_NAME') }}" schema: "{{ env_var('DBT_ORACLE_SCHEMA') }}" + session_info: + action: "dbt run" + client_identifier: "dbt-mac-abhisoms" + client_info: "dbt Python3.9 thin driver" + module: "dbt-module-1.5.2" shardingkey: - skey supershardingkey: From dc5f80b5450cae5038485fd555b51721ee50434d Mon Sep 17 00:00:00 2001 From: Abhishek Singh Date: Fri, 3 Nov 2023 22:58:49 -0700 Subject: [PATCH 2/3] Handle error for CX oracle driver --- dbt/adapters/oracle/connections.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dbt/adapters/oracle/connections.py b/dbt/adapters/oracle/connections.py index 89dcebd..f5c0f24 100644 --- a/dbt/adapters/oracle/connections.py +++ b/dbt/adapters/oracle/connections.py @@ -242,7 +242,10 @@ def open(cls, connection): session_info = cls.get_session_info(credentials=credentials) logger.info(f"Session info :{json.dumps(session_info)}") for k, v in session_info.items(): - setattr(handle, k, v) + try: + setattr(handle, k, v) + except AttributeError: + logger.warning(f"Python driver does not support setting {k}") connection.handle = handle connection.state = 'open' except oracledb.DatabaseError as e: From cba22ab102b7d11a91b46c44f76b3c20f28c89c3 Mon Sep 17 00:00:00 2001 From: Abhishek Singh Date: Mon, 6 Nov 2023 22:53:02 -0800 Subject: [PATCH 3/3] fix attribute name to clientinfo from client_info --- dbt/adapters/oracle/connections.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbt/adapters/oracle/connections.py b/dbt/adapters/oracle/connections.py index f5c0f24..bf75dbf 100644 --- a/dbt/adapters/oracle/connections.py +++ b/dbt/adapters/oracle/connections.py @@ -189,7 +189,7 @@ def get_session_info(credentials): return { "action": credentials.session_info.get("action", default_action), "client_identifier": credentials.session_info.get("client_identifier", default_client_identifier), - "client_info": credentials.session_info.get("client_info", default_client_info), + "clientinfo": credentials.session_info.get("client_info", default_client_info), "module": credentials.session_info.get("module", default_module) }