1- use parking_lot:: RwLock ;
2- use serde_json:: Value ;
3- #[ cfg( all( feature = "use_tokio" , feature = "realtime" ) ) ]
4- use socketio_rs:: Client ;
5- use std:: collections:: HashMap ;
6- use std:: fmt:: Debug ;
7- use std:: sync:: Arc ;
8- use tracing:: trace;
9-
101use crate :: sync:: SyncType ;
112use crate :: {
123 config:: Config ,
@@ -18,18 +9,33 @@ use crate::{FPDetail, SdkAuthorization, Toggle};
189#[ cfg( feature = "event" ) ]
1910use feature_probe_event_std:: event:: AccessEvent ;
2011#[ cfg( feature = "event" ) ]
12+ use feature_probe_event_std:: event:: CustomEvent ;
13+ #[ cfg( feature = "event" ) ]
14+ use feature_probe_event_std:: event:: Event ;
15+ #[ cfg( feature = "event" ) ]
2116use feature_probe_event_std:: recorder:: unix_timestamp;
2217#[ cfg( feature = "event" ) ]
2318use feature_probe_event_std:: recorder:: EventRecorder ;
2419#[ cfg( feature = "event_tokio" ) ]
2520use feature_probe_event_tokio:: event:: AccessEvent ;
2621#[ cfg( feature = "event_tokio" ) ]
22+ use feature_probe_event_tokio:: event:: CustomEvent ;
23+ #[ cfg( feature = "event_tokio" ) ]
24+ use feature_probe_event_tokio:: event:: Event ;
25+ #[ cfg( feature = "event_tokio" ) ]
2726use feature_probe_event_tokio:: recorder:: unix_timestamp;
2827#[ cfg( feature = "event_tokio" ) ]
2928use feature_probe_event_tokio:: recorder:: EventRecorder ;
3029#[ cfg( all( feature = "use_tokio" , feature = "realtime" ) ) ]
3130use futures_util:: FutureExt ;
32-
31+ use parking_lot:: RwLock ;
32+ use serde_json:: Value ;
33+ #[ cfg( all( feature = "use_tokio" , feature = "realtime" ) ) ]
34+ use socketio_rs:: Client ;
35+ use std:: collections:: HashMap ;
36+ use std:: fmt:: Debug ;
37+ use std:: sync:: Arc ;
38+ use tracing:: { trace, warn} ;
3339#[ cfg( all( feature = "use_tokio" , feature = "realtime" ) ) ]
3440type SocketCallback = std:: pin:: Pin < Box < dyn futures_util:: Future < Output = ( ) > + Send > > ;
3541
@@ -122,6 +128,24 @@ impl FeatureProbe {
122128 self . generic_detail ( toggle, user, default, Some )
123129 }
124130
131+ pub fn track ( & self , event_name : & str , user : & FPUser , value : Option < f64 > ) {
132+ let recorder = match self . event_recorder . as_ref ( ) {
133+ None => {
134+ warn ! ( "Event Recorder no ready." ) ;
135+ return ;
136+ }
137+ Some ( recorder) => recorder,
138+ } ;
139+ let event = CustomEvent {
140+ kind : "custom" . to_string ( ) ,
141+ time : unix_timestamp ( ) ,
142+ user : user. key ( ) ,
143+ name : event_name. to_string ( ) ,
144+ value,
145+ } ;
146+ recorder. record_event ( Event :: CustomEvent ( event) ) ;
147+ }
148+
125149 pub fn new_with ( server_key : String , repo : Repository ) -> Self {
126150 Self {
127151 config : Config {
@@ -198,26 +222,39 @@ impl FeatureProbe {
198222 . toggles
199223 . get ( toggle)
200224 . map ( |toggle| toggle. eval_detail ( user, & repo. segments ) ) ;
201-
225+ let track_access_events = match repo. toggles . get ( toggle) {
226+ Some ( toggle) => toggle. track_access_events ( ) ,
227+ None => false ,
228+ } ;
202229 #[ cfg( any( feature = "event" , feature = "event_tokio" ) ) ]
203- self . record_detail ( toggle, & detail) ;
204-
230+ self . record_detail ( toggle, user, track_access_events, & detail) ;
205231 detail
206232 }
207233
208234 #[ cfg( any( feature = "event" , feature = "event_tokio" ) ) ]
209- fn record_detail ( & self , toggle : & str , detail : & Option < EvalDetail < Value > > ) -> Option < ( ) > {
235+ fn record_detail (
236+ & self ,
237+ toggle : & str ,
238+ user : & FPUser ,
239+ track_access_events : bool ,
240+ detail : & Option < EvalDetail < Value > > ,
241+ ) -> Option < ( ) > {
210242 let recorder = self . event_recorder . as_ref ( ) ?;
211243 let detail = detail. as_ref ( ) ?;
212244 let value = detail. value . as_ref ( ) ?;
213- recorder. record_access ( AccessEvent {
245+ let event = AccessEvent {
246+ kind : "access" . to_string ( ) ,
214247 time : unix_timestamp ( ) ,
215248 key : toggle. to_owned ( ) ,
249+ user : user. key ( ) ,
216250 value : value. clone ( ) ,
217- index : detail. variation_index ,
251+ variation_index : detail. variation_index . unwrap ( ) ,
218252 version : detail. version ,
219- reason : detail. reason . clone ( ) ,
220- } ) ;
253+ rule_index : detail. rule_index ,
254+ reason : Some ( detail. reason . to_string ( ) ) ,
255+ track_access_events,
256+ } ;
257+ recorder. record_event ( Event :: AccessEvent ( event) ) ;
221258 None
222259 }
223260
0 commit comments