12
12
# See the License for the specific language governing permissions and
13
13
# limitations under the License.
14
14
15
+ import types
15
16
from logging import getLogger
16
17
from time import time
17
- import types
18
18
from typing import Callable
19
19
20
20
from django import VERSION as django_version
25
25
get_global_response_propagator ,
26
26
)
27
27
from opentelemetry .instrumentation .utils import extract_attributes_from_object
28
+ from opentelemetry .instrumentation .wsgi import add_response_attributes
28
29
from opentelemetry .instrumentation .wsgi import (
29
- add_response_attributes ,
30
30
collect_request_attributes as wsgi_collect_request_attributes ,
31
- wsgi_getter ,
32
31
)
32
+ from opentelemetry .instrumentation .wsgi import wsgi_getter
33
33
from opentelemetry .propagate import extract
34
34
from opentelemetry .semconv .trace import SpanAttributes
35
35
from opentelemetry .trace import Span , SpanKind , use_span
@@ -75,11 +75,11 @@ def __call__(self, request):
75
75
ASGIRequest = None
76
76
77
77
try :
78
+ from opentelemetry .instrumentation .asgi import asgi_getter
78
79
from opentelemetry .instrumentation .asgi import (
79
- asgi_getter ,
80
80
collect_request_attributes as asgi_collect_request_attributes ,
81
- set_status_code ,
82
81
)
82
+ from opentelemetry .instrumentation .asgi import set_status_code
83
83
84
84
_is_asgi_supported = True
85
85
except ImportError :
@@ -112,6 +112,10 @@ def __call__(self, request):
112
112
]
113
113
114
114
115
+ def _is_asgi_request (request : HttpRequest ) -> bool :
116
+ return bool (ASGIRequest and isinstance (request , ASGIRequest ))
117
+
118
+
115
119
class _DjangoMiddleware (MiddlewareMixin ):
116
120
"""Django Middleware for OpenTelemetry"""
117
121
@@ -153,9 +157,6 @@ def _get_span_name(request):
153
157
except Resolver404 :
154
158
return f"HTTP { request .method } "
155
159
156
- def _is_asgi_request (self , request ):
157
- return ASGIRequest and isinstance (request , ASGIRequest )
158
-
159
160
def process_request (self , request ):
160
161
# request.META is a dictionary containing all available HTTP headers
161
162
# Read more about request.META here:
@@ -164,7 +165,7 @@ def process_request(self, request):
164
165
if self ._excluded_urls .url_disabled (request .build_absolute_uri ("?" )):
165
166
return
166
167
167
- is_asgi_request = self . _is_asgi_request (request )
168
+ is_asgi_request = _is_asgi_request (request )
168
169
if is_asgi_request and not _is_asgi_supported :
169
170
return
170
171
@@ -202,13 +203,17 @@ def process_request(self, request):
202
203
# contents, for the extract_attributes_from_object function to be able to retrieve
203
204
# attributes from it.
204
205
attributes = extract_attributes_from_object (
205
- types .SimpleNamespace (** {
206
- ** request .__dict__ ,
206
+ types .SimpleNamespace (
207
207
** {
208
- name .decode ('latin1' ): value .decode ('latin1' )
209
- for name , value in request .scope .get ('headers' , [])
210
- },
211
- }),
208
+ ** request .__dict__ ,
209
+ ** {
210
+ name .decode ("latin1" ): value .decode ("latin1" )
211
+ for name , value in request .scope .get (
212
+ "headers" , []
213
+ )
214
+ },
215
+ }
216
+ ),
212
217
self ._traced_request_attrs ,
213
218
attributes ,
214
219
)
@@ -262,9 +267,9 @@ def process_response(self, request, response):
262
267
if self ._excluded_urls .url_disabled (request .build_absolute_uri ("?" )):
263
268
return response
264
269
265
- is_asgi_request = self . _is_asgi_request (request )
270
+ is_asgi_request = _is_asgi_request (request )
266
271
if is_asgi_request and not _is_asgi_supported :
267
- return
272
+ return response
268
273
269
274
activation = request .META .pop (self ._environ_activation_key , None )
270
275
span = request .META .pop (self ._environ_span_key , None )
0 commit comments