Zum Hauptinhalt springen
AppSignal für Elixir instrumentiert Mix-Tasks nicht automatisch, aber Sie können manuelle Instrumentierung und Fehlerbehandlung mit benutzerdefinierter Instrumentierung einrichten.

AppSignal starten und stoppen

Da Mix-Tasks Anwendungen nicht automatisch starten, müssen Sie die Anwendung :appsignal in Ihrer Task explizit starten:
Application.ensure_all_started(:appsignal)
Um sicherzustellen, dass AppSignal genug Zeit hat, um Daten an seinen Agenten zu übergeben, rufen Sie am Ende Ihrer Task Appsignal.Nif.stop/0 auf, was blockiert, bis die Erweiterung genug Zeit hatte, die gesendeten Payloads vor dem Stoppen an den Agenten zu übergeben.

Fehler abfangen

Um Fehler in Ihrer Task einzufangen, die an AppSignal gesendet werden sollen, fügen Sie einen rescue-Block hinzu, um Fehler aus Ihrem Code abzufangen. Übergeben Sie die abgefangene Ausnahme an Appsignal.send_error/3, um sie an AppSignal zu melden. Fügen Sie eine after-Klausel zu Ihrem rescue-Block hinzu, um Appsignal.Nif.stop/0 aufzurufen.
defmodule Mix.Tasks.Rescue do
  use Mix.Task

  def run(_) do
    {:ok, _} = Application.ensure_all_started(:appsignal)

    raise "rescue!"
  catch
    kind, reason ->
      stack = __STACKTRACE__
      Appsignal.send_error(kind, reason, stack)
      reraise(reason, stack)
  after
    Appsignal.Nif.stop
    :timer.sleep(35_000) # For one-off containers
  end
end
Hinweis: Ein Sleep von 35 Sekunden wurde am Ende der Mix-Task hinzugefügt. Dies wird für Tasks empfohlen, die auf einmaligen Containern ausgeführt werden. Wenn die Task abgeschlossen ist, stoppt der Prozess. Der Aufruf der Funktion Appsignal.Nif.stop/0 übergibt alle aktuell in der AppSignal-Erweiterung befindlichen Transaktionsdaten an unseren Agenten. Dort wird sie in 30-Sekunden-Intervallen übertragen. Der einmalige Container ist möglicherweise vor diesem Zeitpunkt beendet worden. Um sicherzustellen, dass die Daten dennoch übertragen werden, muss 35 Sekunden gewartet werden.

Performance messen

Um die Performance in Ihrer Task zu messen, starten und stoppen Sie eine Transaktion manuell und fügen Events mit den Instrumentierungs-Helfern hinzu, wie in der benutzerdefinierten Helfer-Instrumentierung beschrieben.
defmodule Mix.Tasks.Instrument do
  use Mix.Task

  def run(_) do
    {:ok, _} = Application.ensure_all_started(:appsignal)

    Appsignal.instrument(fn span ->
      span
      |> Appsignal.Span.set_namespace("background_job")
      |> Appsignal.Span.set_name("Mix.Tasks.Instrument")

      Appsignal.instrument(fn span ->
        Appsignal.Span.set_name("task.instrumented")
        :timer.sleep(1_000)
      end)
    end)

    Appsignal.Nif.stop()
    :timer.sleep(35_000) # For one-off containers
  end
end