Skip to content

Commit 0d70731

Browse files
committed
Keep Session events around for its entire lifetime.
Since it seems expensive to add/remove events from any object within SQLAlchemy, we keep the events around, and rely on the decorated fields in the Session to know whether we need to trace or not.
1 parent 41aa56e commit 0d70731

File tree

1 file changed

+19
-12
lines changed

1 file changed

+19
-12
lines changed

sqlalchemy_opentracing/__init__.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from sqlalchemy.event import listen, remove
1+
from sqlalchemy.event import contains, listen, remove
22
from sqlalchemy.orm import Session
33

44
g_tracer = None
@@ -171,27 +171,34 @@ def _connectable_error_handler(exception_context):
171171
span.finish()
172172

173173
def _register_session_connection_event(session):
174-
listen(session, 'after_begin', _session_after_begin_handler)
174+
'''
175+
Register connection/transaction and clean up events
176+
for our session only once, as adding/removing them
177+
seems an expensive operation.
178+
'''
179+
180+
# Use 'after_being' as a mark to guess the events being handled.
181+
if contains(session, 'after_begin', _session_after_begin_handler):
182+
return
175183

176-
def _session_after_begin_handler(session, transaction, conn):
177184
# Have the connections inherit the tracing info
178185
# from the session (including parent span, if any).
179-
_set_traced_with_session(conn, session)
186+
listen(session, 'after_begin', _session_after_begin_handler)
180187

181188
# Plug post-operation clean up handlers.
182189
# The actual session commit/rollback is not traced by us.
183-
listen(session, 'before_commit', _session_before_commit_handler, once=True)
184-
listen(session, 'after_rollback', _session_rollback_handler, once=True)
190+
listen(session, 'after_commit', _session_before_commit_handler)
191+
listen(session, 'after_rollback', _session_rollback_handler)
192+
193+
def _session_after_begin_handler(session, transaction, conn):
194+
# It's only needed to pass down tracing information
195+
# if it was explicitly set.
196+
if get_traced(session):
197+
_set_traced_with_session(conn, session)
185198

186-
# Event handlers can't remove themselves
187-
# Fine, as long as we only fire one of them *once*.
188199
def _session_before_commit_handler(session):
189200
_clear_traced(session)
190-
remove(session, 'after_begin', _session_after_begin_handler)
191-
remove(session, 'after_rollback', _session_rollback_handler)
192201

193202
def _session_rollback_handler(session):
194203
_clear_traced(session)
195-
remove(session, 'after_begin', _session_after_begin_handler)
196-
remove(session, 'before_commit', _session_before_commit_handler)
197204

0 commit comments

Comments
 (0)