Current section

Files

Jump to
bugsnag_erlang src bugsnag_app.erl
Raw

src/bugsnag_app.erl

-module(bugsnag_app).
-moduledoc false.
-include_lib("kernel/include/logger.hrl").
-behaviour(application).
-export([start/2, stop/1]).
-spec start(application:start_type(), term()) -> supervisor:startlink_ret() | {error, no_api_key}.
start(_Type, _Args) ->
case is_enabled() of
true ->
?LOG_INFO(#{what => starting_bugsnag}),
do_start();
false ->
%% we still need to start the sup to comply with the application behaviour
?LOG_INFO(#{what => bugsnag_disabled}),
bugsnag_sup:start_link(disabled)
end.
-spec stop(_) -> ok.
stop(_State) ->
?LOG_INFO(#{what => stopping_bugsnag}),
ok.
-spec do_start() -> supervisor:startlink_ret() | {error, no_api_key}.
do_start() ->
case get_api_key() of
error ->
{error, no_api_key};
ApiKey ->
Level = get_level(),
Opts = #{
api_key => ApiKey,
release_stage => get_release_state(),
name => get_handler_name(),
pool_size => get_pool_size(),
events_limit => get_events_limit(),
notifier_name => get_notifier_name(),
app_version => get_app_version()
},
bugsnag_sup:start_link(#{level => Level, config => Opts})
end.
-spec is_enabled() -> boolean().
is_enabled() ->
{ok, true} =:= application:get_env(bugsnag_erlang, enabled).
-spec get_level() -> logger:level().
get_level() ->
case application:get_env(bugsnag_erlang, level) of
undefined ->
error;
{ok, L} when
debug =:= L;
info =:= L;
notice =:= L;
warning =:= L;
error =:= L;
critical =:= L;
alert =:= L;
emergency =:= L
->
L
end.
-spec get_release_state() -> binary().
get_release_state() ->
MaybeValue = application:get_env(bugsnag_erlang, release_state, production),
case io_lib:latin1_char_list(MaybeValue) of
true ->
list_to_binary(MaybeValue);
false ->
case is_atom(MaybeValue) of
true -> atom_to_binary(MaybeValue, utf8);
false -> <<"production">>
end
end.
-spec get_api_key() -> binary() | error.
get_api_key() ->
case application:get_env(bugsnag_erlang, api_key) of
{ok, "ENTER_API_KEY"} ->
error;
{ok, Value} when is_binary(Value) ->
Value;
{ok, Value} when is_list(Value) ->
case io_lib:latin1_char_list(Value) of
true -> list_to_binary(Value);
false -> error
end;
_ ->
error
end.
-spec get_handler_name() -> atom().
get_handler_name() ->
case application:get_env(bugsnag_erlang, handler_name) of
undefined ->
bugsnag_logger_handler;
{ok, Value} when is_atom(Value) ->
Value
end.
-spec get_pool_size() -> pos_integer().
get_pool_size() ->
case application:get_env(bugsnag_erlang, pool_size) of
undefined ->
erlang:system_info(schedulers);
{ok, Value} when is_integer(Value), Value >= 1 ->
Value
end.
-spec get_events_limit() -> pos_integer().
get_events_limit() ->
case application:get_env(bugsnag_erlang, events_limit) of
undefined ->
1000;
{ok, Value} when is_integer(Value), Value >= 1 ->
Value
end.
-spec get_notifier_name() -> binary().
get_notifier_name() ->
case application:get_env(bugsnag_erlang, notifier_name) of
undefined ->
<<"Bugsnag Erlang">>;
{ok, Value} when is_binary(Value) ->
Value
end.
-spec get_app_version() -> binary() | undefined.
get_app_version() ->
case application:get_env(bugsnag_erlang, app_version) of
{ok, Value} when is_binary(Value) ->
Value;
{ok, Value} when is_list(Value) ->
case io_lib:latin1_char_list(Value) of
true -> list_to_binary(Value);
false -> undefined
end;
_ ->
undefined
end.