1010-compile ({inline , [next / 2 ]}).
1111
1212-export ([init_cache_config /2 , get_cache_scope /1 , erase_cache_config /1 ]).
13+ -export ([is_member /2 , get_entry /2 ]).
1314-export ([is_member_span /2 , get_entry_span /2 , put_entry_front /3 , merge_entry /3 ]).
1415-export ([delete_entry /2 , delete_pattern /2 ]).
1516-export ([purge_last_segment_and_rotate /1 ]).
1617
1718-record (segmented_cache , {
1819 scope :: segmented_cache :scope (),
1920 name :: segmented_cache :name (),
21+ telemetry_name :: [segmented_cache :name ()],
2022 strategy = fifo :: segmented_cache :strategy (),
2123 entries_limit = infinity :: segmented_cache :entries_limit (),
2224 index :: atomics :atomics_ref (),
@@ -43,15 +45,18 @@ init_cache_config(Name, Opts0) ->
4345 entries_limit := EntriesLimit ,
4446 segment_num := N ,
4547 ttl := TTL ,
46- merger_fun := MergerFun
47- } = Opts = assert_parameters (Opts0 ),
48+ merger_fun := MergerFun ,
49+ prefix := TelemetryPrefix
50+ } = Opts = assert_parameters (Name , Opts0 ),
4851 SegmentOpts = ets_settings (Opts ),
4952 SegmentsList = lists :map (fun (_ ) -> ets :new (undefined , SegmentOpts ) end , lists :seq (1 , N )),
5053 Segments = list_to_tuple (SegmentsList ),
5154 Index = atomics :new (1 , [{signed , false }]),
5255 atomics :put (Index , 1 , 1 ),
56+ TelemetryEventName = TelemetryPrefix ++ [request ],
5357 Config = # segmented_cache {
5458 scope = Scope ,
59+ telemetry_name = TelemetryEventName ,
5560 name = Name ,
5661 strategy = Strategy ,
5762 index = Index ,
@@ -83,17 +88,34 @@ persist_cache_config(Name, Config) ->
8388% % ETS checks
8489% %====================================================================
8590
86- -spec is_member_span (segmented_cache :name (), segmented_cache :key ()) -> span ().
87- is_member_span (Name , Key ) when is_atom (Name ) ->
91+ -spec is_member (segmented_cache :name (), segmented_cache :key ()) -> boolean ().
92+ is_member (Name , Key ) when is_atom (Name ) ->
93+ # segmented_cache {telemetry_name = Prefix } = SegmentRecord = get_cache_config (Name ),
94+ Span = is_member_span (SegmentRecord , Key ),
95+ telemetry :span (Prefix , #{name => Name , type => is_member }, Span ).
96+
97+ -spec get_entry (segmented_cache :name (), segmented_cache :key ()) ->
98+ segmented_cache :value () | not_found .
99+ get_entry (Name , Key ) when is_atom (Name ) ->
100+ # segmented_cache {telemetry_name = Prefix } = SegmentRecord = get_cache_config (Name ),
101+ Span = get_entry_span (SegmentRecord , Key ),
102+ telemetry :span (Prefix , #{name => Name , type => get_entry }, Span ).
103+
104+ -spec is_member_span (config (), segmented_cache :key ()) -> span ().
105+ is_member_span (Config , Key ) ->
88106 fun () ->
89- Value = iterate_fun_in_tables (Name , Key , fun segmented_cache_callbacks :is_member_ets_fun /2 ),
107+ Value = iterate_fun_in_tables (
108+ Config , Key , fun segmented_cache_callbacks :is_member_ets_fun /2
109+ ),
90110 {Value , #{hit => Value =:= true }}
91111 end .
92112
93- -spec get_entry_span (segmented_cache : name (), segmented_cache :key ()) -> span ().
94- get_entry_span (Name , Key ) when is_atom ( Name ) ->
113+ -spec get_entry_span (config (), segmented_cache :key ()) -> span ().
114+ get_entry_span (Config , Key ) ->
95115 fun () ->
96- Value = iterate_fun_in_tables (Name , Key , fun segmented_cache_callbacks :get_entry_ets_fun /2 ),
116+ Value = iterate_fun_in_tables (
117+ Config , Key , fun segmented_cache_callbacks :get_entry_ets_fun /2
118+ ),
97119 {Value , #{hit => Value =/= not_found }}
98120 end .
99121
@@ -115,7 +137,7 @@ merge_entry(Name, Key, Value) when is_atom(Name) ->
115137 false -> {continue , false }
116138 end
117139 end ,
118- case iterate_fun_in_tables (Name , Key , F ) of
140+ case iterate_fun_in_tables (SegmentRecord , Key , F ) of
119141 true -> true ;
120142 false -> do_put_entry_front (SegmentRecord , Key , Value , 3 )
121143 end .
@@ -133,24 +155,24 @@ delete_pattern(Name, Pattern) when is_atom(Name) ->
133155 Type :: entry | pattern ,
134156 IterativeFun :: iterative_fun (Key , dynamic ()).
135157delete_request (Name , Value , Type , Fun ) ->
158+ # segmented_cache {telemetry_name = Prefix } = SegmentRecord = get_cache_config (Name ),
136159 try
137- iterate_fun_in_tables (Name , Value , Fun )
160+ iterate_fun_in_tables (SegmentRecord , Value , Fun )
138161 catch
139162 Class :Reason ->
140163 Metadata = #{
141164 name => Name , delete_type => Type , value => Value , class => Class , reason => Reason
142165 },
143- telemetry :execute ([ segmented_cache , Name , delete_error ], #{}, Metadata )
166+ telemetry :execute (Prefix ++ [ delete_error ], #{}, Metadata )
144167 end .
145168
146169% %====================================================================
147170% % Internals
148171% %====================================================================
149172
150- -spec iterate_fun_in_tables (segmented_cache : name (), Key , IterativeFun ) -> Value when
173+ -spec iterate_fun_in_tables (config (), Key , IterativeFun ) -> Value when
151174 IterativeFun :: iterative_fun (Key , Value ).
152- iterate_fun_in_tables (Name , Key , IterativeFun ) ->
153- SegmentRecord = get_cache_config (Name ),
175+ iterate_fun_in_tables (SegmentRecord , Key , IterativeFun ) ->
154176 Segments = SegmentRecord # segmented_cache .segments ,
155177 Size = tuple_size (Segments ),
156178 CurrentIndex = atomics :get (SegmentRecord # segmented_cache .index , 1 ),
@@ -318,8 +340,8 @@ purge_last_segment_and_rotate(Name) ->
318340 atomics :put (SegmentRecord # segmented_cache .index , 1 , NewIndex ),
319341 NewIndex .
320342
321- -spec assert_parameters (segmented_cache :opts ()) -> segmented_cache :opts ().
322- assert_parameters (Opts0 ) when is_map (Opts0 ) ->
343+ -spec assert_parameters (segmented_cache :name (), segmented_cache : opts ()) -> segmented_cache :opts ().
344+ assert_parameters (Name , Opts0 ) when is_map (Opts0 ) ->
323345 #{
324346 scope := Scope ,
325347 strategy := Strategy ,
@@ -328,6 +350,8 @@ assert_parameters(Opts0) when is_map(Opts0) ->
328350 ttl := TTL0 ,
329351 merger_fun := MergerFun
330352 } = Opts = maps :merge (defaults (), Opts0 ),
353+ TelemetryEventName = maps :get (prefix , Opts0 , [segmented_cache , Name ]),
354+ true = is_list (TelemetryEventName ),
331355 TTL =
332356 case TTL0 of
333357 infinity -> infinity ;
@@ -343,7 +367,7 @@ assert_parameters(Opts0) when is_map(Opts0) ->
343367 true = (Strategy =:= fifo ) orelse (Strategy =:= lru ),
344368 true = is_function (MergerFun , 2 ),
345369 true = (undefined =/= whereis (Scope )),
346- Opts #{ttl := TTL }.
370+ Opts #{ttl := TTL , prefix => TelemetryEventName }.
347371
348372is_pos_int_or_infinity (Value ) ->
349373 (Value =:= infinity ) orelse (is_integer (Value ) andalso 0 < Value ).
0 commit comments