Passer au contenu principal
Dans la plupart des applications, certaines erreurs seront levées qui ne sont pas liées à d’éventuels bugs dans votre code, elles surviennent simplement lorsque votre application entre en contact avec le monde réel. Des bots peuvent passer et tenter de poster automatiquement des formulaires, des liens obsolètes peuvent diriger les visiteurs vers du contenu qui n’existe plus, et ainsi de suite. Pour éviter que ces erreurs ne soient signalées comme des problèmes dans AppSignal, il est possible d’ajouter de la gestion d’exceptions à votre code ou même de laisser AppSignal ignorer complètement certaines erreurs.

Ignorer les erreurs

La configuration AppSignal permet d’ignorer les erreurs. En fournissant une liste d’erreurs spécifiques, AppSignal n’enverra pas d’alertes lorsque ces erreurs sont levées.

Appsignal.set_error/3

Si vous voulez rescue des exceptions dans votre application pour éviter les crashs, mais que vous voulez quand même suivre l’occurrence, vous pouvez utiliser Appsignal.set_error/2 pour ajouter l’exception à la transaction AppSignal courante :
try do
  raise "Exception!"
rescue
  exception -> Appsignal.set_error(exception, __STACKTRACE__)
end

Erlang

L’intégration AppSignal fait de son mieux pour convertir les erreurs levées par Erlang en exceptions Elixir. Par exemple, un :badarg levé depuis Erlang est automatiquement converti en ArgumentError. Cependant, parfois le mieux qu’elle puisse faire est d’envelopper l’erreur provenant d’Erlang dans un ErlangError. Comme celles-ci ne donnent pas beaucoup d’éclairage sur le problème sous-jacent, nous recommandons d’ajouter des informations depuis votre application en attrapant l’erreur, en créant vous-même une exception Elixir et en l’ajoutant au span courant à l’aide de la fonction set_error/2.
NOTE : Appsignal.set_error/2 a été ajoutée dans AppSignal pour Elixir 2.1.0. Si vous êtes sur une version inférieure, utilisez Appsignal.set_error/3 à la place.
Sur les versions antérieures à 2.1.0, utilisez catch et Appsignal.send_error/3 :
try do
  raise "Exception!"
catch
  kind, reason ->
    Appsignal.set_error(kind, reason, __STACKTRACE__)
end
L’exception sera suivie par AppSignal comme toute autre erreur, et cela vous permet de fournir une gestion d’erreur personnalisée et des solutions de repli. Si vous n’avez pas d’objet d’erreur lors de l’appel à send_error, mais que vous voulez quand même signaler la situation comme une erreur, il est également possible d’initialiser une struct d’erreur personnalisée.
defmodule MyCustomError do
  defexception message: "default message" # Customize if you call it without a custom message
end

case Worker.do_something() do
  :ok -> IO.puts "yay!"
  {:error, message} ->
    Appsignal.set_error(:error, %MyCustomError{ message: message }, [])
end
Remarque : Cette fonction ne fonctionne que lorsqu’une transaction AppSignal est active. Sinon, l’erreur sera ignorée. Veuillez consulter Appsignal.send_error/3 pour envoyer des erreurs sans transaction AppSignal.

Appsignal.send_error/3

AppSignal fournit un mécanisme pour suivre les erreurs qui surviennent dans du code qui n’est pas dans un contexte web ou de job en arrière-plan, comme les tâches Mix. C’est utile pour l’instrumentation qui ne crée pas automatiquement de transactions AppSignal à profiler. Vous pouvez utiliser la fonction Appsignal.send_error/3 pour envoyer directement une exception à AppSignal depuis n’importe quel endroit de votre code sans démarrer d’abord une transaction AppSignal.
try do
  raise "Exception!"
catch
  kind, reason ->
    Appsignal.send_error(kind, reason, __STACKTRACE__)
end
Si vous n’avez pas d’objet d’erreur lors de l’appel à send_error, mais que vous voulez quand même signaler la situation comme une erreur, il est également possible d’initialiser une struct d’erreur personnalisée.
defmodule MyCustomError do
  defexception message: "default message" # Customize if you call it without a custom message
end

case Worker.do_something() do
  :ok -> IO.puts "yay!"
  {:error, message} ->
    Appsignal.send_error(:error, %MyCustomError{ message: message }, [])
end

Métadonnées supplémentaires

Pour ajouter des métadonnées à l’erreur envoyée, passez une fonction comme quatrième argument à 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
NOTE : Appsignal.send_error/4 a été ajoutée dans AppSignal pour Elixir 2.1.0.