Skip to content

Commit f8af75b

Browse files
committed
Recreate span on every run of a decorated function
1 parent bd8db6e commit f8af75b

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

Diff for: CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3636
### Changed
3737
- `opentelemetry-exporter-zipkin` Updated zipkin exporter status code and error tag
3838
([#1486](https://github.com/open-telemetry/opentelemetry-python/pull/1486))
39+
- Recreate span on every run of a `start_as_current_span`-decorated function
40+
([#1451](https://github.com/open-telemetry/opentelemetry-python/pull/1451))
3941

4042
## [0.16b1](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.16b1) - 2020-11-26
4143
### Added

Diff for: opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,7 @@ def __init__(
742742
self.ids_generator = ids_generator
743743
self.instrumentation_info = instrumentation_info
744744

745+
@contextmanager
745746
def start_as_current_span(
746747
self,
747748
name: str,
@@ -763,7 +764,8 @@ def start_as_current_span(
763764
record_exception=record_exception,
764765
set_status_on_exception=set_status_on_exception,
765766
)
766-
return self.use_span(span, end_on_exit=True)
767+
with self.use_span(span, end_on_exit=True) as span_context:
768+
yield span_context
767769

768770
def start_span( # pylint: disable=too-many-locals
769771
self,

Diff for: opentelemetry-sdk/tests/trace/test_trace.py

+31
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,37 @@ def test_start_as_current_span_explicit(self):
414414
self.assertIs(trace_api.get_current_span(), root)
415415
self.assertIsNotNone(child.end_time)
416416

417+
def test_start_as_current_span_decorator(self):
418+
tracer = new_tracer()
419+
420+
self.assertEqual(trace_api.get_current_span(), trace_api.INVALID_SPAN)
421+
422+
@tracer.start_as_current_span("root")
423+
def func():
424+
root = trace_api.get_current_span()
425+
426+
with tracer.start_as_current_span("child") as child:
427+
self.assertIs(trace_api.get_current_span(), child)
428+
self.assertIs(child.parent, root.get_span_context())
429+
430+
# After exiting the child's scope the parent should become the
431+
# current span again.
432+
self.assertIs(trace_api.get_current_span(), root)
433+
self.assertIsNotNone(child.end_time)
434+
435+
return root
436+
437+
root1 = func()
438+
439+
self.assertEqual(trace_api.get_current_span(), trace_api.INVALID_SPAN)
440+
self.assertIsNotNone(root1.end_time)
441+
442+
# Second call must create a new span
443+
root2 = func()
444+
self.assertEqual(trace_api.get_current_span(), trace_api.INVALID_SPAN)
445+
self.assertIsNotNone(root2.end_time)
446+
self.assertIsNot(root1, root2)
447+
417448
def test_explicit_span_resource(self):
418449
resource = resources.Resource.create({})
419450
tracer_provider = trace.TracerProvider(resource=resource)

0 commit comments

Comments
 (0)