26
26
from opentelemetry .instrumentation .utils import extract_attributes_from_object
27
27
from opentelemetry .instrumentation .wsgi import (
28
28
add_response_attributes ,
29
- collect_request_attributes ,
29
+ collect_request_attributes as wsgi_collect_request_attributes ,
30
30
wsgi_getter ,
31
31
)
32
32
from opentelemetry .propagate import extract
47
47
except ImportError :
48
48
MiddlewareMixin = object
49
49
50
+ try :
51
+ from django .core .handlers .asgi import ASGIRequest
52
+ except ImportError :
53
+ ASGIRequest = None
54
+
55
+ try :
56
+ from opentelemetry .instrumentation .asgi import (
57
+ asgi_getter ,
58
+ collect_request_attributes as asgi_collect_request_attributes ,
59
+ set_status_code ,
60
+ )
61
+ _is_asgi_supported = True
62
+ except ImportError :
63
+ asgi_getter = None
64
+ asgi_collect_request_attributes = None
65
+ set_status_code = None
66
+ _is_asgi_supported = False
67
+
68
+
50
69
_logger = getLogger (__name__ )
51
70
_attributes_by_preference = [
52
71
[
@@ -111,6 +130,9 @@ def _get_span_name(request):
111
130
except Resolver404 :
112
131
return "HTTP {}" .format (request .method )
113
132
133
+ def _is_asgi_request (self , request ):
134
+ return ASGIRequest and isinstance (request , ASGIRequest )
135
+
114
136
def process_request (self , request ):
115
137
# request.META is a dictionary containing all available HTTP headers
116
138
# Read more about request.META here:
@@ -119,12 +141,23 @@ def process_request(self, request):
119
141
if self ._excluded_urls .url_disabled (request .build_absolute_uri ("?" )):
120
142
return
121
143
144
+ is_asgi_request = self ._is_asgi_request (request )
145
+ if is_asgi_request and not _is_asgi_supported :
146
+ return
147
+
122
148
# pylint:disable=W0212
123
149
request ._otel_start_time = time ()
124
150
125
151
request_meta = request .META
126
152
127
- token = attach (extract (request_meta , getter = wsgi_getter ))
153
+ if is_asgi_request :
154
+ carrier_getter = asgi_getter
155
+ collect_request_attributes = asgi_collect_request_attributes
156
+ else :
157
+ carrier_getter = wsgi_getter
158
+ collect_request_attributes = wsgi_collect_request_attributes
159
+
160
+ token = attach (extract (request_meta , getter = carrier_getter ))
128
161
129
162
span = self ._tracer .start_span (
130
163
self ._get_span_name (request ),
@@ -186,15 +219,22 @@ def process_response(self, request, response):
186
219
if self ._excluded_urls .url_disabled (request .build_absolute_uri ("?" )):
187
220
return response
188
221
222
+ is_asgi_request = self ._is_asgi_request (request )
223
+ if is_asgi_request and not _is_asgi_supported :
224
+ return
225
+
189
226
activation = request .META .pop (self ._environ_activation_key , None )
190
227
span = request .META .pop (self ._environ_span_key , None )
191
228
192
229
if activation and span :
193
- add_response_attributes (
194
- span ,
195
- "{} {}" .format (response .status_code , response .reason_phrase ),
196
- response ,
197
- )
230
+ if is_asgi_request :
231
+ set_status_code (request .META [self ._environ_span_key ], response .status_code )
232
+ else :
233
+ add_response_attributes (
234
+ span ,
235
+ "{} {}" .format (response .status_code , response .reason_phrase ),
236
+ response ,
237
+ )
198
238
199
239
propagator = get_global_response_propagator ()
200
240
if propagator :
@@ -217,7 +257,10 @@ def process_response(self, request, response):
217
257
activation .__exit__ (None , None , None )
218
258
219
259
if self ._environ_token in request .META .keys ():
220
- detach (request .environ .get (self ._environ_token ))
260
+ if is_asgi_request :
261
+ detach (request .META .get (self ._environ_token ))
262
+ else :
263
+ detach (request .environ .get (self ._environ_token ))
221
264
request .META .pop (self ._environ_token )
222
265
223
266
return response
0 commit comments