Pular para o conteúdo principal
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.

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:
Application.ensure_all_started(:appsignal)
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.
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
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. 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.
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