1313-behaviour (gen_server ).
1414
1515-export ([start_link /0 ,
16+ lock /0 ,
1617 insert /4 ,
1718 delete /1 ,
1819 list_for_event /1 ,
2526 code_change /3 ,
2627 terminate /2 ]).
2728
29+ -compile ({inline , [impl_get / 0 ]}).
30+
2831-include (" telemetry.hrl" ).
2932
3033start_link () ->
@@ -42,21 +45,23 @@ insert(HandlerId, EventNames, Function, Config) ->
4245delete (HandlerId ) ->
4346 gen_server :call (? MODULE , {delete , HandlerId }).
4447
48+ lock () ->
49+ {Mod , State } = impl_get (),
50+ case Mod :lock (State ) of
51+ {ok , NewState } ->
52+ persistent_term :put (telemetry , {telemetry_pt , NewState }),
53+ ok ;
54+ _ ->
55+ ok
56+ end .
57+
4558impl_get () -> persistent_term :get (telemetry ).
4659
4760-spec list_for_event (telemetry :event_name ()) -> [# handler {}].
4861list_for_event (EventName ) ->
4962 case impl_get () of
50- {ets , TID } ->
51- try
52- ets :lookup (TID , EventName )
53- catch
54- error :badarg ->
55- persistent_term :erase (telemetry ),
56- ? LOG_WARNING (" Failed to lookup telemetry handlers. "
57- " Ensure the telemetry application has been started. " , []),
58- []
59- end ;
63+ {Mod , State } ->
64+ Mod :list_for_event (State , EventName );
6065 _ ->
6166 ? LOG_WARNING (" Failed to lookup telemetry handlers. "
6267 " Ensure the telemetry application has been started. " , []),
@@ -66,9 +71,8 @@ list_for_event(EventName) ->
6671-spec list_by_prefix (telemetry :event_prefix ()) -> [# handler {}].
6772list_by_prefix (EventPrefix ) ->
6873 case impl_get () of
69- {ets , TID } ->
70- Pattern = match_pattern_for_prefix (EventPrefix ),
71- ets :match_object (TID , Pattern );
74+ {Mod , State } ->
75+ Mod :list_by_prefix (State , EventPrefix );
7276 _ ->
7377 ? LOG_WARNING (" Failed to lookup telemetry handlers. "
7478 " Ensure the telemetry application has been started. " , []),
@@ -78,36 +82,27 @@ list_by_prefix(EventPrefix) ->
7882init ([]) ->
7983 TID = create_table (),
8084
81- persistent_term :put (telemetry , {ets , TID }),
85+ persistent_term :put (telemetry , {telemetry_ets , TID }),
8286
8387 {ok , []}.
8488
8589handle_call ({insert , HandlerId , EventNames , Function , Config }, _From , State ) ->
86- case impl_get () of
87- {ets , TID } ->
88- case ets :match (TID , # handler {id = HandlerId ,
89- _ = '_' }) of
90- [] ->
91- Objects = [# handler {id = HandlerId ,
92- event_name = EventName ,
93- function = Function ,
94- config = Config } || EventName <- EventNames ],
95- ets :insert (TID , Objects ),
96- {reply , ok , State };
97- _ ->
98- {reply , {error , already_exists }, State }
99- end
90+ {Mod , MState } = impl_get (),
91+ case Mod :insert (MState , HandlerId , EventNames , Function , Config ) of
92+ {ok , NewState } ->
93+ persistent_term :put (telemetry , {Mod , NewState }),
94+ {reply , ok , State };
95+ {error , _ } = Error ->
96+ {reply , Error , State }
10097 end ;
10198handle_call ({delete , HandlerId }, _From , State ) ->
102- case impl_get () of
103- {ets , TID } ->
104- case ets :select_delete (TID , [{# handler {id = HandlerId ,
105- _ = '_' }, [], [true ]}]) of
106- 0 ->
107- {reply , {error , not_found }, State };
108- _ ->
109- {reply , ok , State }
110- end
99+ {Mod , MState } = impl_get (),
100+ case Mod :delete (MState , HandlerId ) of
101+ {ok , NewState } ->
102+ persistent_term :put (telemetry , {Mod , NewState }),
103+ {reply , ok , State };
104+ {error , _ } = Error ->
105+ {reply , Error , State }
111106 end .
112107
113108handle_cast (_Msg , State ) ->
@@ -126,15 +121,5 @@ terminate(_Reason, _State) ->
126121% %
127122
128123create_table () ->
129- ets :new (? MODULE , [duplicate_bag , protected , named_table ,
124+ ets :new (? MODULE , [duplicate_bag , protected ,
130125 {keypos , # handler .event_name }, {read_concurrency , true }]).
131-
132- match_pattern_for_prefix (EventPrefix ) ->
133- # handler {event_name = match_for_prefix (EventPrefix ),
134- _ = '_' }.
135-
136- -dialyzer ({nowarn_function , match_for_prefix / 1 }).
137- match_for_prefix ([]) ->
138- '_' ;
139- match_for_prefix ([Segment | Rest ]) ->
140- [Segment | match_for_prefix (Rest )].
0 commit comments