mirror of
https://github.com/open-telemetry/opentelemetry-python-contrib.git
synced 2025-08-01 09:13:23 +08:00
Remove references to disposed SQLAlchemy engines from instrumentation singleton (#3053)
* Remove references to SQLAlchemy engines which are disposed of EngineTracer in SQLAlchemy keeps weak references to a traced engine forever which can cause a noticeable memory leak if engines are constantly getting creating. * Updated changelog --------- Co-authored-by: Emídio Neto <9735060+emdneto@users.noreply.github.com> Co-authored-by: Riccardo Magliocchetti <riccardo.magliocchetti@gmail.com>
This commit is contained in:
@ -46,6 +46,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
([#3022](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3022))
|
([#3022](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3022))
|
||||||
- Replace all instrumentor unit test `assertEqualSpanInstrumentationInfo` calls with `assertEqualSpanInstrumentationScope` calls
|
- Replace all instrumentor unit test `assertEqualSpanInstrumentationInfo` calls with `assertEqualSpanInstrumentationScope` calls
|
||||||
([#3037](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3037))
|
([#3037](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3037))
|
||||||
|
- `opentelemetry-instrumentation-sqlalchemy`: Fix a remaining memory leak in EngineTracer
|
||||||
|
([#3053](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3053))
|
||||||
|
|
||||||
### Breaking changes
|
### Breaking changes
|
||||||
|
|
||||||
|
@ -167,6 +167,13 @@ class EngineTracer:
|
|||||||
self._add_idle_to_connection_usage(-1)
|
self._add_idle_to_connection_usage(-1)
|
||||||
self._add_used_to_connection_usage(1)
|
self._add_used_to_connection_usage(1)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _dispose_of_event_listener(cls, obj):
|
||||||
|
try:
|
||||||
|
cls._remove_event_listener_params.remove(obj)
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _register_event_listener(cls, target, identifier, func, *args, **kw):
|
def _register_event_listener(cls, target, identifier, func, *args, **kw):
|
||||||
listen(target, identifier, func, *args, **kw)
|
listen(target, identifier, func, *args, **kw)
|
||||||
@ -174,6 +181,12 @@ class EngineTracer:
|
|||||||
(weakref.ref(target), identifier, func)
|
(weakref.ref(target), identifier, func)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
weakref.finalize(
|
||||||
|
target,
|
||||||
|
cls._dispose_of_event_listener,
|
||||||
|
(weakref.ref(target), identifier, func),
|
||||||
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def remove_all_event_listeners(cls):
|
def remove_all_event_listeners(cls):
|
||||||
for (
|
for (
|
||||||
|
@ -417,6 +417,10 @@ class TestSqlalchemyInstrumentation(TestBase):
|
|||||||
|
|
||||||
from sqlalchemy import create_engine
|
from sqlalchemy import create_engine
|
||||||
|
|
||||||
|
from opentelemetry.instrumentation.sqlalchemy.engine import (
|
||||||
|
EngineTracer,
|
||||||
|
)
|
||||||
|
|
||||||
callback = mock.Mock()
|
callback = mock.Mock()
|
||||||
|
|
||||||
def make_shortlived_engine():
|
def make_shortlived_engine():
|
||||||
@ -432,3 +436,4 @@ class TestSqlalchemyInstrumentation(TestBase):
|
|||||||
|
|
||||||
gc.collect()
|
gc.collect()
|
||||||
assert callback.call_count == 5
|
assert callback.call_count == 5
|
||||||
|
assert len(EngineTracer._remove_event_listener_params) == 0
|
||||||
|
Reference in New Issue
Block a user