Skip to content

Commit d2d5088

Browse files
committed
Initial commit of our main module.
1 parent b702b1e commit d2d5088

File tree

1 file changed

+58
-0
lines changed

1 file changed

+58
-0
lines changed

sqlalchemy_opentracing/__init__.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
from sqlalchemy.event import listen
2+
from sqlalchemy.engine import Connectable
3+
4+
import opentracing
5+
6+
g_tracer = None
7+
8+
def set_tracer(tracer):
9+
'''
10+
Set our global tracer.
11+
Tracer objects from our pyramid/flask/django libraries
12+
can be passed as well.
13+
'''
14+
global g_tracer
15+
if hasattr(tracer, '_tracer'):
16+
g_tracer = tracer._tracer
17+
else:
18+
g_tracer = tracer
19+
20+
def set_parent_span(stmt, parent_span):
21+
'''
22+
Start tracing a given statement under
23+
a specific span.
24+
'''
25+
stmt._parent_span = parent_span
26+
27+
def has_parent_span(stmt):
28+
'''
29+
Get whether or not the statement has
30+
a parent span.
31+
'''
32+
return hasattr(stmt, '_parent_span')
33+
34+
def _before_handler(conn, clauseelement, multiparams, params):
35+
parent_span = getattr(clauseelement, '_parent_span', None)
36+
span = tracer.start_span(operation_name='sql?', child_of=parent_span) # (xxx) operation name
37+
38+
clauseelement._span = span
39+
40+
def _after_handler(conn, clauseelement, multiparams, params):
41+
if getattr(clauseelement, '_span', None) is None:
42+
return
43+
44+
span = clauseelement._span
45+
span.finish()
46+
47+
def register_tracing(obj):
48+
'''
49+
Register an object to have its events be traced.
50+
'''
51+
if isinstance(obj, Connectable): # Engine or Connection instance.
52+
listen(obj, 'before_cursor_execute', _before_cursor_handler)
53+
listen(obj, 'after_cursor_execute', _after_cursor_handler)
54+
55+
#elif isinstance(obj, MetaData): # Schema changes
56+
# listen(obj, "before_create", _schema_before_handler)
57+
# listen(obj, "after_create", _schema_after_handler)
58+

0 commit comments

Comments
 (0)