@@ -836,6 +836,36 @@ def test_duration_histogram_new_record_with_context_new_semconv(self):
836836 span_arg .context .span_id , finished_span .context .span_id
837837 )
838838
839+ def test_active_requests_counter_decremented_on_error (self ):
840+ """Regression test for https://github.com/open-telemetry/opentelemetry-python-contrib/issues/4431.
841+ http.server.active_requests must be decremented even when the view
842+ raises an exception, so it does not permanently leak.
843+ """
844+ self .client .get ("/hello/123" )
845+
846+ resp = self .client .get ("/hello/500" )
847+ self .assertEqual (500 , resp .status_code )
848+
849+ metrics_list = self .memory_metrics_reader .get_metrics_data ()
850+ active_requests_value = None
851+ for resource_metric in metrics_list .resource_metrics :
852+ for scope_metric in resource_metric .scope_metrics :
853+ for metric in scope_metric .metrics :
854+ if metric .name == "http.server.active_requests" :
855+ for point in metric .data .data_points :
856+ if isinstance (point , NumberDataPoint ):
857+ active_requests_value = point .value
858+
859+ self .assertIsNotNone (
860+ active_requests_value ,
861+ "http.server.active_requests metric not found" ,
862+ )
863+ self .assertEqual (
864+ 0 ,
865+ active_requests_value ,
866+ f"active_requests counter leaked: expected 0 but got { active_requests_value } " ,
867+ )
868+
839869
840870class TestProgrammaticHooks (InstrumentationTest , WsgiTestBase ):
841871 def setUp (self ):
0 commit comments