Skip to content

Commit d47b851

Browse files
committed
Add db tests for underlying config
1 parent 1461d98 commit d47b851

File tree

8 files changed

+273
-2
lines changed

8 files changed

+273
-2
lines changed

tests/contrib/dbapi/test_unit.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,19 @@ def method():
191191
assert span.get_metric('db.rowcount') == 123, 'Row count is set as a metric'
192192
assert span.get_tag('sql.rows') == '123', 'Row count is set as a tag (for legacy django cursor replacement)'
193193

194+
def test_cursor_analytics_default(self):
195+
cursor = self.cursor
196+
cursor.rowcount = 0
197+
cursor.execute.return_value = '__result__'
198+
199+
pin = Pin('pin_name', tracer=self.tracer)
200+
traced_cursor = TracedCursor(cursor, pin)
201+
# DEV: We always pass through the result
202+
assert '__result__' == traced_cursor.execute('__query__', 'arg_1', kwarg1='kwarg1')
203+
204+
span = self.tracer.writer.pop()[0]
205+
self.assertIsNone(span.get_metric(ANALYTICS_SAMPLE_RATE_KEY))
206+
194207
def test_cursor_analytics_with_rate(self):
195208
with self.override_config(
196209
'dbapi2',

tests/contrib/mongoengine/test.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,19 @@
33

44
# 3p
55
import mongoengine
6-
from nose.tools import eq_
6+
from nose.tools import eq_, ok_
77
import pymongo
88

99
# project
1010
from ddtrace import Pin
11+
from ddtrace.constants import ANALYTICS_SAMPLE_RATE_KEY
1112
from ddtrace.contrib.mongoengine.patch import patch, unpatch
1213
from ddtrace.ext import mongo as mongox
1314

1415
# testing
1516
from tests.opentracer.utils import init_tracer
1617
from ..config import MONGO_CONFIG
18+
from ...base import override_config
1719
from ...test_tracer import get_dummy_tracer
1820

1921

@@ -154,6 +156,38 @@ def test_opentracing(self):
154156
eq_(dd_span.service, self.TEST_SERVICE)
155157
_assert_timing(dd_span, start, end)
156158

159+
def test_analytics_default(self):
160+
tracer = self.get_tracer_and_connect()
161+
Artist.drop_collection()
162+
163+
spans = tracer.writer.pop()
164+
eq_(len(spans), 1)
165+
ok_(spans[0].get_metric(ANALYTICS_SAMPLE_RATE_KEY) is None)
166+
167+
def test_analytics_with_rate(self):
168+
with override_config(
169+
'pymongo',
170+
dict(analytics_enabled=True, analytics_sample_rate=0.5)
171+
):
172+
tracer = self.get_tracer_and_connect()
173+
Artist.drop_collection()
174+
175+
spans = tracer.writer.pop()
176+
eq_(len(spans), 1)
177+
eq_(spans[0].get_metric(ANALYTICS_SAMPLE_RATE_KEY), 0.5)
178+
179+
def test_analytics_without_rate(self):
180+
with override_config(
181+
'pymongo',
182+
dict(analytics_enabled=True)
183+
):
184+
tracer = self.get_tracer_and_connect()
185+
Artist.drop_collection()
186+
187+
spans = tracer.writer.pop()
188+
eq_(len(spans), 1)
189+
eq_(spans[0].get_metric(ANALYTICS_SAMPLE_RATE_KEY), 1.0)
190+
157191

158192
class TestMongoEnginePatchConnectDefault(MongoEngineCore):
159193
"""Test suite with a global Pin for the connect function with the default configuration"""

tests/contrib/mysql/test_mysql.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
# project
66
from ddtrace import Pin
7+
from ddtrace.constants import ANALYTICS_SAMPLE_RATE_KEY
78
from ddtrace.contrib.mysql.patch import patch, unpatch
89

910
# tests
@@ -316,6 +317,53 @@ def test_rollback(self):
316317
eq_(span.service, self.TEST_SERVICE)
317318
eq_(span.name, 'mysql.connection.rollback')
318319

320+
def test_analytics_default(self):
321+
conn, tracer = self._get_conn_tracer()
322+
writer = tracer.writer
323+
cursor = conn.cursor()
324+
cursor.execute("SELECT 1")
325+
rows = cursor.fetchall()
326+
eq_(len(rows), 1)
327+
spans = writer.pop()
328+
329+
self.assertEqual(len(spans), 1)
330+
span = spans[0]
331+
self.assertIsNone(span.get_metric(ANALYTICS_SAMPLE_RATE_KEY))
332+
333+
def test_analytics_with_rate(self):
334+
with self.override_config(
335+
'dbapi2',
336+
dict(analytics_enabled=True, analytics_sample_rate=0.5)
337+
):
338+
conn, tracer = self._get_conn_tracer()
339+
writer = tracer.writer
340+
cursor = conn.cursor()
341+
cursor.execute("SELECT 1")
342+
rows = cursor.fetchall()
343+
eq_(len(rows), 1)
344+
spans = writer.pop()
345+
346+
self.assertEqual(len(spans), 1)
347+
span = spans[0]
348+
self.assertEqual(span.get_metric(ANALYTICS_SAMPLE_RATE_KEY), 0.5)
349+
350+
def test_analytics_with_rate(self):
351+
with self.override_config(
352+
'dbapi2',
353+
dict(analytics_enabled=True)
354+
):
355+
conn, tracer = self._get_conn_tracer()
356+
writer = tracer.writer
357+
cursor = conn.cursor()
358+
cursor.execute("SELECT 1")
359+
rows = cursor.fetchall()
360+
eq_(len(rows), 1)
361+
spans = writer.pop()
362+
363+
self.assertEqual(len(spans), 1)
364+
span = spans[0]
365+
self.assertEqual(span.get_metric(ANALYTICS_SAMPLE_RATE_KEY), 1.0)
366+
319367

320368
class TestMysqlPatch(MySQLCore, BaseTracerTestCase):
321369

tests/contrib/mysqldb/test_mysql.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import MySQLdb
22

33
from ddtrace import Pin
4+
from ddtrace.constants import ANALYTICS_SAMPLE_RATE_KEY
45
from ddtrace.contrib.mysqldb.patch import patch, unpatch
56

67
from nose.tools import eq_, ok_
@@ -365,6 +366,53 @@ def test_rollback(self):
365366
eq_(span.service, self.TEST_SERVICE)
366367
eq_(span.name, 'MySQLdb.connection.rollback')
367368

369+
def test_analytics_default(self):
370+
conn, tracer = self._get_conn_tracer()
371+
writer = tracer.writer
372+
cursor = conn.cursor()
373+
cursor.execute("SELECT 1")
374+
rows = cursor.fetchall()
375+
eq_(len(rows), 1)
376+
spans = writer.pop()
377+
378+
self.assertEqual(len(spans), 1)
379+
span = spans[0]
380+
self.assertIsNone(span.get_metric(ANALYTICS_SAMPLE_RATE_KEY))
381+
382+
def test_analytics_with_rate(self):
383+
with self.override_config(
384+
'dbapi2',
385+
dict(analytics_enabled=True, analytics_sample_rate=0.5)
386+
):
387+
conn, tracer = self._get_conn_tracer()
388+
writer = tracer.writer
389+
cursor = conn.cursor()
390+
cursor.execute("SELECT 1")
391+
rows = cursor.fetchall()
392+
eq_(len(rows), 1)
393+
spans = writer.pop()
394+
395+
self.assertEqual(len(spans), 1)
396+
span = spans[0]
397+
self.assertEqual(span.get_metric(ANALYTICS_SAMPLE_RATE_KEY), 0.5)
398+
399+
def test_analytics_with_rate(self):
400+
with self.override_config(
401+
'dbapi2',
402+
dict(analytics_enabled=True)
403+
):
404+
conn, tracer = self._get_conn_tracer()
405+
writer = tracer.writer
406+
cursor = conn.cursor()
407+
cursor.execute("SELECT 1")
408+
rows = cursor.fetchall()
409+
eq_(len(rows), 1)
410+
spans = writer.pop()
411+
412+
self.assertEqual(len(spans), 1)
413+
span = spans[0]
414+
self.assertEqual(span.get_metric(ANALYTICS_SAMPLE_RATE_KEY), 1.0)
415+
368416

369417
class TestMysqlPatch(MySQLCore, BaseTracerTestCase):
370418
"""Ensures MysqlDB is properly patched"""

tests/contrib/psycopg/test_psycopg.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from unittest import skipIf
1010

1111
# project
12+
from ddtrace.constants import ANALYTICS_SAMPLE_RATE_KEY
1213
from ddtrace.contrib.psycopg import connection_factory
1314
from ddtrace.contrib.psycopg.patch import patch, unpatch, PSYCOPG2_VERSION
1415
from ddtrace import Pin
@@ -285,6 +286,41 @@ def test_composed_query(self):
285286
dict(name='postgres.query', resource=query.as_string(db)),
286287
)
287288

