Skip to content

Commit dd62176

Browse files
committed
send services in the correct format.
1 parent a2b605e commit dd62176

File tree

3 files changed

+36
-15
lines changed

3 files changed

+36
-15
lines changed

ddtrace/api.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,21 @@ def send_traces(self, traces):
2323
self.send_spans(spans)
2424

2525
def send_spans(self, spans):
26+
if not spans:
27+
return
2628
start = time.time()
2729
data = ddtrace.encoding.encode_spans(spans)
2830
self._send_span_data(data)
2931
log.debug("reported %d spans in %.5fs", len(spans), time.time() - start)
3032

3133
def send_services(self, services):
34+
if not services:
35+
return
3236
log.debug("Reporting %d services", len(services))
33-
data = ddtrace.encoding.encode_services(services)
37+
s = {}
38+
for service in services:
39+
s.update(service)
40+
data = ddtrace.encoding.encode_services(s)
3441
self._put("/services", data, self.headers)
3542

3643
def _send_span_data(self, data):

ddtrace/tracer.py

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ def __init__(self):
4646
# in production.
4747
self.debug_logging = False
4848

49+
# a buffer for service info so we dont' perpetually send the same
50+
# things.
51+
self._services = {}
52+
4953
def configure(self, enabled=None, hostname=None, port=None, sampler=None):
5054
"""Configure an existing Tracer the easy way.
5155
@@ -169,20 +173,28 @@ def set_service_info(self, service, app, app_type):
169173
:param str app: the off the shelf name of the application (e.g. rails, postgres, custom-app)
170174
:param str app_type: the type of the application (e.g. db, web)
171175
"""
172-
173-
services = {
174-
service : {
175-
"app" : app,
176-
"app_type": app_type,
177-
}
178-
}
179-
180-
if self.debug_logging:
181-
log.debug("set_service_info: service:%s app:%s type:%s",
182-
service, app, app_type)
183-
184-
if self.enabled and self.writer:
185-
self.writer.write(services=services)
176+
try:
177+
# don't bother sending the same services over and over.
178+
info = (service, app, app_type)
179+
if self._services.get(service, None) == info:
180+
return
181+
self._services[service] = info
182+
183+
if self.debug_logging:
184+
log.debug("set_service_info: service:%s app:%s type:%s", service, app, app_type)
185+
186+
# If we had changes, send them to the writer.
187+
if self.enabled and self.writer:
188+
189+
# translate to the form the server understands.
190+
services = {}
191+
for service, app, app_type in self._services.values():
192+
services[service] = {"app" : app, "app_type" : app_type}
193+
194+
# queue them for writes.
195+
self.writer.write(services=services)
196+
except Exception:
197+
log.exception("error setting service info")
186198

187199
def wrap(self, name=None, service=None, resource=None, span_type=None):
188200
"""A decorator used to trace an entire function.

tox.ini

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ envlist =
2121
{py27,py34}-pymongo{30,31,32,33}-mongoengine
2222
{py27,py34}-requests{208,209,210,211}
2323
{py27,py34}-sqlalchemy{10,11}-psycopg2
24+
{py27,py34}-redis
2425
{py27,py34}-all
2526

2627
[testenv]
@@ -103,6 +104,7 @@ commands =
103104
{py27,py34}-pymongo{30,31,32,33}: nosetests {posargs} tests/contrib/pymongo/
104105
{py27,py34}-mongoengine: nosetests {posargs} tests/contrib/mongoengine
105106
{py27,py34}-psycopg2: nosetests {posargs} tests/contrib/psycopg
107+
{py27,py34}-redis: nosetests {posargs} tests/contrib/redis
106108
{py27,py34}-requests{200,208,209,210,211}: nosetests {posargs} tests/contrib/requests
107109
{py27,py34}-sqlalchemy{10,11}: nosetests {posargs} tests/contrib/sqlalchemy
108110

0 commit comments

Comments
 (0)