Na maioria das aplicações, alguns erros serão levantados que não estão relacionados a
possíveis bugs no seu código; eles simplesmente acontecem quando seu app entra em contato
com o mundo real. Bots podem passar e tentar postar formulários automaticamente,
links desatualizados podem direcionar visitantes a conteúdos que não existem mais,
e por aí vai.
Para evitar que esses erros sejam levantados como problemas no AppSignal, é possível
adicionar tratamento de exceções ao seu código ou até mesmo fazer o AppSignal ignorar
completamente certos erros.
Ignorar erros
A configuração do AppSignal permite ignorar
erros. Ao fornecer uma lista de
erros específicos, o AppSignal não enviará alertas quando esses erros forem levantados.
Appsignal.set_error/3
Se você quiser fazer rescue de exceções na sua aplicação para evitar crashes, mas
ainda quiser rastrear a ocorrência, você pode usar
Appsignal.set_error/2 para adicionar a exceção à
transação atual do AppSignal:
try do
raise "Exception!"
rescue
exception -> Appsignal.set_error(exception, __STACKTRACE__)
end
Erlang
A integração do AppSignal faz o possível para converter erros levantados do Erlang em exceções Elixir. Por exemplo, um :badarg
levantado pelo Erlang é automaticamente convertido em um ArgumentError. No entanto, às vezes o melhor que ela consegue fazer é envolver o erro originado do Erlang em um ErlangError.
Como esses não fornecem muito insight sobre o problema subjacente, recomendamos adicionar informações de dentro da sua aplicação, capturando o erro, criando uma exceção Elixir você mesmo e adicionando-a ao span atual usando a função set_error/2.
NOTA: Appsignal.set_error/2 foi adicionado no AppSignal for Elixir 2.1.0. Se
você estiver em uma versão inferior, use Appsignal.set_error/3 em vez disso.
Em versões anteriores à 2.1.0, use catch e Appsignal.send_error/3:
try do
raise "Exception!"
catch
kind, reason ->
Appsignal.set_error(kind, reason, __STACKTRACE__)
end
A exceção será rastreada pelo AppSignal como qualquer outro erro, e permite
que você forneça tratamento de erro e fallbacks personalizados.
Se você não tiver um objeto de erro ao chamar send_error, mas ainda quiser reportar o cenário como um erro, também é possível inicializar uma struct de erro personalizada.
defmodule MyCustomError do
defexception message: "default message" # Personalize se você chamá-lo sem uma mensagem personalizada
end
case Worker.do_something() do
:ok -> IO.puts "yay!"
{:error, message} ->
Appsignal.set_error(:error, %MyCustomError{ message: message }, [])
end
Nota: Esta função só funciona quando há uma transação AppSignal ativa.
Caso contrário, o erro será ignorado.
Consulte
Appsignal.send_error/3 para enviar erros
sem uma transação AppSignal.
Appsignal.send_error/3
O AppSignal fornece um mecanismo para rastrear erros que ocorrem em código que não está em
um contexto web ou de background job, como Mix tasks. Isso é útil para
instrumentação que não cria automaticamente transações AppSignal para
fazer profile.
Você pode usar a função Appsignal.send_error/3 para
enviar diretamente uma exceção para o AppSignal a partir de qualquer lugar do seu código sem
iniciar primeiro uma transação AppSignal.
try do
raise "Exception!"
catch
kind, reason ->
Appsignal.send_error(kind, reason, __STACKTRACE__)
end
Se você não tiver um objeto de erro ao chamar send_error, mas ainda quiser reportar o cenário como um erro, também é possível inicializar uma struct de erro personalizada.
defmodule MyCustomError do
defexception message: "default message" # Personalize se você chamá-lo sem uma mensagem personalizada
end
case Worker.do_something() do
:ok -> IO.puts "yay!"
{:error, message} ->
Appsignal.send_error(:error, %MyCustomError{ message: message }, [])
end
Para adicionar metadados ao erro enviado, passe uma função como o quarto argumento para
Appsignal.send_errror/4:
try do
raise "Exception!"
catch
kind, reason ->
Appsignal.send_error(kind, reason, __STACKTRACE__, fn span ->
Appsignal.Span.set_attribute(span, "key", "value")
end)
end
NOTA: Appsignal.send_error/4 foi adicionado no AppSignal for Elixir 2.1.0.