Skip to content

Commit 74c67f6

Browse files
authored
Supporting the emerging standard TRACEPARENT variable. (#21)
open-telemetry/opentelemetry-specification#740 Closes #20
1 parent b2f3f09 commit 74c67f6

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

src/pytest_opentelemetry/instrumentation.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,10 @@ def session_name(self, name):
4242
@classmethod
4343
def get_trace_parent(cls, config: Config) -> Optional[Context]:
4444
if trace_parent := config.getvalue('--trace-parent'):
45-
from_arguments = {'traceparent': trace_parent}
46-
return propagate.extract(from_arguments)
45+
return propagate.extract({'traceparent': trace_parent})
46+
47+
if trace_parent := os.environ.get('TRACEPARENT'):
48+
return propagate.extract({'traceparent': trace_parent})
4749

4850
return None
4951

tests/test_sessions.py

+56
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import os
2+
from contextlib import contextmanager
3+
from typing import Dict, Generator, Optional
4+
15
from _pytest.pytester import Pytester
26
from opentelemetry import trace
37

@@ -9,6 +13,40 @@
913
from . import SpanRecorder
1014

1115

16+
@contextmanager
17+
def environment(**overrides: Optional[str]) -> Generator[None, None, None]:
18+
original: Dict[str, Optional[str]] = {}
19+
for key, value in overrides.items():
20+
original[key] = os.environ.pop(key, None)
21+
if value is not None:
22+
os.environ[key] = value
23+
24+
try:
25+
yield
26+
finally:
27+
for key, value in original.items():
28+
if value is None:
29+
os.environ.pop(key, None)
30+
else:
31+
os.environ[key] = value
32+
33+
34+
def test_environment_manipulation():
35+
assert 'VALUE' not in os.environ
36+
with environment(VALUE='outer'):
37+
assert os.environ['VALUE'] == 'outer'
38+
with environment(VALUE='inner'):
39+
assert os.environ['VALUE'] == 'inner'
40+
with environment(VALUE=None):
41+
assert 'VALUE' not in os.environ
42+
with environment(VALUE='once more'):
43+
assert os.environ['VALUE'] == 'once more'
44+
assert 'VALUE' not in os.environ
45+
assert os.environ['VALUE'] == 'inner'
46+
assert os.environ['VALUE'] == 'outer'
47+
assert 'VALUE' not in os.environ
48+
49+
1250
def test_getting_no_trace_id(pytester: Pytester) -> None:
1351
config = pytester.parseconfig()
1452
context = OpenTelemetryPlugin.get_trace_parent(config)
@@ -31,6 +69,24 @@ def test_getting_trace_id_from_command_line(pytester: Pytester) -> None:
3169
assert parent.span_id == 0xFEDCBA0987654321
3270

3371

72+
def test_getting_trace_id_from_environment_variable(pytester: Pytester) -> None:
73+
config = pytester.parseconfig()
74+
75+
with environment(
76+
TRACEPARENT='00-1234567890abcdef1234567890abcdef-fedcba0987654321-01'
77+
):
78+
context = OpenTelemetryPlugin.get_trace_parent(config)
79+
80+
assert context
81+
82+
parent_span = next(iter(context.values()))
83+
assert isinstance(parent_span, trace.Span)
84+
85+
parent = parent_span.get_span_context()
86+
assert parent.trace_id == 0x1234567890ABCDEF1234567890ABCDEF
87+
assert parent.span_id == 0xFEDCBA0987654321
88+
89+
3490
def test_getting_trace_id_from_worker_input(pytester: Pytester) -> None:
3591
config = pytester.parseconfig()
3692
setattr(

0 commit comments

Comments
 (0)