Het AppSignal voor Elixir-pakket instrumenteert HTTP-requests die worden uitgevoerd door HTTPoison.
HTTPoison is een populaire HTTP-client voor Elixir. In tegenstelling tot Finch en Tesla zendt HTTPoison geen telemetry-events uit, dus AppSignal kan het niet automatisch instrumenteren. In plaats daarvan biedt AppSignal wrapper-modules waarvoor u kunt opt-in: Appsignal.HTTPoison als drop-in client en Appsignal.HTTPoison.Base voor aangepaste client-modules. De response- en error-structs (%HTTPoison.Response{}, %HTTPoison.Error{}, …) zijn HTTPoison’s eigen types en worden ongewijzigd geretourneerd.
AppSignal wikkelt requests die via Appsignal.HTTPoison worden uitgevoerd als request.httpoison-events op de event timeline van uw performance samples, zodat u kunt zien hoeveel tijd HTTPoison besteedt aan het maken van externe API-requests. Deze data kan u helpen bij de beslissing om de API-requests naar een background job te verplaatsen of caching te introduceren om de performance te verbeteren en onnodige API-requests te beperken.
Configuratie
HTTPoison-instrumentatie is opt-in. Kies de aanpak die het beste past bij uw applicatie.
Appsignal.HTTPoison direct gebruiken
Roep Appsignal.HTTPoison aan in plaats van HTTPoison om geïnstrumenteerde requests te maken. Pattern-match op %HTTPoison.Response{...} en %HTTPoison.Error{...} zoals gebruikelijk — dit zijn HTTPoison’s eigen struct-types, die ongewijzigd worden geretourneerd:
Gebruik geen alias Appsignal.HTTPoison. Dit zou de modulenaam HTTPoison
schaduwen, waardoor pattern matches op %HTTPoison.Response{} en %HTTPoison.Error{}
zouden mislukken.
defmodule MyAppWeb.PageController do
use MyAppWeb, :controller
def index(conn, _params) do
case Appsignal.HTTPoison.get("https://api.example.com/users") do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
render(conn, :index, users: body)
{:ok, %HTTPoison.Response{status_code: status}} ->
conn |> put_status(status) |> text("Error")
{:error, %HTTPoison.Error{reason: reason}} ->
conn |> put_status(500) |> text("Error: #{reason}")
end
end
end
Aangepaste client-modules
Als u een aangepaste HTTP-clientmodule op basis van HTTPoison.Base gebruikt, vervang dan use HTTPoison.Base door use Appsignal.HTTPoison.Base. Er zijn geen verdere wijzigingen nodig — binnen de module kunt u methoden zoals get/1 en post/3 aanroepen en op de gebruikelijke manier matchen op HTTPoison’s response- en error-structs:
defmodule MyApp.ApiClient do
# replace `use HTTPoison.Base` with `use Appsignal.HTTPoison.Base`
use Appsignal.HTTPoison.Base
def process_url(url) do
"https://api.example.com" <> url
end
def users do
case get("/users") do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} -> {:ok, body}
{:ok, %HTTPoison.Response{status_code: status}} -> {:error, status}
{:error, %HTTPoison.Error{reason: reason}} -> {:error, reason}
end
end
end
Alle requests die via uw aangepaste client worden gemaakt, worden vervolgens automatisch geïnstrumenteerd. Als uw module request/5 overschrijft, zorg er dan voor dat u super aanroept om de instrumentatie te behouden:
defmodule MyApp.ApiClient do
use Appsignal.HTTPoison.Base
def request(method, url, body, headers, options) do
# ... custom logic here ...
super(method, url, body, headers, options)
end
end