Add debounce time back to telemetry queue

Joseph T. Lyons created

Change summary

crates/client2/src/telemetry.rs | 16 ++++++++++++++++
1 file changed, 16 insertions(+)

Detailed changes

crates/client2/src/telemetry.rs 🔗

@@ -28,6 +28,7 @@ struct TelemetryState {
     app_metadata: AppMetadata,
     architecture: &'static str,
     clickhouse_events_queue: Vec<ClickhouseEventWrapper>,
+    flush_clickhouse_events_task: Option<Task<()>>,
     log_file: Option<NamedTempFile>,
     is_staff: Option<bool>,
     first_event_datetime: Option<DateTime<Utc>>,
@@ -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<dyn HttpClient>, cx: &mut AppContext) -> Arc<Self> {
         let release_channel = if cx.has_global::<ReleaseChannel>() {
@@ -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();