Passer au contenu principal
AppSignal pour Elixir n’instrumente pas automatiquement les tâches mix, mais vous pouvez configurer une instrumentation manuelle et la gestion des erreurs en utilisant l’instrumentation personnalisée.

Démarrer et arrêter AppSignal

Comme les tâches Mix ne démarrent pas automatiquement les applications, vous devrez démarrer explicitement l’application :appsignal dans votre tâche :
Application.ensure_all_started(:appsignal)
Pour vous assurer qu’AppSignal a suffisamment de temps pour vider les données vers son agent, appelez Appsignal.Nif.stop/0 à la fin de votre tâche, ce qui bloque jusqu’à ce que l’extension ait eu suffisamment de temps pour vider les payloads envoyés vers l’agent avant de s’arrêter.

Attraper les erreurs

Pour envelopper les erreurs dans votre tâche afin de les envoyer à AppSignal, ajoutez un bloc rescue pour attraper les erreurs de votre code. Passez l’exception capturée à Appsignal.send_error/3 pour la signaler à AppSignal. Ajoutez une clause after à votre bloc rescue pour appeler Appsignal.Nif.stop/0.
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
Remarque : Un sleep de 35 secondes a été ajouté à la fin de la tâche Mix. Ceci est recommandé pour les tâches qui s’exécutent sur des conteneurs ponctuels. Lorsque la tâche se termine, le processus s’arrête. L’appel à la fonction Appsignal.Nif.stop/0 vide toutes les données de transaction actuellement présentes dans l’extension AppSignal vers notre agent. Là, elles sont transmises à un intervalle de 30 secondes. Le conteneur ponctuel peut s’être arrêté avant ce délai. Pour s’assurer que les données sont quand même transmises, il doit attendre 35 secondes.

Mesurer les performances

Pour mesurer les performances dans votre tâche, démarrez et arrêtez une transaction manuellement et ajoutez des événements à l’aide des helpers d’instrumentation, comme décrit dans l’instrumentation par helpers personnalisés.
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