statsig_rust/event_logging_adapter/
event_logging_adapter_trait.rs1use std::{collections::HashMap, sync::Arc};
2
3use crate::log_event_payload::LogEventRequest;
4use crate::{StatsigErr, StatsigRuntime};
5use async_trait::async_trait;
6
7#[async_trait]
8pub trait EventLoggingAdapter: Send + Sync {
9 async fn start(&self, statsig_runtime: &Arc<StatsigRuntime>) -> Result<(), StatsigErr>;
10 async fn log_events(&self, request: LogEventRequest) -> Result<bool, StatsigErr>;
11 async fn shutdown(&self) -> Result<(), StatsigErr>;
12 fn should_schedule_background_flush(&self) -> bool;
13 fn get_observability_tags(&self) -> Option<HashMap<String, String>> {
14 None
15 }
16}
17
18#[cfg(test)]
19mod tests {
20 use serde_json::{json, Value};
21
22 use crate::event_logging::statsig_event::StatsigEvent;
23 use crate::event_logging::statsig_event_internal::StatsigEventInternal;
24 use crate::log_event_payload::{LogEventPayload, LogEventRequest};
25 use crate::statsig_metadata::StatsigMetadata;
26 use crate::user::StatsigUserInternal;
27 use crate::StatsigUser;
28
29 #[test]
30 fn test_request_jsonify() {
31 let user = StatsigUser::with_user_id("a-user".to_string());
32 let user_internal = StatsigUserInternal::new(&user, None);
33 let event = StatsigEvent {
34 event_name: "my_custom_event".to_string(),
35 value: None,
36 metadata: None,
37 statsig_metadata: None,
38 };
39
40 let event = StatsigEventInternal::new(123, user_internal.to_loggable(), event, None);
41
42 let payload = LogEventPayload {
43 events: json!([event]),
44 statsig_metadata: StatsigMetadata::get_as_json(),
45 };
46
47 let request = LogEventRequest {
48 payload,
49 event_count: 1,
50 retries: 0,
51 };
52
53 let serialized = serde_json::to_string(&request).unwrap();
54 let deserialized: Value = serde_json::from_str(&serialized).unwrap();
55
56 let event_count = deserialized.get("eventCount").unwrap().as_u64().unwrap();
57 assert_eq!(event_count, 1);
58
59 let payload_json = deserialized.get("payload").unwrap();
60
61 let statsig_metadata_json = payload_json
62 .get("statsigMetadata")
63 .unwrap()
64 .as_object()
65 .unwrap();
66
67 assert!(statsig_metadata_json.contains_key("sdkType"));
68 assert!(statsig_metadata_json.contains_key("sdkVersion"));
69 assert!(statsig_metadata_json.contains_key("sessionID"));
70
71 let events_json = payload_json.get("events").unwrap();
72 assert_eq!(events_json.as_array().unwrap().len(), 1);
73 }
74
75 #[test]
76 fn test_json_deserialization() {
77 let request_json = r#"{"payload":{"events":[{"eventName":"my_custom_event","metadata":null,"secondaryExposures":null,"time":1730831508904,"user":{"statsigEnvironment":null,"userID":"a-user"},"value":null}],"statsigMetadata":{"sdkType":"statsig-server-core","sdkVersion":"0.0.1","sessionId":"1ff863ed-a9ab-4785-bb0e-1a7b0140c040"}},"eventCount":1,"retries":0}"#;
78 let request: LogEventRequest = serde_json::from_str(request_json).unwrap();
79 assert_eq!(request.event_count, 1);
80 }
81}