@@ -159,6 +159,14 @@ def error_wsgi_unhandled_override_attrs(environ, start_response):
159159 raise ValueError
160160
161161
162+ def error_wsgi_unhandled_override_attrs_new_semconv (environ , start_response ):
163+ labeler = get_labeler ()
164+ labeler .add ("custom_attr" , "test_value" )
165+ labeler .add ("http.request.method" , "POST" )
166+ assert isinstance (environ , dict )
167+ raise ValueError
168+
169+
162170def wsgi_with_custom_response_headers (environ , start_response ):
163171 assert isinstance (environ , dict )
164172 start_response (
@@ -471,6 +479,82 @@ def test_wsgi_metrics(self):
471479 self .assertTrue (number_data_point_seen and histogram_data_point_seen )
472480
473481 def test_wsgi_metrics_custom_attributes_skip_override_old_semconv (self ):
482+ labeler = get_labeler ()
483+ labeler .add ("custom_attr" , "test_value" )
484+ labeler .add ("http.method" , "POST" )
485+
486+ app = otel_wsgi .OpenTelemetryMiddleware (error_wsgi_unhandled )
487+ self .assertRaises (ValueError , app , self .environ , self .start_response )
488+
489+ metrics = self .get_sorted_metrics (SCOPE )
490+ active_requests_point_seen = False
491+ histogram_point_seen = False
492+
493+ for metric in metrics :
494+ if metric .name == "http.server.active_requests" :
495+ data_points = list (metric .data .data_points )
496+ self .assertEqual (len (data_points ), 1 )
497+ point = data_points [0 ]
498+ self .assertIsInstance (point , NumberDataPoint )
499+ self .assertEqual (point .attributes [HTTP_METHOD ], "GET" )
500+ self .assertEqual (point .attributes ["custom_attr" ], "test_value" )
501+ active_requests_point_seen = True
502+ continue
503+
504+ if metric .name != "http.server.duration" :
505+ continue
506+
507+ data_points = list (metric .data .data_points )
508+ self .assertEqual (len (data_points ), 1 )
509+ point = data_points [0 ]
510+ self .assertIsInstance (point , HistogramDataPoint )
511+ self .assertEqual (point .attributes [HTTP_METHOD ], "GET" )
512+ self .assertNotIn ("custom_attr" , point .attributes )
513+ histogram_point_seen = True
514+
515+ self .assertTrue (active_requests_point_seen )
516+ self .assertTrue (histogram_point_seen )
517+
518+ def test_wsgi_metrics_custom_attributes_skip_override_new_semconv (self ):
519+ labeler = get_labeler ()
520+ labeler .add ("custom_attr" , "test_value" )
521+ labeler .add ("http.request.method" , "POST" )
522+
523+ app = otel_wsgi .OpenTelemetryMiddleware (error_wsgi_unhandled )
524+ self .assertRaises (ValueError , app , self .environ , self .start_response )
525+
526+ metrics = self .get_sorted_metrics (SCOPE )
527+ active_requests_point_seen = False
528+ histogram_point_seen = False
529+
530+ for metric in metrics :
531+ if metric .name == "http.server.active_requests" :
532+ data_points = list (metric .data .data_points )
533+ self .assertEqual (len (data_points ), 1 )
534+ point = data_points [0 ]
535+ self .assertIsInstance (point , NumberDataPoint )
536+ self .assertEqual (point .attributes [HTTP_REQUEST_METHOD ], "GET" )
537+ self .assertEqual (point .attributes ["custom_attr" ], "test_value" )
538+ active_requests_point_seen = True
539+ continue
540+
541+ if metric .name != "http.server.request.duration" :
542+ continue
543+
544+ data_points = list (metric .data .data_points )
545+ self .assertEqual (len (data_points ), 1 )
546+ point = data_points [0 ]
547+ self .assertIsInstance (point , HistogramDataPoint )
548+ self .assertEqual (point .attributes [HTTP_REQUEST_METHOD ], "GET" )
549+ self .assertNotIn ("custom_attr" , point .attributes )
550+ histogram_point_seen = True
551+
552+ self .assertTrue (active_requests_point_seen )
553+ self .assertTrue (histogram_point_seen )
554+
555+ def test_wsgi_duration_metrics_custom_attributes_skip_override_old_semconv (
556+ self ,
557+ ):
474558 app = otel_wsgi .OpenTelemetryMiddleware (
475559 error_wsgi_unhandled_override_attrs
476560 )
@@ -493,6 +577,31 @@ def test_wsgi_metrics_custom_attributes_skip_override_old_semconv(self):
493577
494578 self .assertTrue (histogram_point_seen )
495579
580+ def test_wsgi_duration_metrics_custom_attributes_skip_override_new_semconv (
581+ self ,
582+ ):
583+ app = otel_wsgi .OpenTelemetryMiddleware (
584+ error_wsgi_unhandled_override_attrs_new_semconv
585+ )
586+ self .assertRaises (ValueError , app , self .environ , self .start_response )
587+
588+ metrics = self .get_sorted_metrics (SCOPE )
589+ histogram_point_seen = False
590+
591+ for metric in metrics :
592+ if metric .name != "http.server.request.duration" :
593+ continue
594+
595+ data_points = list (metric .data .data_points )
596+ self .assertEqual (len (data_points ), 1 )
597+ point = data_points [0 ]
598+ self .assertIsInstance (point , HistogramDataPoint )
599+ self .assertEqual (point .attributes [HTTP_REQUEST_METHOD ], "GET" )
600+ self .assertEqual (point .attributes ["custom_attr" ], "test_value" )
601+ histogram_point_seen = True
602+
603+ self .assertTrue (histogram_point_seen )
604+
496605 def test_wsgi_metrics_exemplars_expected_old_semconv (self ): # type: ignore[func-returns-value]
497606 """Failing test asserting exemplars should be present for duration histogram (old semconv)."""
498607 app = otel_wsgi .OpenTelemetryMiddleware (simple_wsgi )
0 commit comments