Skip to content

Commit 0316c1f

Browse files
toumorokoshialrexhectorhdzglzchenocelotl
committed
api: adding trace.get_current_span (open-telemetry#552)
The span context is no longer coupled with the tracer itself. As such, providing a get_current_span method bound to the trace api module rather than a specific tracer is semantically correct, and removes a hurdle where someone who wants to retrieve the current trace would have to create a tracer to do so. renaming and exporting get_span_in_context to get_current_span, as the intention of the API is similar, and reduces unneeded aliasing and duplication. set_span_in_context is not renamed, as set_current_span would have implied that the span would then be active in the default context, which is only true after attaching the resulting context returned by set_span_in_context. Keeping that name at least implies some asymmetric behavior from get_current_span. After discussion in the SIG, we decided to remove the legacy get_current_span APIs from Tracer and TracerProvider to reduce long-term confusion of how to idiomatically retrieve the span. Co-authored-by: alrex <[email protected]> Co-authored-by: Hector Hernandez <[email protected]> Co-authored-by: Leighton Chen <[email protected]> Co-authored-by: Diego Hurtado <[email protected]> Co-authored-by: Mauricio Vásquez <[email protected]> Co-authored-by: Andrew Xue <[email protected]> Co-authored-by: Cheng-Lung Sung <[email protected]>
1 parent a514d21 commit 0316c1f

File tree

24 files changed

+522
-448
lines changed

24 files changed

+522
-448
lines changed

docs/api/trace.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ Submodules
88

99
trace.sampling
1010
trace.status
11+
trace.span
1112

1213
Module contents
1314
---------------
1415

15-
.. automodule:: opentelemetry.trace
16+
.. automodule:: opentelemetry.trace

docs/api/trace.span.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
opentelemetry.trace.span
2+
========================
3+
4+
.. automodule:: opentelemetry.trace.span
5+
:members:
6+
:undoc-members:
7+
:show-inheritance:

ext/opentelemetry-ext-aiohttp-client/src/opentelemetry/ext/aiohttp_client/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ async def on_request_start(
145145
)
146146

147147
trace_config_ctx.token = context_api.attach(
148-
trace.propagation.set_span_in_context(trace_config_ctx.span)
148+
trace.set_span_in_context(trace_config_ctx.span)
149149
)
150150

151151
propagators.inject(type(params.headers).__setitem__, params.headers)

ext/opentelemetry-ext-datadog/src/opentelemetry/ext/datadog/propagator.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@
1616

1717
from opentelemetry import trace
1818
from opentelemetry.context import Context
19-
from opentelemetry.trace.propagation import (
20-
get_span_from_context,
21-
set_span_in_context,
22-
)
19+
from opentelemetry.trace import get_current_span, set_span_in_context
2320
from opentelemetry.trace.propagation.httptextformat import (
2421
Getter,
2522
HTTPTextFormat,
@@ -88,7 +85,7 @@ def inject(
8885
carrier: HTTPTextFormatT,
8986
context: typing.Optional[Context] = None,
9087
) -> None:
91-
span = get_span_from_context(context=context)
88+
span = get_current_span(context)
9289
sampled = (trace.TraceFlags.SAMPLED & span.context.trace_flags) != 0
9390
set_in_carrier(
9491
carrier, self.TRACE_ID_KEY, format_trace_id(span.context.trace_id),

ext/opentelemetry-ext-datadog/tests/test_datadog_format.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,7 @@
1717
from opentelemetry import trace as trace_api
1818
from opentelemetry.ext.datadog import constants, propagator
1919
from opentelemetry.sdk import trace
20-
from opentelemetry.trace.propagation import (
21-
get_span_from_context,
22-
set_span_in_context,
23-
)
20+
from opentelemetry.trace import get_current_span, set_span_in_context
2421

2522
FORMAT = propagator.DatadogFormat()
2623

@@ -45,7 +42,7 @@ def test_malformed_headers(self):
4542
"""Test with no Datadog headers"""
4643
malformed_trace_id_key = FORMAT.TRACE_ID_KEY + "-x"
4744
malformed_parent_id_key = FORMAT.PARENT_ID_KEY + "-x"
48-
context = get_span_from_context(
45+
context = get_current_span(
4946
FORMAT.extract(
5047
get_as_list,
5148
{
@@ -66,7 +63,7 @@ def test_missing_trace_id(self):
6663
}
6764

6865
ctx = FORMAT.extract(get_as_list, carrier)
69-
span_context = get_span_from_context(ctx).get_context()
66+
span_context = get_current_span(ctx).get_context()
7067
self.assertEqual(span_context.trace_id, trace_api.INVALID_TRACE_ID)
7168

7269
def test_missing_parent_id(self):
@@ -76,12 +73,12 @@ def test_missing_parent_id(self):
7673
}
7774

7875
ctx = FORMAT.extract(get_as_list, carrier)
79-
span_context = get_span_from_context(ctx).get_context()
76+
span_context = get_current_span(ctx).get_context()
8077
self.assertEqual(span_context.span_id, trace_api.INVALID_SPAN_ID)
8178

8279
def test_context_propagation(self):
8380
"""Test the propagation of Datadog headers."""
84-
parent_context = get_span_from_context(
81+
parent_context = get_current_span(
8582
FORMAT.extract(
8683
get_as_list,
8784
{
@@ -138,7 +135,7 @@ def test_context_propagation(self):
138135

139136
def test_sampling_priority_auto_reject(self):
140137
"""Test sampling priority rejected."""
141-
parent_context = get_span_from_context(
138+
parent_context = get_current_span(
142139
FORMAT.extract(
143140
get_as_list,
144141
{

ext/opentelemetry-ext-grpc/tests/test_server_interceptor.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,13 @@ def test_span_lifetime(self):
9191
"""Check that the span is active for the duration of the call."""
9292

9393
interceptor = server_interceptor()
94-
tracer = self.tracer_provider.get_tracer(__name__)
9594

9695
# To capture the current span at the time the handler is called
9796
active_span_in_handler = None
9897

9998
def handler(request, context):
10099
nonlocal active_span_in_handler
101-
# The current span is shared among all the tracers.
102-
active_span_in_handler = tracer.get_current_span()
100+
active_span_in_handler = trace.get_current_span()
103101
return b""
104102

105103
server = grpc.server(
@@ -112,13 +110,13 @@ def handler(request, context):
112110
port = server.add_insecure_port("[::]:0")
113111
channel = grpc.insecure_channel("localhost:{:d}".format(port))
114112

115-
active_span_before_call = tracer.get_current_span()
113+
active_span_before_call = trace.get_current_span()
116114
try:
117115
server.start()
118116
channel.unary_unary("")(b"")
119117
finally:
120118
server.stop(None)
121-
active_span_after_call = tracer.get_current_span()
119+
active_span_after_call = trace.get_current_span()
122120

123121
self.assertIsNone(active_span_before_call)
124122
self.assertIsNone(active_span_after_call)
@@ -128,15 +126,13 @@ def handler(request, context):
128126
def test_sequential_server_spans(self):
129127
"""Check that sequential RPCs get separate server spans."""
130128

131-
tracer = self.tracer_provider.get_tracer(__name__)
132-
133129
interceptor = server_interceptor()
134130

135131
# Capture the currently active span in each thread
136132
active_spans_in_handler = []
137133

138134
def handler(request, context):
139-
active_spans_in_handler.append(tracer.get_current_span())
135+
active_spans_in_handler.append(trace.get_current_span())
140136
return b""
141137

142138
server = grpc.server(
@@ -175,8 +171,6 @@ def test_concurrent_server_spans(self):
175171
context.
176172
"""
177173

178-
tracer = self.tracer_provider.get_tracer(__name__)
179-
180174
interceptor = server_interceptor()
181175

182176
# Capture the currently active span in each thread
@@ -185,7 +179,7 @@ def test_concurrent_server_spans(self):
185179

186180
def handler(request, context):
187181
latch()
188-
active_spans_in_handler.append(tracer.get_current_span())
182+
active_spans_in_handler.append(trace.get_current_span())
189183
return b""
190184

191185
server = grpc.server(

ext/opentelemetry-ext-opentracing-shim/src/opentelemetry/ext/opentracing_shim/__init__.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,7 @@
9494
from opentelemetry import propagators
9595
from opentelemetry.ext.opentracing_shim import util
9696
from opentelemetry.ext.opentracing_shim.version import __version__
97-
from opentelemetry.trace import DefaultSpan
98-
from opentelemetry.trace.propagation import (
99-
get_span_from_context,
100-
set_span_in_context,
101-
)
97+
from opentelemetry.trace import DefaultSpan, set_span_in_context
10298

10399
logger = logging.getLogger(__name__)
104100

@@ -473,7 +469,7 @@ def active(self):
473469
shim and is likely to be handled in future versions.
474470
"""
475471

476-
span = self._tracer.unwrap().get_current_span()
472+
span = trace_api.get_current_span()
477473
if span is None:
478474
return None
479475

@@ -703,6 +699,10 @@ def get_as_list(dict_object, key):
703699

704700
propagator = propagators.get_global_httptextformat()
705701
ctx = propagator.extract(get_as_list, carrier)
706-
otel_context = get_span_from_context(ctx).get_context()
702+
span = trace_api.get_current_span(ctx)
703+
if span is not None:
704+
otel_context = span.get_context()
705+
else:
706+
otel_context = trace_api.INVALID_SPAN_CONTEXT
707707

708708
return SpanContextShim(otel_context)

ext/opentelemetry-ext-opentracing-shim/tests/test_shim.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@
2424
from opentelemetry import propagators, trace
2525
from opentelemetry.ext.opentracing_shim import util
2626
from opentelemetry.sdk.trace import TracerProvider
27-
from opentelemetry.test.mock_httptextformat import MockHTTPTextFormat
27+
from opentelemetry.test.mock_httptextformat import (
28+
MockHTTPTextFormat,
29+
NOOPHTTPTextFormat,
30+
)
2831

2932

3033
class TestShim(TestCase):
@@ -515,6 +518,20 @@ def test_extract_http_headers(self):
515518
self.assertEqual(ctx.unwrap().trace_id, 1220)
516519
self.assertEqual(ctx.unwrap().span_id, 7478)
517520

521+
def test_extract_empty_context_returns_invalid_context(self):
522+
"""In the case where the propagator cannot extract a
523+
SpanContext, extract should return and invalid span context.
524+
"""
525+
_old_propagator = propagators.get_global_httptextformat()
526+
propagators.set_global_httptextformat(NOOPHTTPTextFormat())
527+
try:
528+
carrier = {}
529+
530+
ctx = self.shim.extract(opentracing.Format.HTTP_HEADERS, carrier)
531+
self.assertEqual(ctx.unwrap(), trace.INVALID_SPAN_CONTEXT)
532+
finally:
533+
propagators.set_global_httptextformat(_old_propagator)
534+
518535
def test_extract_text_map(self):
519536
"""Test `extract()` method for Format.TEXT_MAP."""
520537

ext/opentelemetry-ext-wsgi/src/opentelemetry/ext/wsgi/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ def hello():
6262
from opentelemetry import context, propagators, trace
6363
from opentelemetry.ext.wsgi.version import __version__
6464
from opentelemetry.instrumentation.utils import http_status_to_canonical_code
65-
from opentelemetry.trace.propagation import get_span_from_context
6665
from opentelemetry.trace.status import Status, StatusCanonicalCode
6766

6867
_HTTP_VERSION_PREFIX = "HTTP/"

opentelemetry-api/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
([#751](https://github.com/open-telemetry/opentelemetry-python/pull/751))
77
- Rename Measure to ValueRecorder in metrics
88
([#761](https://github.com/open-telemetry/opentelemetry-python/pull/761))
9+
- Adding trace.get_current_span, Removing Tracer.get_current_span
10+
([#552](https://github.com/open-telemetry/opentelemetry-python/pull/552))
911
- Rename Observer to ValueObserver
1012
([#764](https://github.com/open-telemetry/opentelemetry-python/pull/764))
1113

0 commit comments

Comments
 (0)