diff --git a/crates/client2/src/telemetry.rs b/crates/client2/src/telemetry.rs index 02dcf9842f..789b627fb0 100644 --- a/crates/client2/src/telemetry.rs +++ b/crates/client2/src/telemetry.rs @@ -28,6 +28,7 @@ struct TelemetryState { app_metadata: AppMetadata, architecture: &'static str, clickhouse_events_queue: Vec, + flush_clickhouse_events_task: Option>, log_file: Option, is_staff: Option, first_event_datetime: Option>, @@ -124,6 +125,12 @@ const MAX_QUEUE_LEN: usize = 1; #[cfg(not(debug_assertions))] const MAX_QUEUE_LEN: usize = 50; +#[cfg(debug_assertions)] +const DEBOUNCE_INTERVAL: Duration = Duration::from_secs(1); + +#[cfg(not(debug_assertions))] +const DEBOUNCE_INTERVAL: Duration = Duration::from_secs(60 * 5); + impl Telemetry { pub fn new(client: Arc, cx: &mut AppContext) -> Arc { let release_channel = if cx.has_global::() { @@ -144,6 +151,7 @@ impl Telemetry { metrics_id: None, session_id: None, clickhouse_events_queue: Default::default(), + flush_clickhouse_events_task: Default::default(), log_file: None, is_staff: None, first_event_datetime: None, @@ -424,6 +432,13 @@ impl Telemetry { if immediate_flush || state.clickhouse_events_queue.len() >= MAX_QUEUE_LEN { drop(state); self.flush_clickhouse_events(); + } else { + let this = self.clone(); + let executor = self.executor.clone(); + state.flush_clickhouse_events_task = Some(self.executor.spawn(async move { + executor.timer(DEBOUNCE_INTERVAL).await; + this.flush_clickhouse_events(); + })); } } } @@ -444,6 +459,7 @@ impl Telemetry { let mut state = self.state.lock(); state.first_event_datetime = None; let mut events = mem::take(&mut state.clickhouse_events_queue); + state.flush_clickhouse_events_task.take(); drop(state); let this = self.clone();