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
-
10
1
use crate :: sync:: SyncType ;
11
2
use crate :: {
12
3
config:: Config ,
@@ -18,18 +9,33 @@ use crate::{FPDetail, SdkAuthorization, Toggle};
18
9
#[ cfg( feature = "event" ) ]
19
10
use feature_probe_event_std:: event:: AccessEvent ;
20
11
#[ 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" ) ]
21
16
use feature_probe_event_std:: recorder:: unix_timestamp;
22
17
#[ cfg( feature = "event" ) ]
23
18
use feature_probe_event_std:: recorder:: EventRecorder ;
24
19
#[ cfg( feature = "event_tokio" ) ]
25
20
use feature_probe_event_tokio:: event:: AccessEvent ;
26
21
#[ 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" ) ]
27
26
use feature_probe_event_tokio:: recorder:: unix_timestamp;
28
27
#[ cfg( feature = "event_tokio" ) ]
29
28
use feature_probe_event_tokio:: recorder:: EventRecorder ;
30
29
#[ cfg( all( feature = "use_tokio" , feature = "realtime" ) ) ]
31
30
use 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} ;
33
39
#[ cfg( all( feature = "use_tokio" , feature = "realtime" ) ) ]
34
40
type SocketCallback = std:: pin:: Pin < Box < dyn futures_util:: Future < Output = ( ) > + Send > > ;
35
41
@@ -122,6 +128,24 @@ impl FeatureProbe {
122
128
self . generic_detail ( toggle, user, default, Some )
123
129
}
124
130
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
+
125
149
pub fn new_with ( server_key : String , repo : Repository ) -> Self {
126
150
Self {
127
151
config : Config {
@@ -198,26 +222,39 @@ impl FeatureProbe {
198
222
. toggles
199
223
. get ( toggle)
200
224
. 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
+ } ;
202
229
#[ cfg( any( feature = "event" , feature = "event_tokio" ) ) ]
203
- self . record_detail ( toggle, & detail) ;
204
-
230
+ self . record_detail ( toggle, user, track_access_events, & detail) ;
205
231
detail
206
232
}
207
233
208
234
#[ 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 < ( ) > {
210
242
let recorder = self . event_recorder . as_ref ( ) ?;
211
243
let detail = detail. as_ref ( ) ?;
212
244
let value = detail. value . as_ref ( ) ?;
213
- recorder. record_access ( AccessEvent {
245
+ let event = AccessEvent {
246
+ kind : "access" . to_string ( ) ,
214
247
time : unix_timestamp ( ) ,
215
248
key : toggle. to_owned ( ) ,
249
+ user : user. key ( ) ,
216
250
value : value. clone ( ) ,
217
- index : detail. variation_index ,
251
+ variation_index : detail. variation_index . unwrap ( ) ,
218
252
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) ) ;
221
258
None
222
259
}
223
260
0 commit comments