From 945e3c8db4d8c7c20feac55b9118ce21df7d1c56 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Wed, 16 Aug 2023 16:09:03 +0200 Subject: [PATCH 1/5] In Postgres take the connection params from the connection and not the db. (On Mysql and SQLite this is unfortunately not possible because not exposed by the libs) --- sentry_sdk/integrations/django/__init__.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/sentry_sdk/integrations/django/__init__.py b/sentry_sdk/integrations/django/__init__.py index 0e67ad1eae..a7dc9c7428 100644 --- a/sentry_sdk/integrations/django/__init__.py +++ b/sentry_sdk/integrations/django/__init__.py @@ -612,7 +612,13 @@ def execute(self, sql, params=None): with record_sql_queries( hub, self.cursor, sql, params, paramstyle="format", executemany=False ) as span: - _set_db_data(span, self.db.vendor, self.db.get_connection_params()) + connection_parameters = ( + self.connection.get_dsn_parameters() + if hasattr(self.connection, "get_dsn_parameters") + else self.db.get_connection_params() + ) + _set_db_data(span, self.db.vendor, connection_parameters) + return real_execute(self, sql, params) def executemany(self, sql, param_list): @@ -624,7 +630,13 @@ def executemany(self, sql, param_list): with record_sql_queries( hub, self.cursor, sql, param_list, paramstyle="format", executemany=True ) as span: - _set_db_data(span, self.db.vendor, self.db.get_connection_params()) + connection_parameters = ( + self.connection.get_dsn_parameters() + if hasattr(self.connection, "get_dsn_parameters") + else self.db.get_connection_params() + ) + _set_db_data(span, self.db.vendor, connection_parameters) + return real_executemany(self, sql, param_list) def connect(self): From 9a74eebe2f3087129d38d682f270e2d20e5e9b01 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Wed, 16 Aug 2023 16:28:06 +0200 Subject: [PATCH 2/5] Fixed test --- tests/integrations/django/test_basic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integrations/django/test_basic.py b/tests/integrations/django/test_basic.py index 78cd16a027..379c4d9614 100644 --- a/tests/integrations/django/test_basic.py +++ b/tests/integrations/django/test_basic.py @@ -653,7 +653,7 @@ def test_db_connection_span_data(sentry_init, client, capture_events): assert data.get(SPANDATA.SERVER_ADDRESS) == os.environ.get( "SENTRY_PYTHON_TEST_POSTGRES_HOST", "localhost" ) - assert data.get(SPANDATA.SERVER_PORT) == 5432 + assert data.get(SPANDATA.SERVER_PORT) == "5432" @pytest.mark.parametrize( From 506f974b220a10f032b3532bff3b93ae3d2d321a Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Thu, 17 Aug 2023 08:53:54 +0200 Subject: [PATCH 3/5] Make port always string to be consistent --- sentry_sdk/integrations/django/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry_sdk/integrations/django/__init__.py b/sentry_sdk/integrations/django/__init__.py index a7dc9c7428..de961f8f68 100644 --- a/sentry_sdk/integrations/django/__init__.py +++ b/sentry_sdk/integrations/django/__init__.py @@ -6,7 +6,7 @@ import weakref from importlib import import_module -from sentry_sdk._compat import string_types +from sentry_sdk._compat import string_types, text_type from sentry_sdk._types import TYPE_CHECKING from sentry_sdk.consts import OP, SPANDATA from sentry_sdk.hub import Hub, _should_send_default_pii @@ -672,7 +672,7 @@ def _set_db_data(span, vendor, connection_params): server_port = connection_params.get("port") if server_port is not None: - span.set_data(SPANDATA.SERVER_PORT, server_port) + span.set_data(SPANDATA.SERVER_PORT, text_type(server_port)) server_socket_address = connection_params.get("unix_socket") if server_socket_address is not None: From 598f0674ec4b30fc4c8b8834ebd9b3b311c4cb8f Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Thu, 17 Aug 2023 11:28:53 +0200 Subject: [PATCH 4/5] Refactoring --- sentry_sdk/integrations/django/__init__.py | 31 ++++++++++------------ 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/sentry_sdk/integrations/django/__init__.py b/sentry_sdk/integrations/django/__init__.py index de961f8f68..033028e319 100644 --- a/sentry_sdk/integrations/django/__init__.py +++ b/sentry_sdk/integrations/django/__init__.py @@ -612,13 +612,7 @@ def execute(self, sql, params=None): with record_sql_queries( hub, self.cursor, sql, params, paramstyle="format", executemany=False ) as span: - connection_parameters = ( - self.connection.get_dsn_parameters() - if hasattr(self.connection, "get_dsn_parameters") - else self.db.get_connection_params() - ) - _set_db_data(span, self.db.vendor, connection_parameters) - + _set_db_data(span, self) return real_execute(self, sql, params) def executemany(self, sql, param_list): @@ -630,13 +624,7 @@ def executemany(self, sql, param_list): with record_sql_queries( hub, self.cursor, sql, param_list, paramstyle="format", executemany=True ) as span: - connection_parameters = ( - self.connection.get_dsn_parameters() - if hasattr(self.connection, "get_dsn_parameters") - else self.db.get_connection_params() - ) - _set_db_data(span, self.db.vendor, connection_parameters) - + _set_db_data(span, self) return real_executemany(self, sql, param_list) def connect(self): @@ -649,7 +637,7 @@ def connect(self): hub.add_breadcrumb(message="connect", category="query") with hub.start_span(op=OP.DB, description="connect") as span: - _set_db_data(span, self.vendor, self.get_connection_params()) + _set_db_data(span, self) return real_connect(self) CursorWrapper.execute = execute @@ -658,10 +646,19 @@ def connect(self): ignore_logger("django.db.backends") -def _set_db_data(span, vendor, connection_params): - # type: (Span, str, Dict[str, str]) -> None +def _set_db_data(span, cursor_or_db): + # type: (Span, Any) -> None + + db = cursor_or_db.db if hasattr(cursor_or_db, "db") else cursor_or_db + vendor = db.vendor span.set_data(SPANDATA.DB_SYSTEM, vendor) + connection_params = ( + cursor_or_db.connection.get_dsn_parameters() + if hasattr(cursor_or_db, "connection") + and hasattr(cursor_or_db.connection, "get_dsn_parameters") + else db.get_connection_params() + ) db_name = connection_params.get("dbname") or connection_params.get("database") if db_name is not None: span.set_data(SPANDATA.DB_NAME, db_name) From dbe8a4da98063d2b52bc233bc382f54391143c9e Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Thu, 17 Aug 2023 11:48:16 +0200 Subject: [PATCH 5/5] do not run in parallel for better debugging --- scripts/runtox.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/runtox.sh b/scripts/runtox.sh index e099f44efe..31be9bfb4b 100755 --- a/scripts/runtox.sh +++ b/scripts/runtox.sh @@ -23,5 +23,5 @@ ENV="$($TOXPATH -l | grep "$searchstring" | tr $'\n' ',')" if [ "$ENV" = py2.7-common, ] || [ "$ENV" = py2.7-gevent, ]; then exec $TOXPATH -vv -e "$ENV" -- "${@:2}" else - exec $TOXPATH -vv -p auto -e "$ENV" -- "${@:2}" + exec $TOXPATH -vv -e "$ENV" -- "${@:2}" fi