Skip to content

Commit 49d7c53

Browse files
authored
Use a weak reference to sqlalchemy Engine to avoid memory leak
Closes open-telemetry#1761 By using a weak reference to the `Engine` object, we can avoid the memory leak as disposed `Engines` get properly deallocated. Whenever `SQLAlchemy` is uninstrumented, we only trigger a removal for those event listeners which are listening for objects that haven't been garbage-collected yet.
1 parent 2d4e6c9 commit 49d7c53

File tree

1 file changed

+6
-2
lines changed
  • instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy

1 file changed

+6
-2
lines changed

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

+6-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# limitations under the License.
1414
import os
1515
import re
16+
import weakref
1617

1718
from sqlalchemy.event import ( # pylint: disable=no-name-in-module
1819
listen,
@@ -160,12 +161,15 @@ def _pool_checkout(
160161
@classmethod
161162
def _register_event_listener(cls, target, identifier, func, *args, **kw):
162163
listen(target, identifier, func, *args, **kw)
163-
cls._remove_event_listener_params.append((target, identifier, func))
164+
cls._remove_event_listener_params.append((weakref.ref(target), identifier, func))
164165

165166
@classmethod
166167
def remove_all_event_listeners(cls):
167168
for remove_params in cls._remove_event_listener_params:
168-
remove(*remove_params)
169+
# Remove an event listener only if saved weak reference points to an object
170+
# which has not been garbage collected
171+
if remove_params[0]() is not None:
172+
remove(*remove_params)
169173
cls._remove_event_listener_params.clear()
170174

171175
def _operation_name(self, db_name, statement):

0 commit comments

Comments
 (0)