> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appsignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Mix-Tasks

AppSignal für Elixir instrumentiert Mix-Tasks nicht automatisch, aber Sie können manuelle Instrumentierung und Fehlerbehandlung mit [benutzerdefinierter Instrumentierung](/elixir/instrumentation/) einrichten.

## AppSignal starten und stoppen

Da Mix-Tasks Anwendungen nicht automatisch starten, müssen Sie die Anwendung `:appsignal` in Ihrer Task explizit starten:

<CodeGroup>
  ```elixir Elixir theme={null}
  Application.ensure_all_started(:appsignal)
  ```
</CodeGroup>

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.

<CodeGroup>
  ```elixir Elixir theme={null}
  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
  ```
</CodeGroup>

**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](/appsignal/how-appsignal-operates#agent). 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](/elixir/instrumentation/instrumentation#helper-transactions) beschrieben.

<CodeGroup>
  ```elixir Elixir theme={null}
  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
  ```
</CodeGroup>
