@@ -41,6 +41,9 @@ defmodule Sentry.Transport do
4141 Process . sleep ( delay_ms )
4242 post_envelope_with_retries ( client , endpoint , headers , payload , tl ( retries_left ) )
4343
44+ { :retry_after , _delay_ms } ->
45+ { :error , "Sentry server asked us to retry too many times" }
46+
4447 { :error , _reason } when retries_left != [ ] ->
4548 [ sleep_interval | retries_left ] = retries_left
4649 Process . sleep ( sleep_interval )
@@ -56,23 +59,27 @@ defmodule Sentry.Transport do
5659 { :ok , json } <- Config . json_library ( ) . decode ( body ) do
5760 { :ok , Map . get ( json , "id" ) }
5861 else
62+ { :ok , 429 , headers , _body } ->
63+ delay_ms =
64+ with timeout when is_binary ( timeout ) <-
65+ :proplists . get_value ( "Retry-After" , headers , nil ) ,
66+ { delay_s , "" } <- Integer . parse ( timeout ) do
67+ delay_s * 1000
68+ else
69+ _ ->
70+ # https://develop.sentry.dev/sdk/rate-limiting/#stage-1-parse-response-headers
71+ 60_000
72+ end
73+
74+ { :retry_after , delay_ms }
75+
5976 { :ok , status , headers , _body } ->
6077 error_header =
6178 :proplists . get_value ( "X-Sentry-Error" , headers , nil ) ||
6279 :proplists . get_value ( "x-sentry-error" , headers , nil ) || ""
6380
6481 { :error , "Received #{ status } from Sentry server: #{ error_header } " }
6582
66- { :ok , 429 , headers , _body } ->
67- with timeout when is_binary ( timeout ) <- :proplists . get_value ( "Retry-After" , headers , nil ) ,
68- { delay_ms , "" } <- Integer . parse ( timeout ) do
69- { :retry_after , delay_ms * 1000 }
70- else
71- _ ->
72- # https://develop.sentry.dev/sdk/rate-limiting/#stage-1-parse-response-headers
73- { :retry_after , 60_000 }
74- end
75-
7683 { :error , reason } ->
7784 { :error , reason }
7885 end
0 commit comments