Skip to content

Commit 0bf325d

Browse files
Merge pull request #4 from carlosalberto/trace_all_engines
Add a flag to initialize the tracing for *all* engines/databases.
2 parents 110f837 + 851b05d commit 0bf325d

5 files changed

Lines changed: 68 additions & 20 deletions

File tree

README.rst

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,27 @@ By default, only statements marked to be traced are taken into account (explicit
3232

3333
.. code-block:: python
3434
35-
sqlalchemy_opentracing.init_tracing(tracer, trace_all=True)
35+
sqlalchemy_opentracing.init_tracing(tracer, trace_all_queries=True)
3636
sqlalchemy_opentracing.register_engine(engine)
3737
3838
# this statement will be traced too (without a parent span, though)
3939
with engine.begin() as conn:
4040
sel = select([users])
4141
conn.execute(sel)
4242
43+
It is also possible to have all engines being registered automatically (independently of the `trace_all_queries` flag, which can be enabled or disabled):
44+
45+
.. code-block:: python
46+
47+
# No need to call register_engine()
48+
sqlalchemy_opentracing.init_tracing(tracer, trace_all_engines=True)
49+
50+
with engine.begin() as conn:
51+
sel = select([users])
52+
...
53+
54+
This is equivalent to calling `register_engine` with the `sqlalchemy.engine.Engine` class.
55+
4356
The resulting spans will have an operation name related to the sql statement (such as `create-table` or `insert`), and will include exception information (if any), the dialect/backend (such as sqlite), and a few other hints.
4457

4558
Tracing under a Connection

sqlalchemy_opentracing/__init__.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,26 @@
1-
from sqlalchemy.engine import Connection
1+
from sqlalchemy.engine import Connection, Engine
22
from sqlalchemy.event import contains, listen, remove
33
from sqlalchemy.orm import Session
44

55
g_tracer = None
6-
g_trace_all = True
6+
g_trace_all_queries = False
77

8-
def init_tracing(tracer, trace_all=False):
8+
def init_tracing(tracer, trace_all_engines=False, trace_all_queries=False):
99
'''
1010
Set our global tracer.
1111
Tracer objects from our pyramid/flask/django libraries
1212
can be passed as well.
1313
'''
14-
global g_tracer, g_trace_all
14+
global g_tracer, g_trace_all_queries
1515
if hasattr(tracer, '_tracer'):
1616
g_tracer = tracer._tracer
1717
else:
1818
g_tracer = tracer
1919

20-
g_trace_all = trace_all
20+
g_trace_all_queries = trace_all_queries
21+
22+
if trace_all_engines:
23+
register_engine(Engine)
2124

2225
def get_traced(obj):
2326
'''
@@ -130,7 +133,7 @@ def _engine_before_cursor_handler(conn, cursor,
130133

131134
# Don't trace if trace_all is disabled
132135
# and the connection/statement wasn't marked explicitly.
133-
if not (g_trace_all or _can_operation_be_traced(conn, stmt_obj)):
136+
if not (g_trace_all_queries or _can_operation_be_traced(conn, stmt_obj)):
134137
return
135138

136139
# Don't trace PRAGMA statements coming from SQLite

tests/test_api.py

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import unittest
2+
from mock import patch
23
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
34
from sqlalchemy.exc import OperationalError
45
from sqlalchemy.schema import CreateTable
@@ -18,20 +19,32 @@ def test_init(self):
1819
tracer = DummyTracer()
1920
sqlalchemy_opentracing.init_tracing(tracer)
2021
self.assertEqual(tracer, sqlalchemy_opentracing.g_tracer)
21-
self.assertEqual(False, sqlalchemy_opentracing.g_trace_all)
22+
self.assertEqual(False, sqlalchemy_opentracing.g_trace_all_queries)
2223

2324
def test_init_subtracer(self):
2425
tracer = DummyTracer(with_subtracer=True)
2526
sqlalchemy_opentracing.init_tracing(tracer)
2627
self.assertEqual(tracer._tracer, sqlalchemy_opentracing.g_tracer)
27-
self.assertEqual(False, sqlalchemy_opentracing.g_trace_all)
28+
self.assertEqual(False, sqlalchemy_opentracing.g_trace_all_queries)
2829

29-
def test_init_traceall(self):
30-
sqlalchemy_opentracing.init_tracing(DummyTracer(), False)
31-
self.assertEqual(False, sqlalchemy_opentracing.g_trace_all)
30+
def test_init_trace_all_queries(self):
31+
sqlalchemy_opentracing.init_tracing(DummyTracer(), trace_all_queries=False)
32+
self.assertEqual(False, sqlalchemy_opentracing.g_trace_all_queries)
3233

33-
sqlalchemy_opentracing.init_tracing(DummyTracer(), True)
34-
self.assertEqual(True, sqlalchemy_opentracing.g_trace_all)
34+
sqlalchemy_opentracing.init_tracing(DummyTracer(), trace_all_queries=True)
35+
self.assertEqual(True, sqlalchemy_opentracing.g_trace_all_queries)
36+
37+
@patch('sqlalchemy_opentracing.register_engine')
38+
def test_init_trace_all_engines(self, mock_register):
39+
tracer = DummyTracer()
40+
sqlalchemy_opentracing.init_tracing(tracer)
41+
self.assertEqual(0, mock_register.call_count)
42+
43+
sqlalchemy_opentracing.init_tracing(tracer, trace_all_engines=False)
44+
self.assertEqual(0, mock_register.call_count)
45+
46+
sqlalchemy_opentracing.init_tracing(tracer, trace_all_engines=True)
47+
self.assertEqual(1, mock_register.call_count)
3548

3649
def test_traced_property(self):
3750
stmt_obj = CreateTable(self.users_table)

tests/test_core.py

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import unittest
22
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
3+
from sqlalchemy.engine import Engine
34
from sqlalchemy.exc import OperationalError
45
from sqlalchemy.schema import CreateTable
56
from sqlalchemy.sql import select
@@ -44,15 +45,33 @@ def test_traced_none(self):
4445

4546
self.assertEqual(0, len(tracer.spans))
4647

47-
def test_traced_all(self):
48+
def test_traced_all_queries(self):
4849
tracer = DummyTracer()
4950
creat = CreateTable(self.users_table)
5051

51-
sqlalchemy_opentracing.init_tracing(tracer, trace_all=True)
52+
sqlalchemy_opentracing.init_tracing(tracer, trace_all_queries=True)
5253
self.engine.execute(creat)
5354

5455
self.assertEqual(1, len(tracer.spans))
5556

57+
def test_traced_all_engines(self):
58+
# Create an engine that is not registered.
59+
e = create_engine('sqlite:///:memory:')
60+
tracer = DummyTracer()
61+
creat = CreateTable(self.users_table)
62+
63+
sqlalchemy_opentracing.init_tracing(tracer, trace_all_engines=True)
64+
sqlalchemy_opentracing.set_traced(creat)
65+
e.execute(creat)
66+
67+
# Unregister the main Engine class before doing our assertions,
68+
# in case we fail.
69+
sqlalchemy_opentracing.unregister_engine(Engine)
70+
71+
self.assertEqual(1, len(tracer.spans))
72+
self.assertEqual('create_table', tracer.spans[0].operation_name)
73+
self.assertEqual(True, tracer.spans[0].is_finished)
74+
5675
def test_traced_error(self):
5776
tracer = DummyTracer()
5877
creat = CreateTable(self.users_table)
@@ -82,7 +101,7 @@ def test_traced_error(self):
82101
def test_trace_text(self):
83102
tracer = DummyTracer()
84103

85-
sqlalchemy_opentracing.init_tracing(tracer, trace_all=True)
104+
sqlalchemy_opentracing.init_tracing(tracer, trace_all_queries=True)
86105
self.engine.execute('CREATE TABLE users (id INTEGER NOT NULL, name VARCHAR, PRIMARY KEY (id))')
87106
self.assertEqual(1, len(tracer.spans))
88107
self.assertEqual(tracer.spans[0].operation_name, 'textclause')
@@ -97,7 +116,7 @@ def test_trace_text(self):
97116
def test_trace_text_error(self):
98117
tracer = DummyTracer()
99118

100-
sqlalchemy_opentracing.init_tracing(tracer, trace_all=True)
119+
sqlalchemy_opentracing.init_tracing(tracer, trace_all_queries=True)
101120
try:
102121
self.engine.execute('SELECT name FROM users')
103122
except OperationalError:
@@ -260,7 +279,7 @@ def test_unregister_engine(self):
260279
tracer = DummyTracer()
261280
creat = CreateTable(self.users_table)
262281

263-
sqlalchemy_opentracing.init_tracing(tracer, trace_all=True)
282+
sqlalchemy_opentracing.init_tracing(tracer, trace_all_queries=True)
264283
self.engine.execute(creat)
265284
self.assertEqual(1, len(tracer.spans))
266285

tests/test_orm.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def test_traced_none(self):
5656
# test mixing insert with select and insert
5757
def test_traced_all(self):
5858
tracer = DummyTracer()
59-
sqlalchemy_opentracing.init_tracing(tracer, trace_all=True)
59+
sqlalchemy_opentracing.init_tracing(tracer, trace_all_queries=True)
6060

6161
session = self.session
6262
session.add(User(name='John Doe'))

0 commit comments

Comments
 (0)