> ## 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.

# Tâches Mix

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](/elixir/instrumentation/).

## 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 :

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

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`.

<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>

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

<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>
