@@ -168,23 +168,23 @@ class _DjangoMiddleware(MiddlewareMixin):
168
168
)
169
169
170
170
@staticmethod
171
- def _get_span_name_and_route (request ):
172
- span_name = request .method
173
- route = None
171
+ def _get_span_name (request ):
174
172
try :
175
173
if getattr (request , "resolver_match" ):
176
174
match = request .resolver_match
177
175
else :
178
176
match = resolve (request .path )
179
177
180
- if route := getattr (match , "route" , None ):
181
- span_name += f" { route } "
182
- elif url_name := getattr (match , "url_name" , None ):
183
- span_name += f" { url_name } "
184
- except Resolver404 :
185
- pass
178
+ if hasattr (match , "route" ) and match .route :
179
+ return f"{ request .method } { match .route } "
180
+
181
+ if hasattr (match , "url_name" ) and match .url_name :
182
+ return f"{ request .method } { match .url_name } "
186
183
187
- return span_name , route
184
+ return request .method
185
+
186
+ except Resolver404 :
187
+ return request .method
188
188
189
189
# pylint: disable=too-many-locals
190
190
# pylint: disable=too-many-branches
@@ -214,12 +214,9 @@ def process_request(self, request):
214
214
collect_request_attributes = wsgi_collect_request_attributes
215
215
216
216
attributes = collect_request_attributes (carrier )
217
- span_name , route = self ._get_span_name_and_route (request )
218
- if route :
219
- attributes [SpanAttributes .HTTP_ROUTE ] = route
220
217
span , token = _start_internal_or_server_span (
221
218
tracer = self ._tracer ,
222
- span_name = span_name ,
219
+ span_name = self . _get_span_name ( request ) ,
223
220
start_time = request_meta .get (
224
221
"opentelemetry-instrumentor-django.starttime_key"
225
222
),
@@ -232,8 +229,6 @@ def process_request(self, request):
232
229
attributes
233
230
)
234
231
duration_attrs = _parse_duration_attrs (attributes )
235
- if route :
236
- duration_attrs [SpanAttributes .HTTP_TARGET ] = route
237
232
238
233
request .META [self ._environ_active_request_attr_key ] = (
239
234
active_requests_count_attrs
@@ -301,6 +296,30 @@ def process_request(self, request):
301
296
# would not be called. Log the exception instead.
302
297
_logger .exception ("Exception raised by request_hook" )
303
298
299
+ # pylint: disable=unused-argument
300
+ def process_view (self , request , view_func , * args , ** kwargs ):
301
+ # Process view is executed before the view function, here we get the
302
+ # route template from request.resolver_match. It is not set yet in process_request
303
+ if self ._excluded_urls .url_disabled (request .build_absolute_uri ("?" )):
304
+ return
305
+
306
+ if (
307
+ self ._environ_activation_key in request .META .keys ()
308
+ and self ._environ_span_key in request .META .keys ()
309
+ ):
310
+ span = request .META [self ._environ_span_key ]
311
+
312
+ if span .is_recording ():
313
+ match = getattr (request , "resolver_match" , None )
314
+ if match :
315
+ route = getattr (match , "route" , None )
316
+ if route :
317
+ span .set_attribute (SpanAttributes .HTTP_ROUTE , route )
318
+ duration_attrs = request .META [
319
+ self ._environ_duration_attr_key
320
+ ]
321
+ duration_attrs [SpanAttributes .HTTP_TARGET ] = route
322
+
304
323
def process_exception (self , request , exception ):
305
324
if self ._excluded_urls .url_disabled (request .build_absolute_uri ("?" )):
306
325
return
0 commit comments