289+
def test_analytics_default(self):
290+
conn = self._get_conn()
291+
conn.cursor().execute("""select 'blah'""")
292+
293+
spans = self.get_spans()
294+
self.assertEqual(len(spans), 1)
295+
span = spans[0]
296+
self.assertIsNone(span.get_metric(ANALYTICS_SAMPLE_RATE_KEY))
297+
298+
def test_analytics_with_rate(self):
299+
with self.override_config(
300+
'dbapi2',
301+
dict(analytics_enabled=True, analytics_sample_rate=0.5)
302+
):
303+
conn = self._get_conn()
304+
conn.cursor().execute("""select 'blah'""")
305+
306+
spans = self.get_spans()
307+
self.assertEqual(len(spans), 1)
308+
span = spans[0]
309+
self.assertEqual(span.get_metric(ANALYTICS_SAMPLE_RATE_KEY), 0.5)
310+
311+
def test_analytics_with_rate(self):
312+
with self.override_config(
313+
'dbapi2',
314+
dict(analytics_enabled=True)
315+
):
316+
conn = self._get_conn()
317+
conn.cursor().execute("""select 'blah'""")
318+
319+
spans = self.get_spans()
320+
self.assertEqual(len(spans), 1)
321+
span = spans[0]
322+
self.assertEqual(span.get_metric(ANALYTICS_SAMPLE_RATE_KEY), 1.0)
323+
288324

