Skip to content

Commit 9c0ce05

Browse files
committed
Add trace-level logging via the log facade
We recently stumbled across some harder to debug issues that highlighted that the absence of logging in `vss-client-ng` can be a pain. Therefore, we here introduce logging for requests and the retry logic based on the `log` facade, which not only allows the logging to easily integrate with the Rust ecosystem, but is also a non-API breaking change allowing us to ship this in a patch release.
1 parent 5934149 commit 9c0ce05

File tree

4 files changed

+79
-8
lines changed

4 files changed

+79
-8
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ serde_json = { version = "1.0.113", default-features = false, optional = true }
3131

3232
bitcoin_hashes = "0.14.0"
3333
chacha20-poly1305 = "0.1.2"
34+
log = { version = "0.4.29", default-features = false, features = ["std"]}
3435

3536
[target.'cfg(genproto)'.build-dependencies]
3637
prost-build = { version = "0.11.3" }

src/client.rs

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@ use std::collections::HashMap;
55
use std::default::Default;
66
use std::sync::Arc;
77

8+
use log::trace;
9+
810
use crate::error::VssError;
911
use crate::headers::{get_headermap, FixedHeaders, VssHeaderProvider};
1012
use crate::types::{
1113
DeleteObjectRequest, DeleteObjectResponse, GetObjectRequest, GetObjectResponse,
1214
ListKeyVersionsRequest, ListKeyVersionsResponse, PutObjectRequest, PutObjectResponse,
1315
};
1416
use crate::util::retry::{retry, RetryPolicy};
17+
use crate::util::KeyValueVecKeyPrinter;
1518

