|
1 |
| -from sqlalchemy.event import listen, remove |
| 1 | +from sqlalchemy.event import contains, listen, remove |
2 | 2 | from sqlalchemy.orm import Session
|
3 | 3 |
|
4 | 4 | g_tracer = None
|
@@ -171,27 +171,34 @@ def _connectable_error_handler(exception_context):
|
171 | 171 | span.finish()
|
172 | 172 |
|
173 | 173 | 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 |
175 | 183 |
|
176 |
| -def _session_after_begin_handler(session, transaction, conn): |
177 | 184 | # Have the connections inherit the tracing info
|
178 | 185 | # from the session (including parent span, if any).
|
179 |
| - _set_traced_with_session(conn, session) |
| 186 | + listen(session, 'after_begin', _session_after_begin_handler) |
180 | 187 |
|
181 | 188 | # Plug post-operation clean up handlers.
|
182 | 189 | # 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) |
185 | 198 |
|
186 |
| -# Event handlers can't remove themselves |
187 |
| -# Fine, as long as we only fire one of them *once*. |
188 | 199 | def _session_before_commit_handler(session):
|
189 | 200 | _clear_traced(session)
|
190 |
| - remove(session, 'after_begin', _session_after_begin_handler) |
191 |
| - remove(session, 'after_rollback', _session_rollback_handler) |
192 | 201 |
|
193 | 202 | def _session_rollback_handler(session):
|
194 | 203 | _clear_traced(session)
|
195 |
| - remove(session, 'after_begin', _session_after_begin_handler) |
196 |
| - remove(session, 'before_commit', _session_before_commit_handler) |
197 | 204 |
|
0 commit comments