Skip to content

Commit 3bcc043

Browse files
bschoenmaeckerssrikanthccvshalevr
authored
Add connection attributes to sqlalchemy connect span (#1608)
* Add connection attributes to sqlalchemy connect span * Fix formatting * Move changelog entry to unreleased section --------- Co-authored-by: Srikanth Chekuri <[email protected]> Co-authored-by: Shalev Roda <[email protected]>
1 parent d5cbd67 commit 3bcc043

File tree

5 files changed

+31
-5
lines changed

5 files changed

+31
-5
lines changed

Diff for: CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## Unreleased
99

10+
- Add connection attributes to sqlalchemy connect span
11+
([#1608](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1608))
12+
1013
## Version 1.16.0/0.37b0 (2023-02-17)
1114

1215
### Added

Diff for: instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/engine.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,13 @@ def _wrap_connect(tracer_provider=None):
9191
def _wrap_connect_internal(func, module, args, kwargs):
9292
with tracer.start_as_current_span(
9393
"connect", kind=trace.SpanKind.CLIENT
94-
):
94+
) as span:
95+
if span.is_recording():
96+
attrs, _ = _get_attributes_from_url(module.url)
97+
span.set_attributes(attrs)
98+
span.set_attribute(
99+
SpanAttributes.DB_SYSTEM, _normalize_vendor(module.name)
100+
)
95101
return func(*args, **kwargs)
96102

97103
return _wrap_connect_internal

Diff for: instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py

+18-4
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from opentelemetry.instrumentation.sqlalchemy import SQLAlchemyInstrumentor
2323
from opentelemetry.sdk.resources import Resource
2424
from opentelemetry.sdk.trace import TracerProvider, export
25+
from opentelemetry.semconv.trace import SpanAttributes
2526
from opentelemetry.test.test_base import TestBase
2627

2728

@@ -128,11 +129,12 @@ async def run():
128129
def test_not_recording(self):
129130
mock_tracer = mock.Mock()
130131
mock_span = mock.Mock()
132+
mock_context = mock.Mock()
131133
mock_span.is_recording.return_value = False
132-
mock_span.__enter__ = mock.Mock(return_value=(mock.Mock(), None))
133-
mock_span.__exit__ = mock.Mock(return_value=None)
134-
mock_tracer.start_span.return_value = mock_span
135-
mock_tracer.start_as_current_span.return_value = mock_span
134+
mock_context.__enter__ = mock.Mock(return_value=mock_span)
135+
mock_context.__exit__ = mock.Mock(return_value=None)
136+
mock_tracer.start_span.return_value = mock_context
137+
mock_tracer.start_as_current_span.return_value = mock_context
136138
with mock.patch("opentelemetry.trace.get_tracer") as tracer:
137139
tracer.return_value = mock_tracer
138140
engine = create_engine("sqlite:///:memory:")
@@ -159,6 +161,12 @@ def test_create_engine_wrapper(self):
159161
self.assertEqual(len(spans), 2)
160162
# first span - the connection to the db
161163
self.assertEqual(spans[0].name, "connect")
164+
self.assertEqual(
165+
spans[0].attributes[SpanAttributes.DB_NAME], ":memory:"
166+
)
167+
self.assertEqual(
168+
spans[0].attributes[SpanAttributes.DB_SYSTEM], "sqlite"
169+
)
162170
self.assertEqual(spans[0].kind, trace.SpanKind.CLIENT)
163171
# second span - the query
164172
self.assertEqual(spans[1].name, "SELECT :memory:")
@@ -217,6 +225,12 @@ async def run():
217225
self.assertEqual(len(spans), 2)
218226
# first span - the connection to the db
219227
self.assertEqual(spans[0].name, "connect")
228+
self.assertEqual(
229+
spans[0].attributes[SpanAttributes.DB_NAME], ":memory:"
230+
)
231+
self.assertEqual(
232+
spans[0].attributes[SpanAttributes.DB_SYSTEM], "sqlite"
233+
)
220234
self.assertEqual(spans[0].kind, trace.SpanKind.CLIENT)
221235
# second span - the query
222236
self.assertEqual(spans[1].name, "SELECT :memory:")

Diff for: tests/opentelemetry-docker-tests/tests/sqlalchemy_tests/test_mssql.py

+2
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ def test_engine_execute_errors(self):
7171
spans = self.memory_exporter.get_finished_spans()
7272
# one span for the connection and one for the query
7373
self.assertEqual(len(spans), 2)
74+
self.check_meta(spans[0])
7475
span = spans[1]
7576
# span fields
7677
self.assertEqual(span.name, "SELECT opentelemetry-tests")
@@ -99,6 +100,7 @@ def test_orm_insert(self):
99100
spans = self.memory_exporter.get_finished_spans()
100101
# connect, identity insert on before the insert, insert, and identity insert off after the insert
101102
self.assertEqual(len(spans), 4)
103+
self.check_meta(spans[0])
102104
span = spans[2]
103105
self._check_span(span, "INSERT")
104106
self.assertIn(

Diff for: tests/opentelemetry-docker-tests/tests/sqlalchemy_tests/test_mysql.py

+1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ def test_engine_execute_errors(self):
7070
spans = self.memory_exporter.get_finished_spans()
7171
# one span for the connection and one for the query
7272
self.assertEqual(len(spans), 2)
73+
self.check_meta(spans[0])
7374
span = spans[1]
7475
# span fields
7576
self.assertEqual(span.name, "SELECT opentelemetry-tests")

0 commit comments

Comments
 (0)