289325
def test_backwards_compatibilty_v3():
290326
tracer = DummyTracer()

tests/contrib/pymongo/test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
# testing
1616
from tests.opentracer.utils import init_tracer
1717
from ..config import MONGO_CONFIG
18-
from ...test_tracer import get_dummy_tracer
1918
from ...base import override_config
19+
from ...test_tracer import get_dummy_tracer
2020

2121

2222
def test_normalize_filter():

tests/contrib/pymysql/test_pymysql.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
# project
77
from ddtrace import Pin
8+
from ddtrace.constants import ANALYTICS_SAMPLE_RATE_KEY
89
from ddtrace.compat import PY2
910
from ddtrace.compat import stringify
1011
from ddtrace.contrib.pymysql.patch import patch, unpatch
@@ -318,6 +319,53 @@ def test_rollback(self):
318319
eq_(span.service, self.TEST_SERVICE)
319320
eq_(span.name, 'pymysql.connection.rollback')
320321

322+
def test_analytics_default(self):
323+
conn, tracer = self._get_conn_tracer()
324+
writer = tracer.writer
325+
cursor = conn.cursor()
326+
cursor.execute("SELECT 1")
327+
rows = cursor.fetchall()
328+
eq_(len(rows), 1)
329+
spans = writer.pop()
330+
331+
self.assertEqual(len(spans), 1)
332+
span = spans[0]
333+
self.assertIsNone(span.get_metric(ANALYTICS_SAMPLE_RATE_KEY))
334+
335+
def test_analytics_with_rate(self):
336+
with self.override_config(
337+
'dbapi2',
338+
dict(analytics_enabled=True, analytics_sample_rate=0.5)
339+
):
340+
conn, tracer = self._get_conn_tracer()
341+
writer = tracer.writer
342+
cursor = conn.cursor()
343+
cursor.execute("SELECT 1")
344+
rows = cursor.fetchall()
345+
eq_(len(rows), 1)
346+
spans = writer.pop()
347+
348+
self.assertEqual(len(spans), 1)
349+
span = spans[0]
350+
self.assertEqual(span.get_metric(ANALYTICS_SAMPLE_RATE_KEY), 0.5)
351+
352+
def test_analytics_with_rate(self):
353+
with self.override_config(
354+
'dbapi2',
355+
dict(analytics_enabled=True)
356+
):
357+
conn, tracer = self._get_conn_tracer()
358+
writer = tracer.writer
359+
cursor = conn.cursor()
360+
cursor.execute("SELECT 1")
361+
rows = cursor.fetchall()
362+
eq_(len(rows), 1)
363+
spans = writer.pop()
364+
365+
self.assertEqual(len(spans), 1)
366+
span = spans[0]
367+
self.assertEqual(span.get_metric(ANALYTICS_SAMPLE_RATE_KEY), 1.0)
368+
321369

