@@ -251,7 +251,6 @@ def response_hook(span: Span, status: str, response_headers: List):
251
251
import opentelemetry .instrumentation .wsgi as otel_wsgi
252
252
from opentelemetry import context , trace
253
253
from opentelemetry .instrumentation ._semconv import (
254
- _METRIC_ATTRIBUTES_SERVER_DURATION_NAME ,
255
254
_get_schema_url ,
256
255
_HTTPStabilityMode ,
257
256
_OpenTelemetrySemanticConventionStability ,
@@ -268,6 +267,9 @@ def response_hook(span: Span, status: str, response_headers: List):
268
267
from opentelemetry .instrumentation .utils import _start_internal_or_server_span
269
268
from opentelemetry .metrics import get_meter
270
269
from opentelemetry .semconv .metrics import MetricInstruments
270
+ from opentelemetry .semconv .metrics .http_metrics import (
271
+ HTTP_SERVER_REQUEST_DURATION ,
272
+ )
271
273
from opentelemetry .semconv .trace import SpanAttributes
272
274
from opentelemetry .util .http import (
273
275
get_excluded_urls ,
@@ -282,6 +284,7 @@ def response_hook(span: Span, status: str, response_headers: List):
282
284
_ENVIRON_ACTIVATION_KEY = "opentelemetry-flask.activation_key"
283
285
_ENVIRON_REQCTX_REF_KEY = "opentelemetry-flask.reqctx_ref_key"
284
286
_ENVIRON_TOKEN = "opentelemetry-flask.token"
287
+ _ENVIRON_REQUEST_ROUTE_KEY = "request-route_key"
285
288
286
289
_excluded_urls_from_env = get_excluded_urls ("FLASK" )
287
290
@@ -344,6 +347,11 @@ def _start_response(status, response_headers, *args, **kwargs):
344
347
excluded_urls is None
345
348
or not excluded_urls .url_disabled (flask .request .url )
346
349
):
350
+ if flask .request .url_rule :
351
+ wrapped_app_environ [_ENVIRON_REQUEST_ROUTE_KEY ] = str (
352
+ flask .request .url_rule
353
+ )
354
+
347
355
span = flask .request .environ .get (_ENVIRON_SPAN_KEY )
348
356
349
357
propagator = get_global_response_propagator ()
@@ -386,13 +394,25 @@ def _start_response(status, response_headers, *args, **kwargs):
386
394
duration_attrs_old = otel_wsgi ._parse_duration_attrs (
387
395
attributes , _HTTPStabilityMode .DEFAULT
388
396
)
397
+
398
+ if wrapped_app_environ .get (_ENVIRON_REQUEST_ROUTE_KEY , None ):
399
+ duration_attrs_old [SpanAttributes .HTTP_ROUTE ] = (
400
+ wrapped_app_environ .get (_ENVIRON_REQUEST_ROUTE_KEY )
401
+ )
402
+
389
403
duration_histogram_old .record (
390
404
max (round (duration_s * 1000 ), 0 ), duration_attrs_old
391
405
)
392
406
if duration_histogram_new :
393
407
duration_attrs_new = otel_wsgi ._parse_duration_attrs (
394
408
attributes , _HTTPStabilityMode .HTTP
395
409
)
410
+
411
+ if wrapped_app_environ .get (_ENVIRON_REQUEST_ROUTE_KEY , None ):
412
+ duration_attrs_new [SpanAttributes .HTTP_ROUTE ] = (
413
+ wrapped_app_environ .get (_ENVIRON_REQUEST_ROUTE_KEY )
414
+ )
415
+
396
416
duration_histogram_new .record (
397
417
max (duration_s , 0 ), duration_attrs_new
398
418
)
@@ -553,7 +573,7 @@ def __init__(self, *args, **kwargs):
553
573
duration_histogram_new = None
554
574
if _report_new (_InstrumentedFlask ._sem_conv_opt_in_mode ):
555
575
duration_histogram_new = meter .create_histogram (
556
- name = _METRIC_ATTRIBUTES_SERVER_DURATION_NAME ,
576
+ name = HTTP_SERVER_REQUEST_DURATION ,
557
577
unit = "s" ,
558
578
description = "measures the duration of the inbound HTTP request" ,
559
579
)
@@ -684,7 +704,7 @@ def instrument_app(
684
704
duration_histogram_new = None
685
705
if _report_new (sem_conv_opt_in_mode ):
686
706
duration_histogram_new = meter .create_histogram (
687
- name = _METRIC_ATTRIBUTES_SERVER_DURATION_NAME ,
707
+ name = HTTP_SERVER_REQUEST_DURATION ,
688
708
unit = "s" ,
689
709
description = "measures the duration of the inbound HTTP request" ,
690
710
)
0 commit comments