Packages
prometheus
5.1.1
6.1.3
6.1.2
6.1.1
6.1.0
6.0.3
6.0.2
6.0.1
6.0.0
5.1.1
5.1.0
5.0.0
4.13.0
retired
4.12.0
4.11.0
4.10.0
4.9.1
4.9.0
4.8.2
4.8.1
4.8.0
4.6.0
4.5.0
4.4.1
4.4.0
4.3.0
4.2.2
4.2.0
4.1.0
4.0.1
4.0.0
3.5.1
3.5.0
3.4.6
3.4.5
3.4.4
3.4.3
3.4.2
3.4.1
3.4.0
3.3.2
3.3.1
3.3.0
3.2.3
3.2.2
3.2.1
3.1.1
3.1.0
3.0.1
3.0.0
3.0.0-rc1
3.0.0-alpha9
3.0.0-alpha8
3.0.0-alpha7
3.0.0-alpha6
3.0.0-alpha5
3.0.0-alpha4
3.0.0-alpha3
3.0.0-alpha2
3.0.0-alpha10
3.0.0-alpha1
2.2.0
2.1.0
2.0.0
1.7.0
1.6.0
1.5.0
1.0.2
1.0.1
1.0.0
0.2.0
0.1.3
0.1.2
0.1.1
0.1.0
Prometheus.io client in Erlang
Current section
Files
Jump to
Current section
Files
src/prometheus_misc.erl
%% behaviour_modules original Copyright message
%% all other code is under MIT
%%
%% This Source Code Form is subject to the terms of the Mozilla Public
%% License, v. 2.0. If a copy of the MPL was not distributed with this
%% file, You can obtain one at https://mozilla.org/MPL/2.0/.
%%
%% Copyright (c) 2007-2021 VMware, Inc. or its affiliates. All rights reserved.
-module(prometheus_misc).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-export([behaviour_modules/1]).
%% Retrieves a list of modules that implement a specified behaviour.
-spec behaviour_modules(Behaviour :: atom()) -> [module()].
behaviour_modules(Behaviour) ->
Applications = application:loaded_applications(),
Modules = lists:flatmap(fun get_modules_for_app/1, Applications),
Targets = lists:usort(Modules),
extract_behaviour_from_modules(Targets, Behaviour).
-spec get_modules_for_app({atom(), string(), string()}) -> [module()].
get_modules_for_app({App, _, _}) ->
case application:get_key(App, modules) of
{ok, Modules} -> Modules;
_ -> []
end.
-spec extract_behaviour_from_modules([module()], Behaviour :: atom()) -> [module()].
extract_behaviour_from_modules(Modules, Behaviour) ->
Filter = fun(Module) -> does_module_implement_behaviour(Module, Behaviour) end,
lists:filter(Filter, Modules).
-spec does_module_implement_behaviour(Module :: module(), Behaviour :: atom()) -> boolean().
does_module_implement_behaviour(Module, Behaviour) ->
Attributes = module_attributes(Module),
Behaviours = [Atts || {N, Atts} <- Attributes, (N =:= behaviour orelse N =:= behavior)],
lists:member(Behaviour, lists:flatten(Behaviours)).
-spec module_attributes(atom()) -> [{atom(), term()}] | [].
module_attributes(Module) ->
try
Module:module_info(attributes)
catch
error:undef -> []
end.