Das AppSignal-für-Elixir-Paket instrumentiert HTTP-Anfragen, die von HTTPoison ausgeführt werden.
HTTPoison ist ein beliebter HTTP-Client für Elixir. Im Gegensatz zu Finch und Tesla sendet HTTPoison keine Telemetry-Events aus, sodass AppSignal ihn nicht automatisch instrumentieren kann. Stattdessen bietet AppSignal Wrapper-Module, für die Sie sich entscheiden: Appsignal.HTTPoison als Drop-in-Client und Appsignal.HTTPoison.Base für benutzerdefinierte Client-Module. Die Response- und Error-Structs (%HTTPoison.Response{}, %HTTPoison.Error{}, …) sind HTTPoisons eigene Typen und werden unverändert zurückgegeben.
AppSignal verpackt Anfragen, die über Appsignal.HTTPoison ausgeführt werden, als request.httpoison-Events in der Event-Timeline Ihrer Performance-Samples, sodass Sie sehen können, wie viel Zeit HTTPoison mit externen API-Anfragen verbringt. Diese Daten können Sie dazu veranlassen, die API-Anfragen in einen Hintergrund-Job zu verschieben oder Caching einzuführen, um die Performance zu verbessern und unnötige API-Anfragen zu begrenzen.
Konfiguration
Die HTTPoison-Instrumentierung ist Opt-in. Wählen Sie den Ansatz, der am besten zu Ihrer Anwendung passt.
Appsignal.HTTPoison direkt verwenden
Rufen Sie Appsignal.HTTPoison anstelle von HTTPoison auf, um instrumentierte Anfragen zu stellen. Verwenden Sie Pattern-Matching auf %HTTPoison.Response{...} und %HTTPoison.Error{...} wie gewohnt – dies sind HTTPoisons eigene Struct-Typen, die unverändert zurückgegeben werden:
Verwenden Sie nicht alias Appsignal.HTTPoison. Dies würde den Modulnamen
HTTPoison überdecken, wodurch Pattern-Matches auf %HTTPoison.Response{} und %HTTPoison.Error{}
fehlschlagen würden.
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
Benutzerdefinierte Client-Module
Wenn Sie ein benutzerdefiniertes HTTP-Client-Modul basierend auf HTTPoison.Base verwenden, ersetzen Sie use HTTPoison.Base durch use Appsignal.HTTPoison.Base. Weitere Änderungen sind nicht erforderlich – innerhalb des Moduls können Sie Methoden wie get/1 und post/3 aufrufen und wie gewohnt auf HTTPoisons Response- und Error-Structs matchen:
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 Anfragen, die über Ihren benutzerdefinierten Client gestellt werden, werden dann automatisch instrumentiert. Wenn Ihr Modul request/5 überschreibt, stellen Sie sicher, dass Sie super aufrufen, um die Instrumentierung beizubehalten:
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