77from django .core .files .uploadedfile import SimpleUploadedFile
88from django .http import HttpResponse
99from django .test .client import RequestFactory
10- from requests .exceptions import Timeout
10+ from requests .exceptions import ConnectionError , Timeout
1111
1212from sentry .api .exceptions import RequestTimeout
1313from sentry .hybridcloud .apigateway .proxy import proxy_request
@@ -352,7 +352,58 @@ def test_timeout_records_error(self) -> None:
352352
353353 @responses .activate
354354 @override_options (CB_ENABLED )
355- def test_5xx_response_records_error (self ) -> None :
355+ def test_connection_error_records_error (self ) -> None :
356+ responses .add (
357+ responses .GET ,
358+ f"{ self .CELL .address } /connect-error" ,
359+ body = ConnectionError (),
360+ )
361+ with patch ("sentry.hybridcloud.apigateway.proxy.CircuitBreaker" ) as mock_breaker_class :
362+ mock_breaker = self ._make_breaker_mock (allow_request = True )
363+ mock_breaker_class .return_value = mock_breaker
364+ request = RequestFactory ().get ("http://sentry.io/connect-error" )
365+ with pytest .raises (ConnectionError ):
366+ proxy_request (request , self .organization .slug , url_name )
367+ mock_breaker .record_error .assert_called_once ()
368+
369+ @responses .activate
370+ @override_options (CB_ENABLED )
371+ def test_connection_error_records_metric (self ) -> None :
372+ responses .add (
373+ responses .GET ,
374+ f"{ self .CELL .address } /connect-error" ,
375+ body = ConnectionError (),
376+ )
377+ with patch ("sentry.hybridcloud.apigateway.proxy.metrics" ) as mock_metrics :
378+ request = RequestFactory ().get ("http://sentry.io/connect-error" )
379+ with pytest .raises (ConnectionError ):
380+ proxy_request (request , self .organization .slug , url_name )
381+ mock_metrics .incr .assert_any_call (
382+ "apigateway.proxy.connection_error" ,
383+ tags = {"region" : self .CELL .name , "url_name" : url_name },
384+ )
385+
386+ @responses .activate
387+ @override_options (CB_ENABLED )
388+ def test_504_response_does_record_error (self ) -> None :
389+ responses .add (
390+ responses .GET ,
391+ f"{ self .CELL .address } /server-error" ,
392+ status = 504 ,
393+ body = json .dumps ({"detail" : "gateway timeout" }),
394+ content_type = "application/json" ,
395+ )
396+ with patch ("sentry.hybridcloud.apigateway.proxy.CircuitBreaker" ) as mock_breaker_class :
397+ mock_breaker = self ._make_breaker_mock (allow_request = True )
398+ mock_breaker_class .return_value = mock_breaker
399+ request = RequestFactory ().get ("http://sentry.io/server-error" )
400+ resp = proxy_request (request , self .organization .slug , url_name )
401+ assert resp .status_code == 504
402+ mock_breaker .record_error .assert_called_once ()
403+
404+ @responses .activate
405+ @override_options (CB_ENABLED )
406+ def test_500_response_does_not_record_error (self ) -> None :
356407 responses .add (
357408 responses .GET ,
358409 f"{ self .CELL .address } /server-error" ,
@@ -366,7 +417,7 @@ def test_5xx_response_records_error(self) -> None:
366417 request = RequestFactory ().get ("http://sentry.io/server-error" )
367418 resp = proxy_request (request , self .organization .slug , url_name )
368419 assert resp .status_code == 500
369- mock_breaker .record_error .assert_called_once ()
420+ mock_breaker .record_error .assert_not_called ()
370421
371422 @responses .activate
372423 @override_options (CB_ENABLED )
0 commit comments