Naar hoofdinhoud gaan
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