Current section
Files
Jump to
Current section
Files
src/teleprom_registry.erl
-module(teleprom_registry).
-behaviour(gen_server).
-include("self.hrl").
-include_lib("eunit/include/eunit.hrl").
-export([start_link/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
-export([register_events/3]).
start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
register_events(App, EventsType, Events) ->
persistent_term:put(
iolist_to_binary([atom_to_list(App), <<"_telemetry_events:">>, atom_to_list(EventsType)]),
Events
),
gen_server:call(?MODULE, {register_events, App, EventsType, Events}).
init(_Args) ->
erlang:send(self(), register_self_events),
[Handler:register_metrics() || Handler <- event_handlers()],
{ok, #{apps => [], events => []}}.
handle_call(
{register_events, App, EventsType, Events},
_From,
#{apps := RegistredApps, events := RegistredEvents} = State
) ->
NewApplications = lists:usort([App] ++ RegistredApps),
NewEventsList = lists:usort(Events ++ RegistredEvents),
[
Handler:init(#{apps => NewApplications, new_events => {EventsType, Events}})
|| Handler <- event_handlers()
],
{reply, ok, State#{apps => NewApplications, events => NewEventsList}};
handle_call(_Request, _From, State) -> {reply, ok, State}.
handle_cast(_Msg, State) -> {noreply, State}.
handle_info(register_self_events, State) ->
spawn(fun register_telemetry_events/0),
{noreply, State};
handle_info(_Info, State) -> {noreply, State}.
terminate(_Reason, _State) -> ok.
code_change(_OldVsn, State, _Extra) -> {ok, State}.
register_telemetry_events() ->
?REGISTER_APP_EVENTS(teleprom, positive, ?TELEPROM_POSITIVE_TELEMETRY_EVENTS),
?REGISTER_APP_EVENTS(teleprom, negative, ?TELEPROM_NEGATIVE_TELEMETRY_EVENTS),
?REGISTER_APP_EVENTS(teleprom, all, ?TELEPROM_ALL_TELEMETRY_EVENTS),
?EXEC_TELEMETRY(?TELEPROM_REGISTER_SELF_EVENTS),
ok.
event_handlers() -> application:get_env(teleprom, event_handlers, []).