Elixir:测试 GenEvent 的错误报告
Elixir: Testing GenEvent for error reports
我有一个 GenEvent
已添加为处理程序 :error_logger.add_report_handler(HoloNet.ErrorLogger)
以便 errors/exceptions 被捕获并转发到异常监控服务。
我在事件行为中有以下代码
defmodule MyApp.ErrorLogger do
use GenEvent
@bugsnag_client Application.get_env(:my_app, :bugsnag_client)
def init(_opts), do: {:ok, self}
def handle_event({:error_report, _gl, {_pid, _type, [message | _]}}, state) do
{ error, stacktrace } = extract_exception(message[:error_info])
context = extract_context(stacktrace)
@bugsnag_client.notify(error,stacktrace, context: context, release_stage: Mix.env |> to_string)
{:ok, state}
end
def handle_event({_level, _gl, _event}, state) do
{:ok, state}
end
defp extract_exception(error_info) do
{ _, exception, _ } = error_info
exception
end
defp extract_context(stacktrace) do
stacktrace |> List.first |> elem 0
end
end
使用应用程序配置模拟发出 http 请求的客户端。
defmodule Bugsnag.Mock do
@behaviour Bugsnag
def notify(error,stacktrace, options \ []), do: nil
end
它在生产中可以正常工作,但我想进行一些测试。
我正在考虑通过使 GenServer 崩溃或引起一些异常来测试它,然后查看是否调用了通知。感觉不是很functional/Elixir,但是我想测试一下,当出现错误时,是否会捕获到错误。
我说继续吧,把事情搞砸。 :erlang.exit/2
会成功的。
OTP和监督树并不容易。测试应用程序在错误条件下的行为是必要的,如果你真的想实现长生不老药的承诺 fault-tolerance.
我有一个 GenEvent
已添加为处理程序 :error_logger.add_report_handler(HoloNet.ErrorLogger)
以便 errors/exceptions 被捕获并转发到异常监控服务。
我在事件行为中有以下代码
defmodule MyApp.ErrorLogger do
use GenEvent
@bugsnag_client Application.get_env(:my_app, :bugsnag_client)
def init(_opts), do: {:ok, self}
def handle_event({:error_report, _gl, {_pid, _type, [message | _]}}, state) do
{ error, stacktrace } = extract_exception(message[:error_info])
context = extract_context(stacktrace)
@bugsnag_client.notify(error,stacktrace, context: context, release_stage: Mix.env |> to_string)
{:ok, state}
end
def handle_event({_level, _gl, _event}, state) do
{:ok, state}
end
defp extract_exception(error_info) do
{ _, exception, _ } = error_info
exception
end
defp extract_context(stacktrace) do
stacktrace |> List.first |> elem 0
end
end
使用应用程序配置模拟发出 http 请求的客户端。
defmodule Bugsnag.Mock do
@behaviour Bugsnag
def notify(error,stacktrace, options \ []), do: nil
end
它在生产中可以正常工作,但我想进行一些测试。
我正在考虑通过使 GenServer 崩溃或引起一些异常来测试它,然后查看是否调用了通知。感觉不是很functional/Elixir,但是我想测试一下,当出现错误时,是否会捕获到错误。
我说继续吧,把事情搞砸。 :erlang.exit/2
会成功的。
OTP和监督树并不容易。测试应用程序在错误条件下的行为是必要的,如果你真的想实现长生不老药的承诺 fault-tolerance.