Skip to content

Commit

Permalink
register all collectors at once, never exit when module_info fails
Browse files Browse the repository at this point in the history
  • Loading branch information
deadtrickster committed May 21, 2016
1 parent 79e5a94 commit 6853345
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 30 deletions.
30 changes: 17 additions & 13 deletions src/prometheus_misc.erl
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,12 @@

-module(prometheus_misc).

-export([all_module_attributes/1]).
-export([behaviour_modules/1]).

behaviour_modules(Behaviour) ->
[Module || {Module, Behaviours} <-
all_module_attributes(behaviour),
lists:member(Behaviour, Behaviours)].

all_module_attributes(Name) ->
Targets =
Expand All @@ -26,22 +31,21 @@ all_module_attributes(Name) ->
{App, _, _} <- application:loaded_applications(),
{ok, Modules} <- [application:get_key(App, modules)]])),
lists:foldl(
fun ({App, Module}, Acc) ->
fun ({_App, Module}, Acc) ->
case lists:append([Atts || {N, Atts} <- module_attributes(Module),
N =:= Name]) of
[] -> Acc;
Atts -> [{App, Module, Atts} | Acc]
Atts -> [{Module, Atts} | Acc]
end
end, [], Targets).

module_attributes(Module) ->
case catch Module:module_info(attributes) of
{'EXIT', {undef, [{Module, module_info, _} | _]}} ->
io:format("WARNING: module ~p not found, so not scanned for boot steps.~n",
[Module]),
[];
{'EXIT', Reason} ->
exit(Reason);
V ->
V
end.
case catch Module:module_info(attributes) of
{'EXIT', {undef, [{Module, module_info, _} | _]}} ->
[];
{'EXIT', _Reason} ->
%% return empty list too
[];
V ->
V
end.
37 changes: 21 additions & 16 deletions src/prometheus_sup.erl
Original file line number Diff line number Diff line change
Expand Up @@ -58,20 +58,20 @@ init([]) ->

create_tables() ->
Tables = [
{?PROMETHEUS_REGISTRY_TABLE, [bag, named_table, public, {read_concurrency, true}]},
{?PROMETHEUS_COUNTER_TABLE, [set, named_table, public, {write_concurrency, true}]},
{?PROMETHEUS_GAUGE_TABLE, [set, named_table, public, {write_concurrency, true}]},
{?PROMETHEUS_SUMMARY_TABLE, [set, named_table, public, {write_concurrency, true}]},
{?PROMETHEUS_HISTOGRAM_TABLE, [set, named_table, public, {write_concurrency, true}]}
{?PROMETHEUS_REGISTRY_TABLE, {bag, read_concurrency}},
{?PROMETHEUS_COUNTER_TABLE, write_concurrency},
{?PROMETHEUS_GAUGE_TABLE, write_concurrency},
{?PROMETHEUS_SUMMARY_TABLE, write_concurrency},
{?PROMETHEUS_HISTOGRAM_TABLE, write_concurrency}
],
[maybe_create_table(ets:info(Name), Name, Opts) || {Name, Opts} <- Tables],
[maybe_create_table(Name, Concurrency) || {Name, Concurrency} <- Tables],
ok.

register_collectors() ->
[Collector:register() || Collector <- enabled_collectors()].

register_metrics() ->
[Metric:register(Spec, Registry) || {Registry, Metric, Spec} <- application:get_env(prometheus, default_metrics, [])].
[Metric:register(Spec, Registry) || {Registry, Metric, Spec} <- default_metrics()].

enabled_collectors() ->
case application:get_env(prometheus, default_collectors) of
Expand All @@ -80,12 +80,17 @@ enabled_collectors() ->
end.

all_known_collectors() ->
[Module || {_App, Module, Behaviours} <-
prometheus_misc:all_module_attributes(behaviour),
not lists:member(prometheus_metric, Behaviours),
lists:member(prometheus_collector, Behaviours)].

maybe_create_table(undefined, Name, Opts) ->
ets:new(Name, Opts);
maybe_create_table(_, _, _) ->
ok.
prometheus_misc:behaviour_modules(prometheus_collector).

default_metrics() ->
application:get_env(prometheus, default_metrics, []).

maybe_create_table(Name, {Type, Concurrency}) ->
case ets:info(Name) of
undefined ->
ets:new(Name, [Type, named_table, public, {Concurrency, true}]);
_ ->
ok
end;
maybe_create_table(Name, Concurrency) ->
maybe_create_table(Name, {set, Concurrency}).
6 changes: 5 additions & 1 deletion test/eunit/prometheus_registry_tests.erl
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,11 @@ stop(ok) ->

default_registry() ->
?_assertEqual([prometheus_vm_statistics_collector,
prometheus_vm_memory_collector],
prometheus_vm_memory_collector,
prometheus_summary,
prometheus_histogram,
prometheus_gauge,
prometheus_counter],
prometheus_registry:collectors(default)).

clear_registry() ->
Expand Down

0 comments on commit 6853345

Please sign in to comment.