Skip to content

Commit baa984a

Browse files
authored
Merge pull request #38 from FeatureProbe/event_analysis
Add track event api
2 parents 15bbcad + 1773cf3 commit baa984a

File tree

5 files changed

+73
-39
lines changed

5 files changed

+73
-39
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: 54 additions & 27 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,
@@ -15,20 +6,25 @@ use crate::{
156
use crate::{sync::Synchronizer, FPConfig};
167
use crate::{sync::UpdateCallback, user::FPUser};
178
use crate::{FPDetail, SdkAuthorization, Toggle};
9+
use event::event::AccessEvent;
10+
use event::event::CustomEvent;
11+
use event::event::Event;
12+
use event::recorder::unix_timestamp;
13+
use event::recorder::EventRecorder;
1814
#[cfg(feature = "event")]
19-
use feature_probe_event_std::event::AccessEvent;
20-
#[cfg(feature = "event")]
21-
use feature_probe_event_std::recorder::unix_timestamp;
22-
#[cfg(feature = "event")]
23-
use feature_probe_event_std::recorder::EventRecorder;
24-
#[cfg(feature = "event_tokio")]
25-
use feature_probe_event_tokio::event::AccessEvent;
26-
#[cfg(feature = "event_tokio")]
27-
use feature_probe_event_tokio::recorder::unix_timestamp;
15+
use feature_probe_event_std as event;
2816
#[cfg(feature = "event_tokio")]
29-
use feature_probe_event_tokio::recorder::EventRecorder;
17+
use feature_probe_event_tokio as event;
3018
#[cfg(all(feature = "use_tokio", feature = "realtime"))]
3119
use futures_util::FutureExt;
20+
use parking_lot::RwLock;
21+
use serde_json::Value;
22+
#[cfg(all(feature = "use_tokio", feature = "realtime"))]
23+
use socketio_rs::Client;
24+
use std::collections::HashMap;
25+
use std::fmt::Debug;
26+
use std::sync::Arc;
27+
use tracing::{trace, warn};
3228

3329
#[cfg(all(feature = "use_tokio", feature = "realtime"))]
3430
type SocketCallback = std::pin::Pin<Box<dyn futures_util::Future<Output = ()> + Send>>;
@@ -122,6 +118,24 @@ impl FeatureProbe {
122118
self.generic_detail(toggle, user, default, Some)
123119
}
124120

121+
pub fn track(&self, event_name: &str, user: &FPUser, value: Option<f64>) {
122+
let recorder = match self.event_recorder.as_ref() {
123+
None => {
124+
warn!("Event Recorder no ready.");
125+
return;
126+
}
127+
Some(recorder) => recorder,
128+
};
129+
let event = CustomEvent {
130+
kind: "custom".to_string(),
131+
time: unix_timestamp(),
132+
user: user.key(),
133+
name: event_name.to_string(),
134+
value,
135+
};
136+
recorder.record_event(Event::CustomEvent(event));
137+
}
138+
125139
pub fn new_with(server_key: String, repo: Repository) -> Self {
126140
Self {
127141
config: Config {
@@ -198,26 +212,39 @@ impl FeatureProbe {
198212
.toggles
199213
.get(toggle)
200214
.map(|toggle| toggle.eval_detail(user, &repo.segments));
201-
215+
let track_access_events = match repo.toggles.get(toggle) {
216+
Some(toggle) => toggle.track_access_events(),
217+
None => false,
218+
};
202219
#[cfg(any(feature = "event", feature = "event_tokio"))]
203-
self.record_detail(toggle, &detail);
204-
220+
self.record_detail(toggle, user, track_access_events, &detail);
205221
detail
206222
}
207223

208224
#[cfg(any(feature = "event", feature = "event_tokio"))]
209-
fn record_detail(&self, toggle: &str, detail: &Option<EvalDetail<Value>>) -> Option<()> {
225+
fn record_detail(
226+
&self,
227+
toggle: &str,
228+
user: &FPUser,
229+
track_access_events: bool,
230+
detail: &Option<EvalDetail<Value>>,
231+
) -> Option<()> {
210232
let recorder = self.event_recorder.as_ref()?;
211233
let detail = detail.as_ref()?;
212234
let value = detail.value.as_ref()?;
213-
recorder.record_access(AccessEvent {
235+
let event = AccessEvent {
236+
kind: "access".to_string(),
214237
time: unix_timestamp(),
215238
key: toggle.to_owned(),
239+
user: user.key(),
216240
value: value.clone(),
217-
index: detail.variation_index,
241+
variation_index: detail.variation_index.unwrap(),
218242
version: detail.version,
219-
reason: detail.reason.clone(),
220-
});
243+
rule_index: detail.rule_index,
244+
reason: Some(detail.reason.to_string()),
245+
track_access_events,
246+
};
247+
recorder.record_event(Event::AccessEvent(event));
221248
None
222249
}
223250

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)