Skip to content

Commit 6ce096b

Browse files
authored
feat: Add db.driver.name spans to database integrations (#6082)
Adds `db.driver.name` spans to the following integrations: - asyncpg - clickhouse_driver - pymongo - redis - sqlalchemy Adding this attribute for database queries made using the Django integration will be done as part of PY-2377 / #6081 because it's less straightforward to get the underlying database driver used. Fixes PY-2376 Fixes #6080
1 parent 047a516 commit 6ce096b

File tree

11 files changed

+47
-0
lines changed

11 files changed

+47
-0
lines changed

sentry_sdk/consts.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,12 @@ class SPANDATA:
441441
Example: myDatabase
442442
"""
443443

444+
DB_DRIVER_NAME = "db.driver.name"
445+
"""
446+
The name of the database driver being used for the connection.
447+
Example: "psycopg2"
448+
"""
449+
444450
DB_OPERATION = "db.operation"
445451
"""
446452
The name of the operation being executed, e.g. the MongoDB command name such as findAndModify, or the SQL keyword.

sentry_sdk/integrations/asyncpg.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ async def _inner(*args: "Any", **kwargs: "Any") -> "T":
184184
pass
185185
span.set_data(SPANDATA.DB_NAME, database)
186186
span.set_data(SPANDATA.DB_USER, user)
187+
span.set_data(SPANDATA.DB_DRIVER_NAME, "asyncpg")
187188

188189
with capture_internal_exceptions():
189190
sentry_sdk.add_breadcrumb(
@@ -198,6 +199,7 @@ async def _inner(*args: "Any", **kwargs: "Any") -> "T":
198199

199200
def _set_db_data(span: "Span", conn: "Any") -> None:
200201
span.set_data(SPANDATA.DB_SYSTEM, "postgresql")
202+
span.set_data(SPANDATA.DB_DRIVER_NAME, "asyncpg")
201203

202204
addr = conn._addr
203205
if addr:

sentry_sdk/integrations/clickhouse_driver.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ def wrapped_generator() -> "Iterator[Any]":
165165

166166
def _set_db_data(span: "Span", connection: "Connection") -> None:
167167
span.set_data(SPANDATA.DB_SYSTEM, "clickhouse")
168+
span.set_data(SPANDATA.DB_DRIVER_NAME, "clickhouse-driver")
168169
span.set_data(SPANDATA.SERVER_ADDRESS, connection.host)
169170
span.set_data(SPANDATA.SERVER_PORT, connection.port)
170171
span.set_data(SPANDATA.DB_NAME, connection.database)

sentry_sdk/integrations/pymongo.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ def _get_db_data(event: "Any") -> "Dict[str, Any]":
8888
data = {}
8989

9090
data[SPANDATA.DB_SYSTEM] = "mongodb"
91+
data[SPANDATA.DB_DRIVER_NAME] = "pymongo"
9192

9293
db_name = event.database_name
9394
if db_name is not None:
@@ -128,6 +129,7 @@ def started(self, event: "CommandStartedEvent") -> None:
128129
tags = {
129130
"db.name": event.database_name,
130131
SPANDATA.DB_SYSTEM: "mongodb",
132+
SPANDATA.DB_DRIVER_NAME: "pymongo",
131133
SPANDATA.DB_OPERATION: event.command_name,
132134
SPANDATA.DB_MONGODB_COLLECTION: command.get(event.command_name),
133135
}

sentry_sdk/integrations/redis/modules/queries.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def _get_db_span_description(
4444

4545
def _set_db_data_on_span(span: "Span", connection_params: "dict[str, Any]") -> None:
4646
span.set_data(SPANDATA.DB_SYSTEM, "redis")
47+
span.set_data(SPANDATA.DB_DRIVER_NAME, "redis-py")
4748

4849
db = connection_params.get("db")
4950
if db is not None:

sentry_sdk/integrations/sqlalchemy.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,13 @@ def _set_db_data(span: "Span", conn: "Any") -> None:
137137
if db_system is not None:
138138
span.set_data(SPANDATA.DB_SYSTEM, db_system)
139139

140+
try:
141+
driver = conn.dialect.driver
142+
if driver:
143+
span.set_data(SPANDATA.DB_DRIVER_NAME, driver)
144+
except Exception:
145+
pass
146+
140147
if conn.engine.url is None:
141148
return
142149

tests/integrations/asyncpg/test_asyncpg.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ def _get_db_name():
4949
"db.name": PG_NAME,
5050
"db.system": "postgresql",
5151
"db.user": PG_USER,
52+
"db.driver.name": "asyncpg",
5253
"server.address": PG_HOST,
5354
"server.port": PG_PORT,
5455
}

tests/integrations/clickhouse_driver/test_clickhouse_driver.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def test_clickhouse_client_breadcrumbs(sentry_init, capture_events) -> None:
4242
"category": "query",
4343
"data": {
4444
"db.system": "clickhouse",
45+
"db.driver.name": "clickhouse-driver",
4546
"db.name": "",
4647
"db.user": "default",
4748
"server.address": "localhost",
@@ -54,6 +55,7 @@ def test_clickhouse_client_breadcrumbs(sentry_init, capture_events) -> None:
5455
"category": "query",
5556
"data": {
5657
"db.system": "clickhouse",
58+
"db.driver.name": "clickhouse-driver",
5759
"db.name": "",
5860
"db.user": "default",
5961
"server.address": "localhost",
@@ -66,6 +68,7 @@ def test_clickhouse_client_breadcrumbs(sentry_init, capture_events) -> None:
6668
"category": "query",
6769
"data": {
6870
"db.system": "clickhouse",
71+
"db.driver.name": "clickhouse-driver",
6972
"db.name": "",
7073
"db.user": "default",
7174
"server.address": "localhost",
@@ -78,6 +81,7 @@ def test_clickhouse_client_breadcrumbs(sentry_init, capture_events) -> None:
7881
"category": "query",
7982
"data": {
8083
"db.system": "clickhouse",
84+
"db.driver.name": "clickhouse-driver",
8185
"db.name": "",
8286
"db.user": "default",
8387
"server.address": "localhost",
@@ -90,6 +94,7 @@ def test_clickhouse_client_breadcrumbs(sentry_init, capture_events) -> None:
9094
"category": "query",
9195
"data": {
9296
"db.system": "clickhouse",
97+
"db.driver.name": "clickhouse-driver",
9398
"db.name": "",
9499
"db.user": "default",
95100
"server.address": "localhost",
@@ -257,6 +262,7 @@ def test_clickhouse_client_spans(
257262
"description": "DROP TABLE IF EXISTS test",
258263
"data": {
259264
"db.system": "clickhouse",
265+
"db.driver.name": "clickhouse-driver",
260266
"db.name": "",
261267
"db.user": "default",
262268
"server.address": "localhost",
@@ -272,6 +278,7 @@ def test_clickhouse_client_spans(
272278
"description": "CREATE TABLE test (x Int32) ENGINE = Memory",
273279
"data": {
274280
"db.system": "clickhouse",
281+
"db.driver.name": "clickhouse-driver",
275282
"db.name": "",
276283
"db.user": "default",
277284
"server.address": "localhost",
@@ -287,6 +294,7 @@ def test_clickhouse_client_spans(
287294
"description": "INSERT INTO test (x) VALUES",
288295
"data": {
289296
"db.system": "clickhouse",
297+
"db.driver.name": "clickhouse-driver",
290298
"db.name": "",
291299
"db.user": "default",
292300
"server.address": "localhost",
@@ -302,6 +310,7 @@ def test_clickhouse_client_spans(
302310
"description": "INSERT INTO test (x) VALUES",
303311
"data": {
304312
"db.system": "clickhouse",
313+
"db.driver.name": "clickhouse-driver",
305314
"db.name": "",
306315
"db.user": "default",
307316
"server.address": "localhost",
@@ -317,6 +326,7 @@ def test_clickhouse_client_spans(
317326
"description": "SELECT sum(x) FROM test WHERE x > 150",
318327
"data": {
319328
"db.system": "clickhouse",
329+
"db.driver.name": "clickhouse-driver",
320330
"db.name": "",
321331
"db.user": "default",
322332
"server.address": "localhost",
@@ -529,6 +539,7 @@ def test_clickhouse_dbapi_breadcrumbs(sentry_init, capture_events) -> None:
529539
"category": "query",
530540
"data": {
531541
"db.system": "clickhouse",
542+
"db.driver.name": "clickhouse-driver",
532543
"db.name": "",
533544
"db.user": "default",
534545
"server.address": "localhost",
@@ -541,6 +552,7 @@ def test_clickhouse_dbapi_breadcrumbs(sentry_init, capture_events) -> None:
541552
"category": "query",
542553
"data": {
543554
"db.system": "clickhouse",
555+
"db.driver.name": "clickhouse-driver",
544556
"db.name": "",
545557
"db.user": "default",
546558
"server.address": "localhost",
@@ -553,6 +565,7 @@ def test_clickhouse_dbapi_breadcrumbs(sentry_init, capture_events) -> None:
553565
"category": "query",
554566
"data": {
555567
"db.system": "clickhouse",
568+
"db.driver.name": "clickhouse-driver",
556569
"db.name": "",
557570
"db.user": "default",
558571
"server.address": "localhost",
@@ -565,6 +578,7 @@ def test_clickhouse_dbapi_breadcrumbs(sentry_init, capture_events) -> None:
565578
"category": "query",
566579
"data": {
567580
"db.system": "clickhouse",
581+
"db.driver.name": "clickhouse-driver",
568582
"db.name": "",
569583
"db.user": "default",
570584
"server.address": "localhost",
@@ -577,6 +591,7 @@ def test_clickhouse_dbapi_breadcrumbs(sentry_init, capture_events) -> None:
577591
"category": "query",
578592
"data": {
579593
"db.system": "clickhouse",
594+
"db.driver.name": "clickhouse-driver",
580595
"db.name": "",
581596
"db.user": "default",
582597
"server.address": "localhost",
@@ -737,6 +752,7 @@ def test_clickhouse_dbapi_spans(sentry_init, capture_events, capture_envelopes)
737752
"description": "DROP TABLE IF EXISTS test",
738753
"data": {
739754
"db.system": "clickhouse",
755+
"db.driver.name": "clickhouse-driver",
740756
"db.name": "",
741757
"db.user": "default",
742758
"server.address": "localhost",
@@ -752,6 +768,7 @@ def test_clickhouse_dbapi_spans(sentry_init, capture_events, capture_envelopes)
752768
"description": "CREATE TABLE test (x Int32) ENGINE = Memory",
753769
"data": {
754770
"db.system": "clickhouse",
771+
"db.driver.name": "clickhouse-driver",
755772
"db.name": "",
756773
"db.user": "default",
757774
"server.address": "localhost",
@@ -767,6 +784,7 @@ def test_clickhouse_dbapi_spans(sentry_init, capture_events, capture_envelopes)
767784
"description": "INSERT INTO test (x) VALUES",
768785
"data": {
769786
"db.system": "clickhouse",
787+
"db.driver.name": "clickhouse-driver",
770788
"db.name": "",
771789
"db.user": "default",
772790
"server.address": "localhost",
@@ -782,6 +800,7 @@ def test_clickhouse_dbapi_spans(sentry_init, capture_events, capture_envelopes)
782800
"description": "INSERT INTO test (x) VALUES",
783801
"data": {
784802
"db.system": "clickhouse",
803+
"db.driver.name": "clickhouse-driver",
785804
"db.name": "",
786805
"db.user": "default",
787806
"server.address": "localhost",
@@ -797,6 +816,7 @@ def test_clickhouse_dbapi_spans(sentry_init, capture_events, capture_envelopes)
797816
"description": "SELECT sum(x) FROM test WHERE x > 150",
798817
"data": {
799818
"db.system": "clickhouse",
819+
"db.driver.name": "clickhouse-driver",
800820
"db.name": "",
801821
"db.user": "default",
802822
"server.address": "localhost",

tests/integrations/pymongo/test_pymongo.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,13 @@ def test_transactions(sentry_init, capture_events, mongo_server, with_pii):
5252
common_tags = {
5353
"db.name": "test_db",
5454
"db.system": "mongodb",
55+
"db.driver.name": "pymongo",
5556
"net.peer.name": mongo_server.host,
5657
"net.peer.port": str(mongo_server.port),
5758
}
5859
for span in find, insert_success, insert_fail:
5960
assert span["data"][SPANDATA.DB_SYSTEM] == "mongodb"
61+
assert span["data"][SPANDATA.DB_DRIVER_NAME] == "pymongo"
6062
assert span["data"][SPANDATA.DB_NAME] == "test_db"
6163
assert span["data"][SPANDATA.SERVER_ADDRESS] == "localhost"
6264
assert span["data"][SPANDATA.SERVER_PORT] == mongo_server.port
@@ -136,6 +138,7 @@ def test_breadcrumbs(sentry_init, capture_events, mongo_server, with_pii):
136138
assert crumb["data"] == {
137139
"db.name": "test_db",
138140
"db.system": "mongodb",
141+
"db.driver.name": "pymongo",
139142
"db.operation": "find",
140143
"net.peer.name": mongo_server.host,
141144
"net.peer.port": str(mongo_server.port),

tests/integrations/redis/test_redis.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ def test_db_connection_attributes_client(sentry_init, capture_events):
262262
assert span["op"] == "db.redis"
263263
assert span["description"] == "GET 'foobar'"
264264
assert span["data"][SPANDATA.DB_SYSTEM] == "redis"
265+
assert span["data"][SPANDATA.DB_DRIVER_NAME] == "redis-py"
265266
assert span["data"][SPANDATA.DB_NAME] == "1"
266267
assert span["data"][SPANDATA.SERVER_ADDRESS] == "localhost"
267268
assert span["data"][SPANDATA.SERVER_PORT] == 63791
@@ -288,6 +289,7 @@ def test_db_connection_attributes_pipeline(sentry_init, capture_events):
288289
assert span["op"] == "db.redis"
289290
assert span["description"] == "redis.pipeline.execute"
290291
assert span["data"][SPANDATA.DB_SYSTEM] == "redis"
292+
assert span["data"][SPANDATA.DB_DRIVER_NAME] == "redis-py"
291293
assert span["data"][SPANDATA.DB_NAME] == "1"
292294
assert span["data"][SPANDATA.SERVER_ADDRESS] == "localhost"
293295
assert span["data"][SPANDATA.SERVER_PORT] == 63791

0 commit comments

Comments
 (0)