Naar hoofdinhoud gaan
AppSignal voor Elixir instrumenteert Mix-taken niet automatisch, maar u kunt handmatige instrumentatie en foutafhandeling opzetten met behulp van aangepaste instrumentatie.

AppSignal starten en stoppen

Aangezien Mix-taken niet automatisch applicaties starten, moet u expliciet de :appsignal-applicatie in uw taak starten:
Application.ensure_all_started(:appsignal)
Om er zeker van te zijn dat AppSignal voldoende tijd heeft om data naar zijn agent te flushen, roept u Appsignal.Nif.stop/0 aan aan het einde van uw taak. Dit blokkeert totdat de extensie voldoende tijd heeft gehad om de verzonden payloads naar de agent te flushen voordat deze stopt.

Fouten opvangen

Om fouten in uw taak in te pakken zodat deze naar AppSignal worden gestuurd, voegt u een rescue-blok toe om fouten uit uw code op te vangen. Geef de opgevangen uitzondering door aan Appsignal.send_error/3 om deze aan AppSignal te rapporteren. Voeg een after-clausule toe aan uw rescue-blok om Appsignal.Nif.stop/0 aan te roepen.
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
Opmerking: Aan het einde van de Mix-taak is een sleep van 35 seconden toegevoegd. Dit wordt aanbevolen voor taken die op one-off containers draaien. Wanneer de taak is voltooid, stopt het proces. De functieaanroep Appsignal.Nif.stop/0 flusht alle transactiedata die momenteel in de AppSignal-extensie zit naar onze agent. Daar wordt het met een interval van 30 seconden verzonden. De one-off container kan vóór die tijd al zijn afgesloten. Om ervoor te zorgen dat de data toch wordt verzonden, moet er 35 seconden gewacht worden.

Performance meten

Om performance in uw taak te meten, start en stop u een transactie handmatig en voegt u events toe met behulp van de instrumentatiehulpen, zoals beschreven in de aangepaste helper-instrumentatie.
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