Skip to content

Commit 84bb1a2

Browse files
committed
Make clear_traced() public.
This function clears any tracing info on statements/connection/session objects, and it helps for the cases where no commit/rollback happened. This is specially handy also for doing bulk updates/insertions as those operation don't trigger any commit/rollback events at all.
1 parent f37a621 commit 84bb1a2

File tree

3 files changed

+48
-13
lines changed

3 files changed

+48
-13
lines changed

sqlalchemy_opentracing/__init__.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ def set_traced(obj):
4141
# after commit/rollback.
4242
_register_connection_events(obj)
4343

44+
def clear_traced(obj):
45+
'''
46+
Clear an object's decorated tracing fields,
47+
to prevent unintended further tracing.
48+
'''
49+
if hasattr(obj, '_parent_span'):
50+
del obj._parent_span
51+
if hasattr(obj, '_traced'):
52+
del obj._traced
53+
4454
def get_parent_span(obj):
4555
'''
4656
Gets a parent span for this object, if any.
@@ -94,16 +104,6 @@ def _can_operation_be_traced(conn, stmt_obj):
94104

95105
return False
96106

97-
def _clear_traced(obj):
98-
'''
99-
Clear an object's decorated tracing fields,
100-
to prevent unintended further tracing.
101-
'''
102-
if hasattr(obj, '_parent_span'):
103-
del obj._parent_span
104-
if hasattr(obj, '_traced'):
105-
del obj._traced
106-
107107
def _get_span(obj):
108108
'''
109109
Get the span of a statement object, if any.
@@ -212,7 +212,7 @@ def _register_session_connection_event(session):
212212
listen(session, 'after_rollback', _session_rollback_handler)
213213

214214
def _connection_cleanup_handler(conn):
215-
_clear_traced(conn)
215+
clear_traced(conn)
216216

217217
def _session_after_begin_handler(session, transaction, conn):
218218
# It's only needed to pass down tracing information
@@ -221,8 +221,8 @@ def _session_after_begin_handler(session, transaction, conn):
221221
_set_traced_with_session(conn, session)
222222

223223
def _session_before_commit_handler(session):
224-
_clear_traced(session)
224+
clear_traced(session)
225225

226226
def _session_rollback_handler(session):
227-
_clear_traced(session)
227+
clear_traced(session)
228228

tests/test_core.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,26 @@ def test_traced_after_rollback(self):
173173

174174
self.assertEqual(0, len(tracer.spans))
175175

176+
def test_traced_clear_connection(self):
177+
tracer = DummyTracer()
178+
creat = CreateTable(self.users_table)
179+
ins = self.users_table.insert().values(name='John Doe')
180+
181+
sqlalchemy_opentracing.init_tracing(tracer)
182+
183+
conn = self.engine.connect()
184+
with conn.begin() as tx:
185+
sqlalchemy_opentracing.set_traced(conn)
186+
conn.execute(creat)
187+
188+
# Stop tracing from this point.
189+
sqlalchemy_opentracing.clear_traced(conn)
190+
191+
conn.execute(ins)
192+
193+
self.assertEqual(1, len(tracer.spans))
194+
self.assertEqual('create_table', tracer.spans[0].operation_name)
195+
176196
def test_unregister_connectable(self):
177197
tracer = DummyTracer()
178198
creat = CreateTable(self.users_table)

tests/test_orm.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,3 +216,18 @@ def test_traced_bulk_insert(self):
216216
'sqlalchemy.dialect': 'sqlite',
217217
})
218218

219+
def test_traced_clear_session(self):
220+
tracer = DummyTracer()
221+
sqlalchemy_opentracing.init_tracing(tracer)
222+
223+
session = self.session
224+
sqlalchemy_opentracing.set_traced(session)
225+
session.add(User(name='John Doe'))
226+
session.add(User(name='Jason Bourne'))
227+
228+
# Clear the tracing info right before committing.
229+
sqlalchemy_opentracing.clear_traced(session)
230+
session.commit()
231+
232+
self.assertEqual(0, len(tracer.spans))
233+

0 commit comments

Comments
 (0)