From 982ae5fac2a71cd822e478a434e89c0ad41fae4b Mon Sep 17 00:00:00 2001 From: Skye Im Date: Tue, 31 May 2022 12:16:05 +0200 Subject: [PATCH 1/3] Feat: Preserve original error message in warn! logs --- src/client.rs | 57 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/src/client.rs b/src/client.rs index 594ed37..4f5ed09 100644 --- a/src/client.rs +++ b/src/client.rs @@ -695,35 +695,48 @@ where loop { debug!("poll: retrieving features"); let res = self.http.get(&endpoint).recv_json().await; - if let Ok(res) = res { - let features: Features = res; - match self.memoize(features.features) { - Ok(None) => {} - Ok(Some(metrics)) => { - if !self.disable_metric_submission { - let mut metrics_uploaded = false; - let req = self.http.post(&metrics_endpoint); - if let Ok(body) = http_types::Body::from_json(&metrics) { - let res = req.body(body).await; - if let Ok(res) = res { - if res.status().is_success() { - metrics_uploaded = true; - debug!("poll: uploaded feature metrics") + match res { + Err(e) => warn!("poll: failed to retrieve features - {:?}", e), + Ok(res) => { + let features: Features = res; + match self.memoize(features.features) { + Ok(None) => {} + Ok(Some(metrics)) => { + if !self.disable_metric_submission { + let req = self.http.post(&metrics_endpoint); + match http_types::Body::from_json(&metrics) { + Err(e) => { + warn!( + "poll: error serializing metrics for upload - {:?}", + e + ); + } + Ok(body) => { + let res = req.body(body).await; + match res { + Ok(res) => { + if res.status().is_success() { + debug!("poll: uploaded feature metrics") + } + } + Err(e) => { + warn!( + "poll: error uploading feature metrics - {:?}", + e + ); + } + } } } } - if !metrics_uploaded { - warn!("poll: error uploading feature metrics"); - } } - } - Err(_) => { - warn!("poll: failed to memoize features"); + Err(e) => { + warn!("poll: failed to memoize features - {:?}", e); + } } } - } else { - warn!("poll: failed to retrieve features"); } + let duration = Duration::from_millis(self.interval); debug!("poll: waiting {:?}", duration); Delay::new(duration).await; From 4ec212ad3dcc4a21e791eb2032450c91fae0e079 Mon Sep 17 00:00:00 2001 From: Skye Im Date: Wed, 1 Jun 2022 11:41:24 +0200 Subject: [PATCH 2/3] Refactor: Lift update into fn. Unnest everything --- src/client.rs | 90 +++++++++++++++++++++++++++------------------------ 1 file changed, 47 insertions(+), 43 deletions(-) diff --git a/src/client.rs b/src/client.rs index 4f5ed09..221b2cb 100644 --- a/src/client.rs +++ b/src/client.rs @@ -680,6 +680,52 @@ where } } + /// Poll for an update one time. + async fn poll_for_update(&self, endpoint: &str, metrics_endpoint: &str) { + debug!("poll: retrieving features"); + let features: Features = match self.http.get(&endpoint).recv_json().await { + Ok(res) => res, + Err(e) => { + warn!("poll: failed to retrieve features - {:?}", e); + return; + } + }; + + let metrics = match self.memoize(features.features) { + Ok(None) => { + return; + } + Ok(Some(metrics)) => metrics, + Err(e) => { + warn!("poll: failed to memoize features - {:?}", e); + return; + } + }; + + if !self.disable_metric_submission { + let req = self.http.post(&metrics_endpoint); + let body = match http_types::Body::from_json(&metrics) { + Err(e) => { + warn!("poll: error serializing metrics for upload - {:?}", e); + return; + } + Ok(body) => body, + }; + + let res = req.body(body).await; + match res { + Ok(res) => { + if res.status().is_success() { + debug!("poll: uploaded feature metrics") + } + } + Err(e) => { + warn!("poll: error uploading feature metrics - {:?}", e); + } + } + } + } + /// Query the API endpoint for features and push metrics /// /// Immediately and then every self.interval milliseconds the API server is @@ -693,49 +739,7 @@ where let metrics_endpoint = Metrics::endpoint(&self.api_url); self.polling.store(true, Ordering::Relaxed); loop { - debug!("poll: retrieving features"); - let res = self.http.get(&endpoint).recv_json().await; - match res { - Err(e) => warn!("poll: failed to retrieve features - {:?}", e), - Ok(res) => { - let features: Features = res; - match self.memoize(features.features) { - Ok(None) => {} - Ok(Some(metrics)) => { - if !self.disable_metric_submission { - let req = self.http.post(&metrics_endpoint); - match http_types::Body::from_json(&metrics) { - Err(e) => { - warn!( - "poll: error serializing metrics for upload - {:?}", - e - ); - } - Ok(body) => { - let res = req.body(body).await; - match res { - Ok(res) => { - if res.status().is_success() { - debug!("poll: uploaded feature metrics") - } - } - Err(e) => { - warn!( - "poll: error uploading feature metrics - {:?}", - e - ); - } - } - } - } - } - } - Err(e) => { - warn!("poll: failed to memoize features - {:?}", e); - } - } - } - } + self.poll_for_update(&endpoint, &metrics_endpoint).await; let duration = Duration::from_millis(self.interval); debug!("poll: waiting {:?}", duration); From 47183dc73e470c649b9b47198014489d42e3c24a Mon Sep 17 00:00:00 2001 From: Skye Im Date: Mon, 20 Jun 2022 11:43:46 +0200 Subject: [PATCH 3/3] Feat: Convert features response in 2 steps, log if error --- src/client.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/client.rs b/src/client.rs index 221b2cb..baa43d2 100644 --- a/src/client.rs +++ b/src/client.rs @@ -683,10 +683,22 @@ where /// Poll for an update one time. async fn poll_for_update(&self, endpoint: &str, metrics_endpoint: &str) { debug!("poll: retrieving features"); - let features: Features = match self.http.get(&endpoint).recv_json().await { + + let response = match self.http.get(&endpoint).recv_string().await { + Ok(res) => res, + Err(e) => { + warn!("poll: failed to get features - {:?}", e); + return; + } + }; + + let features: Features = match serde_json::from_str(&response) { Ok(res) => res, Err(e) => { - warn!("poll: failed to retrieve features - {:?}", e); + warn!( + "poll: failed to parse features - {:?}, original json: {:?}", + e, response + ); return; } };