From 9f763de7baf7bef48a1ee3a6d050b7bc9fa07739 Mon Sep 17 00:00:00 2001 From: aditya-cyberverse Date: Tue, 28 Jul 2026 00:14:06 +0530 Subject: [PATCH] fix(sqlalchemy): safely handle garbage-collected target during event listener removal --- .../instrumentation/sqlalchemy/engine.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/engine.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/engine.py index 6164403bcd..b2a798f4bd 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/engine.py +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/engine.py @@ -3,6 +3,7 @@ import os import re import weakref +from sqlalchemy.exc import InvalidRequestError import sqlalchemy from sqlalchemy.event import ( # pylint: disable=no-name-in-module @@ -308,15 +309,14 @@ def _register_event_listener(cls, target, identifier, func, *args, **kw): @classmethod def remove_all_event_listeners(cls): - for ( - weak_ref_target, - identifier, - func, - ) in cls._remove_event_listener_params: - # Remove an event listener only if saved weak reference points to an object - # which has not been garbage collected - if weak_ref_target() is not None: - remove(weak_ref_target(), identifier, func) + for weak_ref_target, identifier, fn in cls._remove_event_listener_params: + target = weak_ref_target() + if target is None: + continue + try: + event.remove(target, identifier, fn) + except InvalidRequestError: + pass cls._remove_event_listener_params.clear() def _operation_name(self, db_name, statement):