Skip to content

Commit 910e659

Browse files
authored
fix: flush telemetry events more often and rate limit (#606)
1 parent 4270d1e commit 910e659

File tree

2 files changed

+18
-5
lines changed

2 files changed

+18
-5
lines changed

crates/fig_api_client/src/clients/shared.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::time::Duration;
22

33
use aws_config::Region;
4+
use aws_config::retry::RetryConfig;
45
use aws_config::timeout::TimeoutConfig;
56
use aws_credential_types::Credentials;
67
use aws_credential_types::provider::ProvideCredentials;
@@ -42,6 +43,7 @@ async fn base_sdk_config(region: Region, credentials_provider: impl ProvideCrede
4243
.region(region)
4344
.credentials_provider(credentials_provider)
4445
.timeout_config(timeout_config())
46+
.retry_config(RetryConfig::adaptive())
4547
.load()
4648
.await
4749
}

crates/figterm/src/inline/mod.rs

+16-5
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ static DEBOUNCE_DURATION: LazyLock<Duration> = LazyLock::new(|| {
8080

8181
pub async fn on_prompt() {
8282
COMPLETION_CACHE.lock().await.clear();
83-
TELEMETRY_QUEUE.lock().await.send_all_items().await;
83+
TELEMETRY_QUEUE.lock().await.send_all_items(None).await;
8484
}
8585

8686
struct TelemetryQueue {
@@ -92,13 +92,17 @@ impl TelemetryQueue {
9292
Self { items: Vec::new() }
9393
}
9494

95-
async fn send_all_items(&mut self) {
95+
async fn send_all_items(&mut self, retain: Option<usize>) {
9696
let start_url = fig_auth::builder_id_token()
9797
.await
9898
.ok()
9999
.flatten()
100100
.and_then(|t| t.start_url);
101-
for item in self.items.drain(..) {
101+
102+
let items_len = self.items.len();
103+
let drain_len = retain.map_or(items_len, |n| items_len.saturating_sub(n));
104+
105+
for item in self.items.drain(..drain_len) {
102106
let TelemetryQueueItem {
103107
timestamp,
104108
session_id,
@@ -133,6 +137,9 @@ impl TelemetryQueue {
133137
.await,
134138
)
135139
.await;
140+
141+
// prevent more than 2 events per second
142+
tokio::time::sleep(Duration::from_millis(500)).await;
136143
}
137144
}
138145
}
@@ -300,7 +307,8 @@ pub async fn handle_request(
300307
let completion = completion.clone();
301308
let buffer = buffer.to_owned();
302309
async move {
303-
TELEMETRY_QUEUE.lock().await.items.push(TelemetryQueueItem {
310+
let mut queue = TELEMETRY_QUEUE.lock().await;
311+
queue.items.push(TelemetryQueueItem {
304312
suggested_chars_len: completion.chars().count() as i32,
305313
number_of_recommendations,
306314
suggestion: completion,
@@ -312,6 +320,9 @@ pub async fn handle_request(
312320
edit_buffer_len: buffer.chars().count().try_into().ok(),
313321
buffer,
314322
});
323+
// flush all but 4 messages, this is to retain messages that might have
324+
// an accept waiting
325+
queue.send_all_items(Some(4)).await;
315326
}
316327
});
317328

@@ -356,7 +367,7 @@ pub async fn handle_accept(figterm_request: InlineShellCompletionAcceptRequest,
356367
item.suggestion_state = SuggestionState::Accept;
357368
}
358369
}
359-
queue.send_all_items().await;
370+
queue.send_all_items(None).await;
360371
}
361372

362373
pub async fn handle_set_enabled(figterm_request: InlineShellCompletionSetEnabledRequest, _session_id: String) {

0 commit comments

Comments
 (0)