1619
const APPLICATION_OCTET_STREAM: &str = "application/octet-stream";
1720
const DEFAULT_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(10);
@@ -77,7 +80,9 @@ impl<R: RetryPolicy<E = VssError>> VssClient<R> {
7780
pub async fn get_object(
7881
&self, request: &GetObjectRequest,
7982
) -> Result<GetObjectResponse, VssError> {
80-
retry(
83+
let request_id: u64 = rand::random();
84+
trace!("Sending GetObjectRequest {} for key {}.", request_id, request.key);
85+
let res = retry(
8186
|| async {
8287
let url = format!("{}/getObject", self.base_url);
8388
self.post_request(request, &url).await.and_then(|response: GetObjectResponse| {
@@ -92,7 +97,11 @@ impl<R: RetryPolicy<E = VssError>> VssClient<R> {
9297
},
9398
&self.retry_policy,
9499
)
95-
.await
100+
.await;
101+
if let Err(ref e) = res {
102+
trace!("GetObjectRequest {} failed: {}", request_id, e);
103+
}
104+
res
96105
}
97106

98107
/// Writes multiple [`PutObjectRequest::transaction_items`] as part of a single transaction.
@@ -102,14 +111,25 @@ impl<R: RetryPolicy<E = VssError>> VssClient<R> {
102111
pub async fn put_object(
103112
&self, request: &PutObjectRequest,
104113
) -> Result<PutObjectResponse, VssError> {
105-
retry(
114+
let request_id: u64 = rand::random();
115+
trace!(
116+
"Sending PutObjectRequest {} for transaction_items {} and delete_items {}.",
117+
request_id,
118+
KeyValueVecKeyPrinter(&request.transaction_items),
119+
KeyValueVecKeyPrinter(&request.delete_items),
120+
);
121+
let res = retry(
106122
|| async {
107123
let url = format!("{}/putObjects", self.base_url);
108124
self.post_request(request, &url).await
109125
},
110126
&self.retry_policy,
111127
)
112-
.await
128+
.await;
129+
if let Err(ref e) = res {
130+
trace!("PutObjectRequest {} failed: {}", request_id, e);
131+
}
132+
res
113133
}
114134

115135
/// Deletes the given `key` and `value` in `request`.
@@ -118,14 +138,24 @@ impl<R: RetryPolicy<E = VssError>> VssClient<R> {
118138
pub async fn delete_object(
119139
&self, request: &DeleteObjectRequest,
120140
) -> Result<DeleteObjectResponse, VssError> {
121-
retry(
141+
let request_id: u64 = rand::random();
142+
trace!(
143+
"Sending DeleteObjectRequest {} for key {:?}",
144+
request_id,
145+
request.key_value.iter().map(|t| &t.key)
146+
);
147+
let res = retry(
122148
|| async {
123149
let url = format!("{}/deleteObject", self.base_url);
124150
self.post_request(request, &url).await
125151
},
126152
&self.retry_policy,
127153
)
128-
.await
154+
.await;
155+
if let Err(ref e) = res {
156+
trace!("DeleteObjectRequest {} failed: {}", request_id, e);
157+
}
158+
res
129159
}
130160

131161
/// Lists keys and their corresponding version for a given [`ListKeyVersionsRequest::store_id`].
@@ -134,14 +164,26 @@ impl<R: RetryPolicy<E = VssError>> VssClient<R> {
134164
pub async fn list_key_versions(
135165
&self, request: &ListKeyVersionsRequest,
136166
) -> Result<ListKeyVersionsResponse, VssError> {
137-
retry(
167+
let request_id: u64 = rand::random();
168+
trace!(
169+
"Sending ListKeyVersionsRequest {} for key_prefix {:?}, page_size {:?}, page_token {:?}",
170+
request_id,
171+
request.key_prefix,
172+
request.page_size,
173+
request.page_token
174+
);
175+
let res = retry(
138176
|| async {
139177
let url = format!("{}/listKeyVersions", self.base_url);
140178
self.post_request(request, &url).await
141179
},
142180
&self.retry_policy,
143181
)
144-
.await
182+
.await;
183+
if let Err(ref e) = res {
184+
trace!("ListKeyVersionsRequest {} failed: {}", request_id, e);
185+
}
186+
res
145187
}
146188

147189
async fn post_request<Rq: Message, Rs: Message + Default>(

src/util/mod.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
use crate::types::KeyValue;
2+
use core::fmt;
3+
14
/// Contains [`StorableBuilder`] utility.
25
///
36
/// [`StorableBuilder`]: storable_builder::StorableBuilder
@@ -10,3 +13,20 @@ pub mod retry;
1013
///
1114
/// [`KeyObfuscator`]: key_obfuscator::KeyObfuscator
1215
pub mod key_obfuscator;
16+
17+
pub(crate) struct KeyValueVecKeyPrinter<'a>(pub(crate) &'a Vec<KeyValue>);
18+
19+
impl fmt::Display for KeyValueVecKeyPrinter<'_> {
20+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
21+
write!(f, "[")?;
22+
for (i, k) in self.0.iter().enumerate() {
23+
if i == self.0.len() - 1 {
24+
write!(f, "{}", &k.key)?;
25+
} else {
26+
write!(f, "{}, ", &k.key)?;
27+
}
28+
}
29+
write!(f, "]")?;
30+
Ok(())
31+
}
32+
}

src/util/retry.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use std::future::Future;
44
use std::marker::PhantomData;
55
use std::time::Duration;
66

7+
use log::trace;
8+
79
/// A function that performs and retries the given operation according to a retry policy.
810
///
911
/// **Caution**: A retry policy without the number of attempts capped by [`MaxAttemptsRetryPolicy`]
@@ -69,6 +71,12 @@ where
6971
accumulated_delay,
7072
error: &err,
7173
}) {
74+
trace!(
75+
"Operation failed on attempt {}, retrying in {}ms: {}",
76+
attempts_made,
77+
delay.as_millis(),
78+
err
79+
);
7280
tokio::time::sleep(delay).await;
7381
accumulated_delay += delay;
7482
} else {

0 commit comments

Comments
 (0)