Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# dd-trace-py

[![CircleCI](https://circleci.com/gh/DataDog/dd-trace-py.svg?style=svg&circle-token=f9bf80ce9281bc638c6f7465512d65c96ddc075a)](https://circleci.com/gh/DataDog/dd-trace-py)
14 changes: 14 additions & 0 deletions circle.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
machine:
services:
- docker
post:
- pyenv global 2.7.9 3.4.2
dependencies:
pre:
- sudo service postgresql stop
test:
override:
- docker run -d -p 9200:9200 elasticsearch:2.3
- docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=test -e POSTGRES_USER=test -e POSTGRES_DB=test postgres:9.5
- python2.7 setup.py test
- python3.4 setup.py test
31 changes: 23 additions & 8 deletions ddtrace/compat.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
import sys

PY2 = sys.version_info[0] == 2

stringify = str

if PY2:
from urllib import urlencode
import httplib
stringify = unicode
from Queue import Queue
try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO
else:
from queue import Queue
from urllib.parse import urlencode
import http.client as httplib
from io import StringIO

try:
from queue import Queue
except ImportError:
from Queue import Queue

try:
import ujson as json
Expand All @@ -19,7 +28,13 @@
except ImportError:
import json

try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO

__all__ = [
'PY2',
'urlencode',
'httplib',
'stringify',
'Queue',
'StringIO',
'json',
]
4 changes: 2 additions & 2 deletions ddtrace/reporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
"""

import atexit
import httplib
from .compat import httplib
import logging
import threading
from time import sleep, time
import os

# project
from compat import Queue, json
from .compat import Queue, json


DEFAULT_TIMEOUT = 10
Expand Down
9 changes: 4 additions & 5 deletions ddtrace/span.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@

from compat import StringIO
import logging
import random
import sys
import time
import traceback

from .compat import StringIO, stringify
from .ext import errors


Expand Down Expand Up @@ -97,9 +96,9 @@ def set_tag(self, key, value):
be ignored.
"""
try:
self.meta[key] = unicode(value)
self.meta[key] = stringify(value)
except Exception:
log.warn("error setting tag. ignoring", exc_info=True)
log.warning("error setting tag. ignoring", exc_info=True)

def get_tag(self, key):
""" Return the given tag or None if it doesn't exist"""
Expand All @@ -110,7 +109,7 @@ def set_tags(self, tags):
must be strings (or stringable)
"""
if tags:
for k, v in tags.iteritems():
for k, v in iter(tags.items()):
self.set_tag(k, v)

# backwards compatilibility, kill this
Expand Down
2 changes: 2 additions & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[nosetests]
verbosity=2
17 changes: 4 additions & 13 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from setuptools import setup
from setuptools import setup, find_packages

tests_require = [
'nose',
#'psycopg2',
#'sqlite3'
'flask',
'blinker',
'elasticsearch',
'psycopg2',
]

setup(
Expand All @@ -16,16 +16,7 @@
author='Datadog, Inc.',
author_email='dev@datadoghq.com',
license='BSD',
packages=[
'ddtrace',
'ddtrace.contrib',
'ddtrace.contrib.elasticsearch',
'ddtrace.contrib.flask',
'ddtrace.contrib.psycopg',
'ddtrace.contrib.pylons',
'ddtrace.contrib.sqlite3',
'ddtrace.ext',
],
packages=find_packages(exclude=['tests*']),
tests_require=tests_require,
test_suite="nose.collector",
)
Empty file added tests/__init__.py
Empty file.
Empty file added tests/contrib/__init__.py
Empty file.
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
except ImportError:
elasticsearch = None

from . import metadata
from .transport import get_traced_transport
from ...tracer import Tracer
from ...test_tracer import DummyWriter
from ddtrace.contrib.elasticsearch import metadata
from ddtrace.contrib.elasticsearch import get_traced_transport
from ddtrace.tracer import Tracer

from ...test_tracer import DummyWriter


class ElasticsearchTest(unittest.TestCase):
Expand All @@ -28,7 +28,7 @@ class ElasticsearchTest(unittest.TestCase):
def setUp(self):
"""Prepare ES"""
if not elasticsearch:
self.SkipTest("elasticsearch module isn't available")
raise unittest.SkipTest("elasticsearch module isn't available")

es = elasticsearch.Elasticsearch()
es.indices.delete(index=self.ES_INDEX, ignore=[400, 404])
Expand Down Expand Up @@ -88,8 +88,8 @@ def test_elasticsearch(self):
eq_(span.resource, "GET /%s/%s/_search" % (self.ES_INDEX, self.ES_TYPE))
eq_(span.get_tag(metadata.METHOD), "GET")
eq_(span.get_tag(metadata.URL), "/%s/%s/_search" % (self.ES_INDEX, self.ES_TYPE))
eq_(span.get_tag(metadata.PARAMS), 'sort=name%3Adesc&size=100')
eq_(span.get_tag(metadata.BODY), '{"query":{"match_all":{}}}')
eq_(span.get_tag(metadata.BODY).replace(" ", ""), '{"query":{"match_all":{}}}')
eq_(set(span.get_tag(metadata.PARAMS).split('&')), {'sort=name%3Adesc', 'size=100'})

self.assertTrue(int(span.get_tag(metadata.TOOK)) > 0)

Empty file added tests/contrib/flask/__init__.py
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@
from flask import Flask, render_template
from nose.tools import eq_

from ... import Tracer
from ...contrib.flask import TraceMiddleware
from ddtrace import Tracer
from ddtrace.contrib.flask import TraceMiddleware
from ddtrace.ext import http, errors

from ...test_tracer import DummyWriter
from ...ext import http, errors

log = logging.getLogger(__name__)

Expand Down Expand Up @@ -63,7 +64,7 @@ def handle_my_exception(e):
# add tracing to the app (we use a global app to help ensure multiple requests
# work)
service = "test.flask.service"
assert not writer.pop() # should always be empty
assert not writer.pop() # should always be empty
traced_app = TraceMiddleware(app, tracer, service=service)

# make the app testable
Expand All @@ -76,16 +77,14 @@ class TestFlask(object):
def setUp(self):
# ensure the last test didn't leave any trash
spans = writer.pop()
assert not spans, spans
assert not tracer.current_span(), tracer.current_span()

def test_child(self):
start = time.time()
rv = app.get('/child')
end = time.time()
# ensure request worked
eq_(rv.status_code, 200)
eq_(rv.data, 'child')
eq_(rv.data, b'child')
# ensure trace worked
spans = writer.pop()
eq_(len(spans), 2)
Expand Down Expand Up @@ -119,7 +118,7 @@ def test_success(self):

# ensure request worked
eq_(rv.status_code, 200)
eq_(rv.data, 'hello')
eq_(rv.data, b'hello')

# ensure trace worked
assert not tracer.current_span(), tracer.current_span().pprint()
Expand All @@ -140,7 +139,7 @@ def test_template(self):

# ensure request worked
eq_(rv.status_code, 200)
eq_(rv.data, 'hello earth')
eq_(rv.data, b'hello earth')

# ensure trace worked
assert not tracer.current_span(), tracer.current_span().pprint()
Expand Down Expand Up @@ -191,7 +190,7 @@ def test_error(self):

# ensure the request itself worked
eq_(rv.status_code, 500)
eq_(rv.data, 'error')
eq_(rv.data, b'error')

# ensure the request was traced.
assert not tracer.current_span()
Expand Down Expand Up @@ -229,5 +228,5 @@ def test_fatal(self):
eq_(s.meta.get(http.STATUS_CODE), '500')
assert "ZeroDivisionError" in s.meta.get(errors.ERROR_TYPE)
msg = s.meta.get(errors.ERROR_MSG)
assert "integer division" in msg, msg
assert "by zero" in msg, msg

Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
from nose.tools import eq_
from nose.plugins.skip import SkipTest

from ... import Tracer
from ...contrib.psycopg import connection_factory
from ddtrace import Tracer
from ddtrace.contrib.psycopg import connection_factory

from ...test_tracer import DummyWriter


def test_wrap():

try:
Expand All @@ -18,11 +20,11 @@ def test_wrap():
tracer = Tracer(writer=writer)

params = {
'host' : 'localhost',
'port' : 5432,
'user' : 'dog',
'password' :'dog',
'dbname' : 'dogdata',
'host': 'localhost',
'port': 5432,
'user': 'test',
'password':'test',
'dbname': 'test',
}

services = ["db", "another"]
Expand Down
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@

from nose.tools import eq_

from ... import Tracer
from ...contrib.pylons import PylonsTraceMiddleware
from ...test_tracer import DummyWriter
from ...ext import http
from ddtrace import Tracer
from ddtrace.contrib.pylons import PylonsTraceMiddleware
from ddtrace.ext import http

from ...test_tracer import DummyWriter

class FakeWSGIApp(object):

Expand Down
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@

from nose.tools import eq_

from ... import Tracer
from ...contrib.sqlite3 import connection_factory
from ddtrace import Tracer
from ddtrace.contrib.sqlite3 import connection_factory
from ddtrace.ext import errors

from ...test_tracer import DummyWriter
from ...ext import errors

def test_foo():
writer = DummyWriter()
Expand Down
3 changes: 1 addition & 2 deletions ddtrace/test_buffer.py → tests/test_buffer.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@

import random
import threading

from nose.tools import eq_

from .buffer import ThreadLocalSpanBuffer
from ddtrace.buffer import ThreadLocalSpanBuffer


def _get_test_span():
Expand Down
6 changes: 3 additions & 3 deletions ddtrace/test_span.py → tests/test_span.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

from nose.tools import eq_

from .span import Span
from .ext import errors
from ddtrace.span import Span
from ddtrace.ext import errors


def test_ids():
Expand Down Expand Up @@ -68,7 +68,7 @@ def test_traceback_with_error():

assert s.error
assert 'by zero' in s.get_tag(errors.ERROR_MSG)
eq_("exceptions.ZeroDivisionError", s.get_tag(errors.ERROR_TYPE))
assert "ZeroDivisionError" in s.get_tag(errors.ERROR_TYPE)
assert s.get_tag(errors.ERROR_STACK)

def test_traceback_without_error():
Expand Down
2 changes: 1 addition & 1 deletion ddtrace/test_tracer.py → tests/test_tracer.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import time
from nose.tools import eq_

from .tracer import Tracer
from ddtrace.tracer import Tracer


def test_tracer_vars():
Expand Down