20
20
from pyramid .tweens import EXCVIEW
21
21
22
22
import opentelemetry .instrumentation .wsgi as otel_wsgi
23
- from opentelemetry import context , trace
23
+ from opentelemetry import context
24
24
from opentelemetry .instrumentation .propagators import (
25
25
get_global_response_propagator ,
26
26
)
27
27
from opentelemetry .instrumentation .pyramid .version import __version__
28
28
from opentelemetry .propagate import extract
29
29
from opentelemetry .semconv .trace import SpanAttributes
30
+ from opentelemetry .trace import (
31
+ INVALID_SPAN ,
32
+ SpanKind ,
33
+ get_current_span ,
34
+ get_tracer ,
35
+ use_span ,
36
+ )
30
37
from opentelemetry .util ._time import _time_ns
31
38
from opentelemetry .util .http import get_excluded_urls
32
39
@@ -82,19 +89,24 @@ def _before_traversal(event):
82
89
83
90
start_time = request_environ .get (_ENVIRON_STARTTIME_KEY )
84
91
85
- token = context .attach (
86
- extract (request_environ , getter = otel_wsgi .wsgi_getter )
87
- )
88
- tracer = trace .get_tracer (__name__ , __version__ )
92
+ token = ctx = None
93
+ span_kind = SpanKind .INTERNAL
94
+ tracer = get_tracer (__name__ , __version__ )
89
95
90
96
if request .matched_route :
91
97
span_name = request .matched_route .pattern
92
98
else :
93
99
span_name = otel_wsgi .get_default_span_name (request_environ )
94
100
101
+ if get_current_span () is INVALID_SPAN :
102
+ ctx = extract (request_environ , getter = otel_wsgi .wsgi_getter )
103
+ token = context .attach (ctx )
104
+ span_kind = SpanKind .SERVER
105
+
95
106
span = tracer .start_span (
96
107
span_name ,
97
- kind = trace .SpanKind .SERVER ,
108
+ ctx ,
109
+ kind = span_kind ,
98
110
start_time = start_time ,
99
111
)
100
112
@@ -107,11 +119,12 @@ def _before_traversal(event):
107
119
for key , value in attributes .items ():
108
120
span .set_attribute (key , value )
109
121
110
- activation = trace . use_span (span , end_on_exit = True )
122
+ activation = use_span (span , end_on_exit = True )
111
123
activation .__enter__ () # pylint: disable=E1101
112
124
request_environ [_ENVIRON_ACTIVATION_KEY ] = activation
113
125
request_environ [_ENVIRON_SPAN_KEY ] = span
114
- request_environ [_ENVIRON_TOKEN ] = token
126
+ if token :
127
+ request_environ [_ENVIRON_TOKEN ] = token
115
128
116
129
117
130
def trace_tween_factory (handler , registry ):
@@ -180,7 +193,8 @@ def trace_tween(request):
180
193
else :
181
194
activation .__exit__ (None , None , None )
182
195
183
- context .detach (request .environ .get (_ENVIRON_TOKEN ))
196
+ if request .environ .get (_ENVIRON_TOKEN , None ) is not None :
197
+ context .detach (request .environ .get (_ENVIRON_TOKEN ))
184
198
185
199
return response
186
200
0 commit comments