Skip to content

Commit c68595b

Browse files
committed
feat: Add opt-in exit spans
Signed-off-by: Ferenc Géczi <[email protected]>
1 parent 362f1f4 commit c68595b

24 files changed

+495
-88
lines changed

instana/instrumentation/cassandra_inst.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"""
99
import wrapt
1010
from ..log import logger
11-
from ..util.traceutils import get_active_tracer
11+
from ..util.traceutils import get_tracer_tuple, tracing_is_off
1212

1313
try:
1414
import cassandra
@@ -51,9 +51,9 @@ def cb_request_error(results, span, fn):
5151

5252

5353
def request_init_with_instana(fn):
54-
active_tracer = get_active_tracer()
54+
tracer, parent_span, _ = get_tracer_tuple()
5555

56-
if active_tracer is None:
56+
if tracing_is_off():
5757
return
5858

5959
ctags = {}
@@ -65,8 +65,8 @@ def request_init_with_instana(fn):
6565
ctags["cassandra.keyspace"] = fn.session.keyspace
6666
ctags["cassandra.cluster"] = fn.session.cluster.metadata.cluster_name
6767

68-
with active_tracer.start_active_span("cassandra", child_of=active_tracer.active_span,
69-
tags=ctags, finish_on_close=False) as scope:
68+
with tracer.start_active_span("cassandra", child_of=parent_span,
69+
tags=ctags, finish_on_close=False) as scope:
7070
fn.add_callback(cb_request_finish, scope.span, fn)
7171
fn.add_errback(cb_request_error, scope.span, fn)
7272

instana/instrumentation/couchbase_inst.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import wrapt
1010

1111
from ..log import logger
12-
from ..util.traceutils import get_active_tracer
12+
from ..util.traceutils import get_tracer_tuple, tracing_is_off
1313

1414
try:
1515
import couchbase
@@ -53,13 +53,13 @@ def capture_kvs(scope, instance, query_arg, op):
5353

5454
def make_wrapper(op):
5555
def wrapper(wrapped, instance, args, kwargs):
56-
active_tracer = get_active_tracer()
56+
tracer, parent_span, _ = get_tracer_tuple()
5757

5858
# If we're not tracing, just return
59-
if active_tracer is None:
59+
if tracing_is_off():
6060
return wrapped(*args, **kwargs)
6161

62-
with active_tracer.start_active_span("couchbase", child_of=active_tracer.active_span) as scope:
62+
with tracer.start_active_span("couchbase", child_of=parent_span) as scope:
6363
capture_kvs(scope, instance, None, op)
6464
try:
6565
return wrapped(*args, **kwargs)
@@ -70,13 +70,13 @@ def wrapper(wrapped, instance, args, kwargs):
7070
return wrapper
7171

7272
def query_with_instana(wrapped, instance, args, kwargs):
73-
active_tracer = get_active_tracer()
73+
tracer, parent_span, _ = get_tracer_tuple()
7474

7575
# If we're not tracing, just return
76-
if active_tracer is None:
76+
if tracing_is_off():
7777
return wrapped(*args, **kwargs)
7878

79-
with active_tracer.start_active_span("couchbase", child_of=active_tracer.active_span) as scope:
79+
with tracer.start_active_span("couchbase", child_of=parent_span) as scope:
8080
capture_kvs(scope, instance, args[0], 'n1ql_query')
8181
try:
8282
return wrapped(*args, **kwargs)

instana/instrumentation/google/cloud/pubsub.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
from ....log import logger
1010
from ....singletons import tracer
11+
from ....util.traceutils import get_tracer_tuple, tracing_is_off
1112

1213
try:
1314
from google.cloud import pubsub_v1
@@ -36,13 +37,12 @@ def publish_with_instana(wrapped, instance, args, kwargs):
3637
"""References:
3738
- PublisherClient.publish(topic_path, messages, metadata)
3839
"""
39-
# check if active
40-
parent_span = tracer.active_span
41-
4240
# return early if we're not tracing
43-
if parent_span is None:
41+
if tracing_is_off():
4442
return wrapped(*args, **kwargs)
4543

44+
tracer, parent_span, _ = get_tracer_tuple()
45+
4646
with tracer.start_active_span('gcps-producer', child_of=parent_span) as scope:
4747
# trace continuity, inject to the span context
4848
headers = dict()

instana/instrumentation/google/cloud/storage.py

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import re
77

88
from ....log import logger
9-
from ....singletons import tracer
109
from .collectors import _storage_api
10+
from ....util.traceutils import get_tracer_tuple, tracing_is_off
1111

1212
try:
1313
from google.cloud import storage
@@ -50,15 +50,11 @@ def _collect_tags(api_request):
5050

5151
def execute_with_instana(wrapped, instance, args, kwargs):
5252
# batch requests are traced with finish_batch_with_instana()
53-
if isinstance(instance, storage.Batch):
54-
return wrapped(*args, **kwargs)
55-
56-
parent_span = tracer.active_span
57-
58-
# return early if we're not tracing
59-
if parent_span is None:
53+
# also return early if we're not tracing
54+
if isinstance(instance, storage.Batch) or tracing_is_off():
6055
return wrapped(*args, **kwargs)
6156

57+
tracer, parent_span, _ = get_tracer_tuple()
6258
tags = _collect_tags(kwargs)
6359

6460
# don't trace if the call is not instrumented
@@ -79,12 +75,12 @@ def execute_with_instana(wrapped, instance, args, kwargs):
7975
return kv
8076

8177
def download_with_instana(wrapped, instance, args, kwargs):
82-
parent_span = tracer.active_span
83-
8478
# return early if we're not tracing
85-
if parent_span is None:
79+
if tracing_is_off():
8680
return wrapped(*args, **kwargs)
8781

82+
tracer, parent_span, _ = get_tracer_tuple()
83+
8884
with tracer.start_active_span('gcs', child_of=parent_span) as scope:
8985
scope.span.set_tag('gcs.op', 'objects.get')
9086
scope.span.set_tag('gcs.bucket', instance.bucket.name)
@@ -110,12 +106,12 @@ def download_with_instana(wrapped, instance, args, kwargs):
110106
return kv
111107

112108
def upload_with_instana(wrapped, instance, args, kwargs):
113-
parent_span = tracer.active_span
114-
115109
# return early if we're not tracing
116-
if parent_span is None:
110+
if tracing_is_off():
117111
return wrapped(*args, **kwargs)
118112

113+
tracer, parent_span, _ = get_tracer_tuple()
114+
119115
with tracer.start_active_span('gcs', child_of=parent_span) as scope:
120116
scope.span.set_tag('gcs.op', 'objects.insert')
121117
scope.span.set_tag('gcs.bucket', instance.bucket.name)
@@ -130,12 +126,12 @@ def upload_with_instana(wrapped, instance, args, kwargs):
130126
return kv
131127

132128
def finish_batch_with_instana(wrapped, instance, args, kwargs):
133-
parent_span = tracer.active_span
134-
135129
# return early if we're not tracing
136-
if parent_span is None:
130+
if tracing_is_off():
137131
return wrapped(*args, **kwargs)
138132

133+
tracer, parent_span, _ = get_tracer_tuple()
134+
139135
with tracer.start_active_span('gcs', child_of=parent_span) as scope:
140136
scope.span.set_tag('gcs.op', 'batch')
141137
scope.span.set_tag('gcs.projectId', instance._client.project)

instana/instrumentation/pep0249.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import wrapt
77

88
from ..log import logger
9-
from ..util.traceutils import get_active_tracer
9+
from ..util.traceutils import get_tracer_tuple, tracing_is_off
1010
from ..util.sql import sql_sanitizer
1111

1212

@@ -40,13 +40,13 @@ def __enter__(self):
4040
return self
4141

4242
def execute(self, sql, params=None):
43-
active_tracer = get_active_tracer()
43+
tracer, parent_span, operation_name = get_tracer_tuple()
4444

4545
# If not tracing or we're being called from sqlalchemy, just pass through
46-
if (active_tracer is None) or (active_tracer.active_span.operation_name == "sqlalchemy"):
46+
if (tracing_is_off() or (operation_name == "sqlalchemy")):
4747
return self.__wrapped__.execute(sql, params)
4848

49-
with active_tracer.start_active_span(self._module_name, child_of=active_tracer.active_span) as scope:
49+
with tracer.start_active_span(self._module_name, child_of=parent_span) as scope:
5050
try:
5151
self._collect_kvs(scope.span, sql)
5252

@@ -59,13 +59,13 @@ def execute(self, sql, params=None):
5959
return result
6060

6161
def executemany(self, sql, seq_of_parameters):
62-
active_tracer = get_active_tracer()
62+
tracer, parent_span, operation_name = get_tracer_tuple()
6363

6464
# If not tracing or we're being called from sqlalchemy, just pass through
65-
if (active_tracer is None) or (active_tracer.active_span.operation_name == "sqlalchemy"):
65+
if (tracing_is_off() or (operation_name == "sqlalchemy")):
6666
return self.__wrapped__.executemany(sql, seq_of_parameters)
6767

68-
with active_tracer.start_active_span(self._module_name, child_of=active_tracer.active_span) as scope:
68+
with tracer.start_active_span(self._module_name, child_of=parent_span) as scope:
6969
try:
7070
self._collect_kvs(scope.span, sql)
7171

@@ -78,13 +78,13 @@ def executemany(self, sql, seq_of_parameters):
7878
return result
7979

8080
def callproc(self, proc_name, params):
81-
active_tracer = get_active_tracer()
81+
tracer, parent_span, operation_name = get_tracer_tuple()
8282

8383
# If not tracing or we're being called from sqlalchemy, just pass through
84-
if (active_tracer is None) or (active_tracer.active_span.operation_name == "sqlalchemy"):
84+
if (tracing_is_off() or (operation_name == "sqlalchemy")):
8585
return self.__wrapped__.execute(proc_name, params)
8686

87-
with active_tracer.start_active_span(self._module_name, child_of=active_tracer.active_span) as scope:
87+
with tracer.start_active_span(self._module_name, child_of=parent_span) as scope:
8888
try:
8989
self._collect_kvs(scope.span, proc_name)
9090

instana/instrumentation/pika.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
from ..log import logger
1212
from ..singletons import tracer
13-
from ..util.traceutils import get_active_tracer
13+
from ..util.traceutils import get_tracer_tuple, tracing_is_off
1414

1515
try:
1616
import pika
@@ -40,14 +40,14 @@ def basic_publish_with_instana(wrapped, instance, args, kwargs):
4040
def _bind_args(exchange, routing_key, body, properties=None, *args, **kwargs):
4141
return (exchange, routing_key, body, properties, args, kwargs)
4242

43-
active_tracer = get_active_tracer()
43+
tracer, parent_span, _ = get_tracer_tuple()
4444

45-
if active_tracer is None:
45+
if tracing_is_off():
4646
return wrapped(*args, **kwargs)
4747

4848
(exchange, routing_key, body, properties, args, kwargs) = (_bind_args(*args, **kwargs))
4949

50-
with tracer.start_active_span("rabbitmq", child_of=active_tracer.active_span) as scope:
50+
with tracer.start_active_span("rabbitmq", child_of=parent_span) as scope:
5151
try:
5252
_extract_publisher_tags(scope.span,
5353
conn=instance.connection,

instana/instrumentation/pymongo.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44

55
from ..log import logger
6-
from ..util.traceutils import get_active_tracer
6+
from ..util.traceutils import get_tracer_tuple, tracing_is_off
77

88
try:
99
import pymongo
@@ -16,12 +16,12 @@ def __init__(self):
1616
self.__active_commands = {}
1717

1818
def started(self, event):
19-
active_tracer = get_active_tracer()
19+
tracer, parent_span, _ = get_tracer_tuple()
2020
# return early if we're not tracing
21-
if active_tracer is None:
21+
if tracing_is_off():
2222
return
2323

24-
with active_tracer.start_active_span("mongo", child_of=active_tracer.active_span) as scope:
24+
with tracer.start_active_span("mongo", child_of=parent_span) as scope:
2525
self._collect_connection_tags(scope.span, event)
2626
self._collect_command_tags(scope.span, event)
2727

instana/instrumentation/redis.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import wrapt
66

77
from ..log import logger
8-
from ..util.traceutils import get_active_tracer
8+
from ..util.traceutils import get_tracer_tuple, tracing_is_off
99

1010

1111
try:
@@ -36,13 +36,13 @@ def collect_tags(span, instance, args, kwargs):
3636

3737

3838
def execute_command_with_instana(wrapped, instance, args, kwargs):
39-
active_tracer = get_active_tracer()
39+
tracer, parent_span, operation_name = get_tracer_tuple()
4040

4141
# If we're not tracing, just return
42-
if active_tracer is None or active_tracer.active_span.operation_name in EXCLUDED_PARENT_SPANS:
42+
if (tracing_is_off() or (operation_name in EXCLUDED_PARENT_SPANS)):
4343
return wrapped(*args, **kwargs)
4444

45-
with active_tracer.start_active_span("redis", child_of=active_tracer.active_span) as scope:
45+
with tracer.start_active_span("redis", child_of=parent_span) as scope:
4646
try:
4747
collect_tags(scope.span, instance, args, kwargs)
4848
if (len(args) > 0):
@@ -57,13 +57,13 @@ def execute_command_with_instana(wrapped, instance, args, kwargs):
5757

5858

5959
def execute_with_instana(wrapped, instance, args, kwargs):
60-
active_tracer = get_active_tracer()
60+
tracer, parent_span, operation_name = get_tracer_tuple()
6161

6262
# If we're not tracing, just return
63-
if active_tracer is None or active_tracer.active_span.operation_name in EXCLUDED_PARENT_SPANS:
63+
if (tracing_is_off() or (operation_name in EXCLUDED_PARENT_SPANS)):
6464
return wrapped(*args, **kwargs)
6565

66-
with active_tracer.start_active_span("redis", child_of=active_tracer.active_span) as scope:
66+
with tracer.start_active_span("redis", child_of=parent_span) as scope:
6767
try:
6868
collect_tags(scope.span, instance, args, kwargs)
6969
scope.span.set_tag("command", 'PIPELINE')

instana/instrumentation/sqlalchemy.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from operator import attrgetter
77

88
from ..log import logger
9-
from ..util.traceutils import get_active_tracer
9+
from ..util.traceutils import get_tracer_tuple, tracing_is_off
1010

1111
try:
1212
import sqlalchemy
@@ -19,13 +19,12 @@
1919
@event.listens_for(Engine, 'before_cursor_execute', named=True)
2020
def receive_before_cursor_execute(**kw):
2121
try:
22-
active_tracer = get_active_tracer()
23-
2422
# If we're not tracing, just return
25-
if active_tracer is None:
23+
if tracing_is_off():
2624
return
2725

28-
scope = active_tracer.start_active_span("sqlalchemy", child_of=active_tracer.active_span)
26+
tracer, parent_span, _ = get_tracer_tuple()
27+
scope = tracer.start_active_span("sqlalchemy", child_of=parent_span)
2928
context = kw['context']
3029
if context:
3130
context._stan_scope = scope
@@ -72,7 +71,7 @@ def _set_error_tags(context, exception_string, scope_string):
7271
@event.listens_for(Engine, error_event, named=True)
7372
def receive_handle_db_error(**kw):
7473

75-
if get_active_tracer() is None:
74+
if tracing_is_off():
7675
return
7776

7877
# support older db error event

0 commit comments

Comments
 (0)