Skip to content

Commit 9bc36ae

Browse files
authored
Updates to support OpenTracing v2.0 (#74)
* Updates to support OpenTracing v2.0 * Fixed test requirements for travis * Moar test dependencies * Tested in clean/empty python install * Remove debug remnant * Don't call finish() on scoped spans * Update suds instrumentation to use OT 2.0 * Update OT dependencies to GA * Use OT 2.0 everywhere * Update examples
1 parent f3835b6 commit 9bc36ae

File tree

13 files changed

+283
-293
lines changed

13 files changed

+283
-293
lines changed

example/opentracing_vanilla.py

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,23 @@
33

44
import opentracing
55

6-
import instana
7-
86
# Loop continuously with a 2 second sleep to generate traces
97
while True:
10-
entry_span = opentracing.tracer.start_span('universe')
11-
12-
entry_span.set_tag('http.method', 'GET')
13-
entry_span.set_tag('http.url', '/users')
14-
entry_span.set_tag('span.kind', 'entry')
15-
16-
intermediate_span = opentracing.tracer.start_span('nebula', child_of=entry_span)
17-
intermediate_span.finish()
18-
19-
db_span = opentracing.tracer.start_span('black-hole', child_of=entry_span)
20-
db_span.set_tag('db.instance', 'users')
21-
db_span.set_tag('db.statement', 'SELECT * FROM user_table')
22-
db_span.set_tag('db.type', 'mysql')
23-
db_span.set_tag('db.user', 'mysql_login')
24-
db_span.set_tag('span.kind', 'exit')
25-
db_span.finish()
26-
27-
intermediate_span = opentracing.tracer.start_span('space-dust', child_of=entry_span)
28-
intermediate_span.log_kv({'message': 'All seems ok'})
29-
intermediate_span.finish()
30-
31-
entry_span.set_tag('http.status_code', 200)
32-
entry_span.finish()
33-
time.sleep(2)
8+
with opentracing.tracer.start_active_span('universe') as escope:
9+
escope.span.set_tag('http.method', 'GET')
10+
escope.span.set_tag('http.url', '/users')
11+
escope.span.set_tag('span.kind', 'entry')
12+
13+
with opentracing.tracer.start_active_span('black-hole', child_of=escope.span) as dbscope:
14+
dbscope.span.set_tag('db.instance', 'users')
15+
dbscope.span.set_tag('db.statement', 'SELECT * FROM user_table')
16+
time.sleep(.1)
17+
dbscope.span.set_tag('db.type', 'mysql')
18+
dbscope.span.set_tag('db.user', 'mysql_login')
19+
dbscope.span.set_tag('span.kind', 'exit')
20+
21+
with opentracing.tracer.start_active_span('space-dust', child_of=escope.span) as iscope:
22+
iscope.span.log_kv({'message': 'All seems ok'})
23+
24+
escope.span.set_tag('http.status_code', 200)
25+
time.sleep(.2)

example/simple.py

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,28 +16,24 @@ def main(argv):
1616

1717

1818
def simple():
19-
parent_span = ot.tracer.start_span(operation_name="asteroid")
20-
parent_span.set_tag(ext.COMPONENT, "Python simple example app")
21-
parent_span.set_tag(ext.SPAN_KIND, ext.SPAN_KIND_RPC_SERVER)
22-
parent_span.set_tag(ext.PEER_HOSTNAME, "localhost")
23-
parent_span.set_tag(ext.HTTP_URL, "/python/simple/one")
24-
parent_span.set_tag(ext.HTTP_METHOD, "GET")
25-
parent_span.set_tag(ext.HTTP_STATUS_CODE, 200)
26-
parent_span.log_kv({"foo": "bar"})
27-
28-
child_span = ot.tracer.start_span(operation_name="spacedust", child_of=parent_span)
29-
child_span.set_tag(ext.SPAN_KIND, ext.SPAN_KIND_RPC_CLIENT)
30-
child_span.set_tag(ext.PEER_HOSTNAME, "localhost")
31-
child_span.set_tag(ext.HTTP_URL, "/python/simple/two")
32-
child_span.set_tag(ext.HTTP_METHOD, "POST")
33-
child_span.set_tag(ext.HTTP_STATUS_CODE, 204)
34-
child_span.set_baggage_item("someBaggage", "someValue")
35-
36-
time.sleep(.1)
37-
child_span.finish()
38-
39-
time.sleep(.2)
40-
parent_span.finish()
19+
with ot.tracer.start_active_span('asteroid') as pscope:
20+
pscope.span.set_tag(ext.COMPONENT, "Python simple example app")
21+
pscope.span.set_tag(ext.SPAN_KIND, ext.SPAN_KIND_RPC_SERVER)
22+
pscope.span.set_tag(ext.PEER_HOSTNAME, "localhost")
23+
pscope.span.set_tag(ext.HTTP_URL, "/python/simple/one")
24+
pscope.span.set_tag(ext.HTTP_METHOD, "GET")
25+
pscope.span.set_tag(ext.HTTP_STATUS_CODE, 200)
26+
pscope.span.log_kv({"foo": "bar"})
27+
time.sleep(.2)
28+
29+
with ot.tracer.start_active_span('spacedust', child_of=pscope.span) as cscope:
30+
cscope.span.set_tag(ext.SPAN_KIND, ext.SPAN_KIND_RPC_CLIENT)
31+
cscope.span.set_tag(ext.PEER_HOSTNAME, "localhost")
32+
cscope.span.set_tag(ext.HTTP_URL, "/python/simple/two")
33+
cscope.span.set_tag(ext.HTTP_METHOD, "POST")
34+
cscope.span.set_tag(ext.HTTP_STATUS_CODE, 204)
35+
cscope.span.set_baggage_item("someBaggage", "someValue")
36+
time.sleep(.1)
4137

4238

4339
if __name__ == "__main__":

instana/helpers.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ def eum_snippet(trace_id=None, eum_api_key=None, meta={}):
3333
ids = {}
3434
ids['meta_kvs'] = ''
3535

36-
current_ctx = internal_tracer.current_context()
36+
parent_span = internal_tracer.active_span
3737

38-
if trace_id or current_ctx:
39-
ids['trace_id'] = trace_id or current_ctx.trace_id
38+
if trace_id or parent_span:
39+
ids['trace_id'] = trace_id or parent_span.trace_id
4040
else:
4141
# No trace_id passed in and tracer doesn't show an active span so
4242
# return nothing, nada & zip.
@@ -78,10 +78,9 @@ def eum_test_snippet(trace_id=None, eum_api_key=None, meta={}):
7878
ids = {}
7979
ids['meta_kvs'] = ''
8080

81-
current_ctx = internal_tracer.current_context()
82-
83-
if trace_id or current_ctx:
84-
ids['trace_id'] = trace_id or current_ctx.trace_id
81+
parent_span = internal_tracer.active_span
82+
if trace_id or parent_span:
83+
ids['trace_id'] = trace_id or parent_span.trace_id
8584
else:
8685
# No trace_id passed in and tracer doesn't show an active span so
8786
# return nothing, nada & zip.

instana/instrumentation/pep0249.py

Lines changed: 45 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -32,73 +32,61 @@ def _collect_kvs(self, span, sql):
3232
return span
3333

3434
def execute(self, sql, params=None):
35-
try:
36-
span = None
37-
context = internal_tracer.current_context()
35+
parent_span = internal_tracer.active_span
3836

39-
# If we're not tracing, just return
40-
if context is None:
41-
return self.__wrapped__.execute(sql, params)
37+
# If we're not tracing, just return
38+
if parent_span is None:
39+
return self.__wrapped__.execute(sql, params)
4240

43-
span = internal_tracer.start_span(self._module_name, child_of=context)
44-
span = self._collect_kvs(span, sql)
41+
with internal_tracer.start_active_span(self._module_name, child_of=parent_span) as scope:
42+
try:
43+
self._collect_kvs(scope.span, sql)
4544

46-
result = self.__wrapped__.execute(sql, params)
47-
except Exception as e:
48-
if span:
49-
span.log_exception(e)
50-
raise
51-
else:
52-
return result
53-
finally:
54-
if span:
55-
span.finish()
45+
result = self.__wrapped__.execute(sql, params)
46+
except Exception as e:
47+
if scope.span:
48+
scope.span.log_exception(e)
49+
raise
50+
else:
51+
return result
5652

5753
def executemany(self, sql, seq_of_parameters):
58-
try:
59-
span = None
60-
context = internal_tracer.current_context()
54+
parent_span = internal_tracer.active_span
6155

62-
# If we're not tracing, just return
63-
if context is None:
64-
return self.__wrapped__.executemany(sql, seq_of_parameters)
56+
# If we're not tracing, just return
57+
if parent_span is None:
58+
return self.__wrapped__.executemany(sql, seq_of_parameters)
6559

66-
span = internal_tracer.start_span(self._module_name, child_of=context)
67-
span = self._collect_kvs(span, sql)
60+
with internal_tracer.start_active_span(self._module_name, child_of=parent_span) as scope:
61+
try:
62+
self._collect_kvs(scope.span, sql)
6863

69-
result = self.__wrapped__.executemany(sql, seq_of_parameters)
70-
except Exception as e:
71-
if span:
72-
span.log_exception(e)
73-
raise
74-
else:
75-
return result
76-
finally:
77-
if span:
78-
span.finish()
64+
result = self.__wrapped__.executemany(sql, seq_of_parameters)
65+
except Exception as e:
66+
if scope.span:
67+
scope.span.log_exception(e)
68+
raise
69+
else:
70+
return result
7971

8072
def callproc(self, proc_name, params):
81-
try:
82-
span = None
83-
context = internal_tracer.current_context()
84-
85-
# If we're not tracing, just return
86-
if context is None:
87-
return self.__wrapped__.execute(proc_name, params)
88-
89-
span = internal_tracer.start_span(self._module_name, child_of=context)
90-
span = self._collect_kvs(span, proc_name)
91-
92-
result = self.__wrapped__.callproc(proc_name, params)
93-
except Exception as e:
94-
if span:
95-
span.log_exception(e)
96-
raise
97-
else:
98-
return result
99-
finally:
100-
if span:
101-
span.finish()
73+
parent_span = internal_tracer.active_span
74+
75+
# If we're not tracing, just return
76+
if parent_span is None:
77+
return self.__wrapped__.execute(proc_name, params)
78+
79+
with internal_tracer.start_active_span(self._module_name, child_of=parent_span) as scope:
80+
try:
81+
self._collect_kvs(scope.span, proc_name)
82+
83+
result = self.__wrapped__.callproc(proc_name, params)
84+
except Exception as e:
85+
if scope.span:
86+
scope.span.log_exception(e)
87+
raise
88+
else:
89+
return result
10290

10391

10492
class ConnectionWrapper(wrapt.ObjectProxy):

instana/instrumentation/sudsjurko.py

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import opentracing.ext.tags as ext
77
import wrapt
88

9-
from ..tracer import internal_tracer
109
from ..log import logger
10+
from ..tracer import internal_tracer
1111

1212
try:
1313
import suds # noqa
@@ -19,32 +19,29 @@
1919

2020
@wrapt.patch_function_wrapper('suds.client', class_method)
2121
def send_with_instana(wrapped, instance, args, kwargs):
22-
context = internal_tracer.current_context()
22+
parent_span = internal_tracer.active_span
2323

2424
# If we're not tracing, just return
25-
if context is None:
25+
if parent_span is None:
2626
return wrapped(*args, **kwargs)
2727

28-
try:
29-
span = internal_tracer.start_span("soap", child_of=context)
30-
span.set_tag('soap.action', instance.method.name)
31-
span.set_tag(ext.HTTP_URL, instance.method.location)
32-
span.set_tag(ext.HTTP_METHOD, 'POST')
33-
34-
internal_tracer.inject(span.context, opentracing.Format.HTTP_HEADERS,
35-
instance.options.headers)
36-
37-
rv = wrapped(*args, **kwargs)
38-
39-
except Exception as e:
40-
span.log_exception(e)
41-
span.set_tag(ext.HTTP_STATUS_CODE, 500)
42-
raise
43-
else:
44-
span.set_tag(ext.HTTP_STATUS_CODE, 200)
45-
return rv
46-
finally:
47-
span.finish()
28+
with internal_tracer.start_active_span("soap", child_of=parent_span) as scope:
29+
try:
30+
scope.span.set_tag('soap.action', instance.method.name)
31+
scope.span.set_tag(ext.HTTP_URL, instance.method.location)
32+
scope.span.set_tag(ext.HTTP_METHOD, 'POST')
33+
34+
internal_tracer.inject(scope.span.context, opentracing.Format.HTTP_HEADERS, instance.options.headers)
35+
36+
rv = wrapped(*args, **kwargs)
37+
38+
except Exception as e:
39+
scope.span.log_exception(e)
40+
scope.span.set_tag(ext.HTTP_STATUS_CODE, 500)
41+
raise
42+
else:
43+
scope.span.set_tag(ext.HTTP_STATUS_CODE, 200)
44+
return rv
4845

4946
logger.debug("Instrumenting suds-jurko")
5047
except ImportError:

instana/instrumentation/urllib3.py

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
from __future__ import absolute_import
22

3+
import instana
34
import opentracing
45
import opentracing.ext.tags as ext
56
import wrapt
67

7-
from ..tracer import internal_tracer
88
from ..log import logger
9+
from ..tracer import internal_tracer
910

1011
try:
1112
import urllib3 # noqa
@@ -37,40 +38,36 @@ def collect(instance, args, kwargs):
3738

3839
@wrapt.patch_function_wrapper('urllib3', 'HTTPConnectionPool.urlopen')
3940
def urlopen_with_instana(wrapped, instance, args, kwargs):
40-
context = internal_tracer.current_context()
41+
parent_span = internal_tracer.active_span
4142

4243
# If we're not tracing, just return
43-
if context is None:
44+
if parent_span is None:
4445
return wrapped(*args, **kwargs)
4546

46-
try:
47-
span = internal_tracer.start_span("urllib3", child_of=context)
48-
49-
kvs = collect(instance, args, kwargs)
50-
if 'url' in kvs:
51-
span.set_tag(ext.HTTP_URL, kvs['url'])
52-
if 'method' in kvs:
53-
span.set_tag(ext.HTTP_METHOD, kvs['method'])
47+
with internal_tracer.start_active_span("urllib3", child_of=parent_span) as scope:
48+
try:
49+
kvs = collect(instance, args, kwargs)
50+
if 'url' in kvs:
51+
scope.span.set_tag(ext.HTTP_URL, kvs['url'])
52+
if 'method' in kvs:
53+
scope.span.set_tag(ext.HTTP_METHOD, kvs['method'])
5454

55-
internal_tracer.inject(span.context, opentracing.Format.HTTP_HEADERS, kwargs["headers"])
56-
rv = wrapped(*args, **kwargs)
55+
internal_tracer.inject(scope.span.context, opentracing.Format.HTTP_HEADERS, kwargs["headers"])
56+
rv = wrapped(*args, **kwargs)
5757

58-
span.set_tag(ext.HTTP_STATUS_CODE, rv.status)
59-
if 500 <= rv.status <= 599:
60-
span.set_tag("error", True)
61-
ec = span.tags.get('ec', 0)
62-
span.set_tag("ec", ec+1)
58+
scope.span.set_tag(ext.HTTP_STATUS_CODE, rv.status)
59+
if 500 <= rv.status <= 599:
60+
scope.span.set_tag("error", True)
61+
ec = scope.span.tags.get('ec', 0)
62+
scope.span.set_tag("ec", ec+1)
6363

64-
except Exception as e:
65-
span.log_kv({'message': e})
66-
span.set_tag("error", True)
67-
ec = span.tags.get('ec', 0)
68-
span.set_tag("ec", ec+1)
69-
span.finish()
70-
raise
71-
else:
72-
span.finish()
73-
return rv
64+
return rv
65+
except Exception as e:
66+
scope.span.log_kv({'message': e})
67+
scope.span.set_tag("error", True)
68+
ec = scope.span.tags.get('ec', 0)
69+
scope.span.set_tag("ec", ec+1)
70+
raise
7471

7572
logger.debug("Instrumenting urllib3")
7673
except ImportError:

instana/span.py

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

55
class InstanaSpan(BasicSpan):
66
def finish(self, finish_time=None):
7-
if self.parent_id is None:
8-
self.tracer.cur_ctx = None
9-
else:
10-
# Set tracer context to the parent span
11-
pctx = SpanContext(span_id=self.parent_id,
12-
trace_id=self.context.trace_id,
13-
baggage={},
14-
sampled=True)
15-
self.tracer.cur_ctx = pctx
167
super(InstanaSpan, self).finish(finish_time)
178

189
def log_exception(self, e):

0 commit comments

Comments
 (0)