Current section

Files

Jump to
telemetry src telemetry_ets.erl
Raw

src/telemetry_ets.erl

-module(telemetry_ets).
-include("telemetry.hrl").
-export([persist/1,
list_for_event/2,
list_by_prefix/2,
insert/5,
delete/2]).
persist(TID) ->
Handlers = ets:tab2list(TID),
Map = lists:foldl(fun(Handler, Acc) ->
maps:update_with(Handler#handler.event_name,
fun(L) -> [Handler | L] end,
[Handler],
Acc)
end,
#{},
Handlers),
{ok, Map}.
list_for_event(TID, EventName) ->
try
ets:lookup(TID, EventName)
catch
error:badarg ->
[]
end.
list_by_prefix(TID, EventPrefix) ->
Pattern = match_pattern_for_prefix(EventPrefix),
try
ets:match_object(TID, Pattern)
catch
error:badarg ->
[]
end.
match_pattern_for_prefix(EventPrefix) ->
#handler{event_name=match_for_prefix(EventPrefix),
_='_'}.
-dialyzer({nowarn_function, match_for_prefix/1}).
match_for_prefix([]) ->
'_';
match_for_prefix([Segment | Rest]) ->
[Segment | match_for_prefix(Rest)].
insert(TID, HandlerId, EventNames, Function, Config) ->
case ets:match(TID, #handler{id=HandlerId,
_='_'}) of
[] ->
Objects = [#handler{id=HandlerId,
event_name=EventName,
function=Function,
config=Config} || EventName <- EventNames],
ets:insert(TID, Objects),
{ok, TID};
_ ->
{error, already_exists}
end.
delete(TID, HandlerId) ->
case ets:select_delete(TID, [{#handler{id=HandlerId,
_='_'}, [], [true]}]) of
0 -> {error, not_found};
_ -> {ok, TID}
end.