44 lines
1.3 KiB
Elixir
44 lines
1.3 KiB
Elixir
defmodule Plausible.Sentry.Client do
|
|
@behaviour Sentry.HTTPClient
|
|
|
|
defguardp is_redirect(status) when is_integer(status) and status >= 300 and status < 400
|
|
|
|
require Logger
|
|
|
|
@doc """
|
|
The Sentry.HTTPClient behaviour requires a child spec to be supplied.
|
|
In this case we don't want Sentry to manage our Finch instances, hence it's fed
|
|
with a dummy module for the sake of the contract.
|
|
|
|
XXX: Submit a Sentry PR making the child spec callback optional.
|
|
"""
|
|
def child_spec do
|
|
Task.child_spec(fn -> :noop end)
|
|
end
|
|
|
|
def post(url, headers, body) do
|
|
req_opts = Application.get_env(:plausible, __MODULE__)[:finch_request_opts] || []
|
|
|
|
:post
|
|
|> Finch.build(url, headers, body)
|
|
|> Finch.request(Plausible.Finch, req_opts)
|
|
|> handle_response()
|
|
end
|
|
|
|
defp handle_response(resp) do
|
|
case resp do
|
|
{:ok, %{status: status, headers: _}} when is_redirect(status) ->
|
|
# Just playing safe here. hackney client didn't support those; redirects are opt-in in hackney
|
|
Logger.warning("Sentry returned a redirect that is not handled yet.")
|
|
{:error, :stop}
|
|
|
|
{:ok, %{status: status, body: body, headers: headers}} ->
|
|
{:ok, status, headers, body}
|
|
|
|
{:error, error} = e ->
|
|
Logger.warning("Sentry call failed with: #{inspect(error)}")
|
|
e
|
|
end
|
|
end
|
|
end
|