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

O AppSignal for Elixir não instrumenta automaticamente mix tasks, mas você pode configurar instrumentação manual e tratamento de erros usando [instrumentação personalizada](/elixir/instrumentation/).

## Iniciando e parando o AppSignal

Como mix tasks não iniciam aplicações automaticamente, você precisará iniciar explicitamente a aplicação `:appsignal` na sua task:

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

Para garantir que o AppSignal tenha tempo suficiente para enviar dados ao seu agent, chame `Appsignal.Nif.stop/0` ao final da sua task, que bloqueia até que a extensão tenha tido tempo suficiente para enviar os payloads ao agent antes de parar.

## Capturando erros

Para envolver erros na sua task e enviá-los ao AppSignal, adicione um bloco `rescue` para capturar erros do seu código. Passe a exceção capturada para `Appsignal.send_error/3` para reportá-la ao AppSignal. Adicione uma cláusula `after` ao seu bloco `rescue` para chamar `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) # Para containers one-off
    end
  end
  ```
</CodeGroup>

**Nota:** Um sleep de 35 segundos foi adicionado ao final da Mix task. Isso é recomendado para tasks que rodam em containers one-off. Quando a task termina, o processo para. A chamada de função `Appsignal.Nif.stop/0` envia todos os dados de transação atualmente na extensão AppSignal para nosso agent. Lá, eles são [transmitidos em um intervalo de 30 segundos](/appsignal/how-appsignal-operates#agent). O container one-off pode ter encerrado antes desse tempo. Para garantir que os dados ainda sejam transmitidos, é preciso esperar 35 segundos.

## Medindo desempenho

Para medir o desempenho na sua task, inicie e pare uma transação manualmente e adicione eventos usando os helpers de instrumentação, como descrito em [instrumentação personalizada com helpers](/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) # Para containers one-off
    end
  end
  ```
</CodeGroup>
