Retry on 429/5xx responses across all HTTP clients

Previously retry: :transient only retried connection errors, not HTTP
429 rate limits. All clients now use a custom retry function that
handles 429, 500, 502, 503, 504 with 5 retries and jittered backoff.
This commit is contained in:
Graham McIntire 2026-03-29 17:47:08 -05:00
parent 3534b282af
commit 9334539442
No known key found for this signature in database
GPG key ID: F4ABF488E6029E59
3 changed files with 30 additions and 6 deletions

View file

@ -101,14 +101,22 @@ defmodule Microwaveprop.Terrain.ElevationClient do
defp deg_to_rad(deg), do: deg * :math.pi() / 180
defp req_options do
defaults = [retry: :transient, max_retries: 2, retry_delay: &retry_delay/1]
defaults = [retry: &retry?/2, max_retries: 5, retry_delay: &retry_delay/1]
overrides = Application.get_env(:microwaveprop, :elevation_req_options, [])
Keyword.merge(defaults, overrides)
end
defp retry?(_request, response) do
case response do
%Req.Response{status: status} when status in [429, 500, 502, 503, 504] -> true
%{__exception__: true} -> true
_ -> false
end
end
defp retry_delay(n) do
base = Integer.pow(2, n) * 1_000
jitter = :rand.uniform(500)
jitter = :rand.uniform(1_000)
base + jitter
end
end

View file

@ -242,14 +242,22 @@ defmodule Microwaveprop.Weather.HrrrClient do
end
defp req_options do
defaults = [retry: :transient, max_retries: 3, retry_delay: &retry_delay/1]
defaults = [retry: &retry?/2, max_retries: 5, retry_delay: &retry_delay/1]
overrides = Application.get_env(:microwaveprop, :hrrr_req_options, [])
Keyword.merge(defaults, overrides)
end
defp retry?(_request, response) do
case response do
%Req.Response{status: status} when status in [429, 500, 502, 503, 504] -> true
%{__exception__: true} -> true
_ -> false
end
end
defp retry_delay(n) do
base = Integer.pow(2, n) * 1_000
jitter = :rand.uniform(500)
jitter = :rand.uniform(1_000)
base + jitter
end
end

View file

@ -74,14 +74,22 @@ defmodule Microwaveprop.Weather.IemClient do
end
defp req_options do
defaults = [retry: :transient, max_retries: 3, retry_delay: &retry_delay/1]
defaults = [retry: &retry?/2, max_retries: 5, retry_delay: &retry_delay/1]
overrides = Application.get_env(:microwaveprop, :iem_req_options, [])
Keyword.merge(defaults, overrides)
end
defp retry?(_request, response) do
case response do
%Req.Response{status: status} when status in [429, 500, 502, 503, 504] -> true
%{__exception__: true} -> true
_ -> false
end
end
defp retry_delay(n) do
base = Integer.pow(2, n) * 1_000
jitter = :rand.uniform(500)
jitter = :rand.uniform(1_000)
base + jitter
end