Skip to content

Commit b7ab3fa

Browse files
committed
feat: add track event api
1 parent 15bbcad commit b7ab3fa

File tree

5 files changed

+74
-30
lines changed

5 files changed

+74
-30
lines changed

Cargo.lock

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
edition = "2021"
33
name = "feature-probe-server-sdk"
4-
version = "1.2.12"
4+
version = "2.0.1"
55
license = "Apache-2.0"
66
authors = ["[email protected]"]
77
description = "FeatureProbe Server Side SDK for Rust"
@@ -44,8 +44,8 @@ thiserror = "1.0"
4444
tracing = "0.1"
4545
url = "2"
4646

47-
feature-probe-event-std = { optional = true, version = "1.1.2", package = "feature-probe-event" }
48-
feature-probe-event-tokio = { optional = true, version = "1.1.2", features = [
47+
feature-probe-event-std = { optional = true, version = "1.1.3", package = "feature-probe-event" }
48+
feature-probe-event-tokio = { optional = true, version = "1.1.3", features = [
4949
"use_tokio",
5050
], default-features = false, package = "feature-probe-event" }
5151

@@ -70,5 +70,5 @@ criterion = "0.4"
7070
rusty-hook = "^0.11.2"
7171
tokio = { version = "1", features = ["full"] }
7272
tracing-subscriber = "0.3"
73-
feature-probe-server = { version = "1.3.11", features = ["realtime"] }
73+
feature-probe-server = { version = "2.0.1", features = ["realtime"] }
7474

src/evaluate.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,10 @@ impl Toggle {
184184
self.default_serve.select_variation_value(&eval_param)
185185
}
186186

187+
pub fn track_access_events(&self) -> bool {
188+
self.track_access_events.unwrap_or(false)
189+
}
190+
187191
pub fn eval_detail(
188192
&self,
189193
user: &FPUser,

src/feature_probe.rs

Lines changed: 55 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,3 @@
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-
101
use crate::sync::SyncType;
112
use crate::{
123
config::Config,
@@ -18,18 +9,33 @@ use crate::{FPDetail, SdkAuthorization, Toggle};
189
#[cfg(feature = "event")]
1910
use 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")]
2116
use feature_probe_event_std::recorder::unix_timestamp;
2217
#[cfg(feature = "event")]
2318
use feature_probe_event_std::recorder::EventRecorder;
2419
#[cfg(feature = "event_tokio")]
2520
use 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")]
2726
use feature_probe_event_tokio::recorder::unix_timestamp;
2827
#[cfg(feature = "event_tokio")]
2928
use feature_probe_event_tokio::recorder::EventRecorder;
3029
#[cfg(all(feature = "use_tokio", feature = "realtime"))]
3130
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};
3339
#[cfg(all(feature = "use_tokio", feature = "realtime"))]
3440
type 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

tests/integration_test.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ async fn setup_server(api_port: u16, server_port: u16, realtime_port: u16, realt
8989
let events_url: Url = format!("http://0.0.0.0:{}/api/events", api_port)
9090
.parse()
9191
.unwrap();
92+
let analysis_url = None;
9293
let refresh_interval = Duration::from_secs(1);
9394
let config = ServerConfig {
9495
toggles_url,
@@ -97,6 +98,7 @@ async fn setup_server(api_port: u16, server_port: u16, realtime_port: u16, realt
9798
realtime_path,
9899
refresh_interval,
99100
keys_url: None,
101+
analysis_url: None,
100102
events_url: events_url.clone(),
101103
client_sdk_key: Some(client_sdk_key.clone()),
102104
server_sdk_key: Some(server_sdk_key.clone()),
@@ -108,6 +110,7 @@ async fn setup_server(api_port: u16, server_port: u16, realtime_port: u16, realt
108110
let feature_probe_server = FpHttpHandler {
109111
repo: repo.clone(),
110112
events_url,
113+
analysis_url,
111114
events_timeout: Duration::from_secs(1),
112115
http_client: Default::default(),
113116
};

0 commit comments

Comments
 (0)