Skip to content

Commit 8cd9168

Browse files
author
sroda
committed
Remove all engine event listeners after sqlalchemy uninstrument
1 parent de4cde7 commit 8cd9168

File tree

3 files changed

+25
-8
lines changed

3 files changed

+25
-8
lines changed

instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/__init__.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -158,17 +158,22 @@ def _instrument(self, **kwargs):
158158
"create_async_engine",
159159
_wrap_create_async_engine(tracer_provider, enable_commenter),
160160
)
161+
162+
self.engines = []
161163
if kwargs.get("engine") is not None:
162-
return EngineTracer(
163-
_get_tracer(tracer_provider),
164-
kwargs.get("engine"),
165-
kwargs.get("enable_commenter", False),
166-
kwargs.get("commenter_options", {}),
164+
self.engines.append(
165+
EngineTracer(
166+
_get_tracer(tracer_provider),
167+
kwargs.get("engine"),
168+
kwargs.get("enable_commenter", False),
169+
kwargs.get("commenter_options", {}),
170+
)
167171
)
168-
if kwargs.get("engines") is not None and isinstance(
172+
return self.engines[0]
173+
elif kwargs.get("engines") is not None and isinstance(
169174
kwargs.get("engines"), Sequence
170175
):
171-
return [
176+
self.engines = [
172177
EngineTracer(
173178
_get_tracer(tracer_provider),
174179
engine,
@@ -177,6 +182,7 @@ def _instrument(self, **kwargs):
177182
)
178183
for engine in kwargs.get("engines")
179184
]
185+
return self.engines
180186

181187
return None
182188

@@ -186,3 +192,5 @@ def _uninstrument(self, **kwargs):
186192
unwrap(Engine, "connect")
187193
if parse_version(sqlalchemy.__version__).release >= (1, 4):
188194
unwrap(sqlalchemy.ext.asyncio, "create_async_engine")
195+
for engine in self.engines:
196+
engine.remove_event_listeners()

instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/engine.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414
import os
1515
import re
1616

17-
from sqlalchemy.event import listen # pylint: disable=no-name-in-module
17+
from sqlalchemy.event import (
18+
listen,
19+
remove,
20+
) # pylint: disable=no-name-in-module
1821

1922
from opentelemetry import trace
2023
from opentelemetry.instrumentation.sqlalchemy.package import (
@@ -111,6 +114,11 @@ def __init__(
111114
listen(engine, "after_cursor_execute", _after_cur_exec)
112115
listen(engine, "handle_error", _handle_error)
113116

117+
def remove_event_listeners(self):
118+
remove(self.engine, "before_cursor_execute", self._before_cur_exec)
119+
remove(self.engine, "after_cursor_execute", _after_cur_exec)
120+
remove(self.engine, "handle_error", _handle_error)
121+
114122
def _operation_name(self, db_name, statement):
115123
parts = []
116124
if isinstance(statement, str):

instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ def test_uninstrument(self):
248248

249249
self.memory_exporter.clear()
250250
SQLAlchemyInstrumentor().uninstrument()
251+
cnx.execute("SELECT 1 + 1;").fetchall()
251252
engine2 = create_engine("sqlite:///:memory:")
252253
cnx2 = engine2.connect()
253254
cnx2.execute("SELECT 2 + 2;").fetchall()

0 commit comments

Comments
 (0)