322370
class TestPyMysqlPatch(PyMySQLCore, BaseTracerTestCase):
323371
def _get_conn_tracer(self):

tests/contrib/sqlite3/test_sqlite3.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
# project
66
import ddtrace
77
from ddtrace import Pin
8+
from ddtrace.constants import ANALYTICS_SAMPLE_RATE_KEY
89
from ddtrace.contrib.sqlite3 import connection_factory
910
from ddtrace.contrib.sqlite3.patch import patch, unpatch, TracedSQLiteCursor
1011
from ddtrace.ext import errors
@@ -282,3 +283,46 @@ def _given_a_traced_connection(self, tracer):
282283
db = sqlite3.connect(':memory:')
283284
Pin.get_from(db).clone(tracer=tracer).onto(db)
284285
return db
286+
287+
288+
def test_analytics_default(self):
289+
q = 'select * from sqlite_master'
290+
connection = self._given_a_traced_connection(self.tracer)
291+
cursor = connection.execute(q)
292+
cursor.fetchall()
293+
294+
spans = self.get_spans()
295+
self.assertEqual(len(spans), 1)
296+
span = spans[0]
297+
self.assertIsNone(span.get_metric(ANALYTICS_SAMPLE_RATE_KEY))
298+
299+
def test_analytics_with_rate(self):
300+
with self.override_config(
301+
'dbapi2',
302+
dict(analytics_enabled=True, analytics_sample_rate=0.5)
303+
):
304+
q = 'select * from sqlite_master'
305+
connection = self._given_a_traced_connection(self.tracer)
306+
cursor = connection.execute(q)
307+
cursor.fetchall()
308+
309+
spans = self.get_spans()
310+
self.assertEqual(len(spans), 1)
311+
span = spans[0]
312+
self.assertEqual(span.get_metric(ANALYTICS_SAMPLE_RATE_KEY), 0.5)
313+
314+
def test_analytics_with_rate(self):
315+
with self.override_config(
316+
'dbapi2',
317+
dict(analytics_enabled=True)
318+
):
319+
q = 'select * from sqlite_master'
320+
connection = self._given_a_traced_connection(self.tracer)
321+
cursor = connection.execute(q)
322+
cursor.fetchall()
323+
324+
spans = self.get_spans()
325+
326+
self.assertEqual(len(spans), 1)
327+
span = spans[0]
328+
self.assertEqual(span.get_metric(ANALYTICS_SAMPLE_RATE_KEY), 1.0)

0 commit comments

Comments
 (0)