Zum Hauptinhalt springen
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