Skip to content

Commit 7237142

Browse files
committed
Redact URLs in RPC error log messages
1 parent 61500fb commit 7237142

File tree

2 files changed

+52
-4
lines changed

2 files changed

+52
-4
lines changed

chain/ethereum/src/ethereum_adapter.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ impl EthereumAdapter {
147147
let retry_log_message =
148148
format!("trace_filter RPC call for block range: [{}..{}]", from, to);
149149
retry(retry_log_message, &logger)
150+
.redact_log_urls(true)
150151
.limit(ENV_VARS.request_retries)
151152
.timeout_secs(ENV_VARS.json_rpc_timeout.as_secs())
152153
.run(move || {
@@ -295,6 +296,7 @@ impl EthereumAdapter {
295296
let eth_adapter = self.clone();
296297
let retry_log_message = format!("eth_getLogs RPC call for block range: [{}..{}]", from, to);
297298
retry(retry_log_message, &logger)
299+
.redact_log_urls(true)
298300
.when(move |res: &Result<_, web3::error::Error>| match res {
299301
Ok(_) => false,
300302
Err(e) => !too_many_logs_fingerprints
@@ -511,6 +513,7 @@ impl EthereumAdapter {
511513
let retry_log_message = format!("eth_getCode RPC call for block {}", block_ptr);
512514

513515
retry(retry_log_message, &logger)
516+
.redact_log_urls(true)
514517
.when(|result| match result {
515518
Ok(_) => false,
516519
Err(_) => true,
@@ -546,6 +549,7 @@ impl EthereumAdapter {
546549
let retry_log_message = format!("eth_getBalance RPC call for block {}", block_ptr);
547550

548551
retry(retry_log_message, &logger)
552+
.redact_log_urls(true)
549553
.when(|result| match result {
550554
Ok(_) => false,
551555
Err(_) => true,
@@ -586,6 +590,7 @@ impl EthereumAdapter {
586590
let block_id = self.block_ptr_to_id(&block_ptr);
587591
let retry_log_message = format!("eth_call RPC call for block {}", block_ptr);
588592
retry(retry_log_message, &logger)
593+
.redact_log_urls(true)
589594
.limit(ENV_VARS.request_retries)
590595
.timeout_secs(ENV_VARS.json_rpc_timeout.as_secs())
591596
.run(move || {
@@ -765,6 +770,7 @@ impl EthereumAdapter {
765770
stream::iter_ok::<_, Error>(ids.into_iter().map(move |hash| {
766771
let web3 = web3.clone();
767772
retry(format!("load block {}", hash), &logger)
773+
.redact_log_urls(true)
768774
.limit(ENV_VARS.request_retries)
769775
.timeout_secs(ENV_VARS.json_rpc_timeout.as_secs())
770776
.run(move || {
@@ -799,6 +805,7 @@ impl EthereumAdapter {
799805

800806
async move {
801807
retry(format!("load block {}", number), &logger)
808+
.redact_log_urls(true)
802809
.limit(ENV_VARS.request_retries)
803810
.timeout_secs(ENV_VARS.json_rpc_timeout.as_secs())
804811
.run(move || {
@@ -856,6 +863,7 @@ impl EthereumAdapter {
856863
stream::iter_ok::<_, Error>(block_nums.into_iter().map(move |block_num| {
857864
let web3 = web3.clone();
858865
retry(format!("load block ptr {}", block_num), &logger)
866+
.redact_log_urls(true)
859867
.when(|res| !res.is_ok() && !detect_null_block(res))
860868
.no_limit()
861869
.timeout_secs(ENV_VARS.json_rpc_timeout.as_secs())
@@ -1140,6 +1148,7 @@ impl EthereumAdapter {
11401148
let web3 = self.web3.clone();
11411149
u64::try_from(
11421150
retry("chain_id RPC call", &logger)
1151+
.redact_log_urls(true)
11431152
.no_limit()
11441153
.timeout_secs(ENV_VARS.json_rpc_timeout.as_secs())
11451154
.run(move || {
@@ -1175,6 +1184,7 @@ impl EthereumAdapterTrait for EthereumAdapter {
11751184
let metrics = self.metrics.clone();
11761185
let provider = self.provider().to_string();
11771186
let net_version_future = retry("net_version RPC call", &logger)
1187+
.redact_log_urls(true)
11781188
.no_limit()
11791189
.timeout_secs(20)
11801190
.run(move || {
@@ -1203,6 +1213,7 @@ impl EthereumAdapterTrait for EthereumAdapter {
12031213
ENV_VARS.genesis_block_number
12041214
);
12051215
let gen_block_hash_future = retry(retry_log_message, &logger)
1216+
.redact_log_urls(true)
12061217
.no_limit()
12071218
.timeout_secs(30)
12081219
.run(move || {
@@ -1254,6 +1265,7 @@ impl EthereumAdapterTrait for EthereumAdapter {
12541265
let web3 = self.web3.clone();
12551266
Box::new(
12561267
retry("eth_getBlockByNumber(latest) no txs RPC call", logger)
1268+
.redact_log_urls(true)
12571269
.no_limit()
12581270
.timeout_secs(ENV_VARS.json_rpc_timeout.as_secs())
12591271
.run(move || {
@@ -1288,6 +1300,7 @@ impl EthereumAdapterTrait for EthereumAdapter {
12881300
let web3 = self.web3.clone();
12891301
Box::new(
12901302
retry("eth_getBlockByNumber(latest) with txs RPC call", logger)
1303+
.redact_log_urls(true)
12911304
.no_limit()
12921305
.timeout_secs(ENV_VARS.json_rpc_timeout.as_secs())
12931306
.run(move || {
@@ -1345,6 +1358,7 @@ impl EthereumAdapterTrait for EthereumAdapter {
13451358
);
13461359
Box::new(
13471360
retry(retry_log_message, &logger)
1361+
.redact_log_urls(true)
13481362
.limit(ENV_VARS.request_retries)
13491363
.timeout_secs(ENV_VARS.json_rpc_timeout.as_secs())
13501364
.run(move || {
@@ -1376,6 +1390,7 @@ impl EthereumAdapterTrait for EthereumAdapter {
13761390
);
13771391
Box::new(
13781392
retry(retry_log_message, &logger)
1393+
.redact_log_urls(true)
13791394
.no_limit()
13801395
.timeout_secs(ENV_VARS.json_rpc_timeout.as_secs())
13811396
.run(move || {
@@ -1458,6 +1473,7 @@ impl EthereumAdapterTrait for EthereumAdapter {
14581473
);
14591474
Box::new(
14601475
retry(retry_log_message, logger)
1476+
.redact_log_urls(true)
14611477
.no_limit()
14621478
.timeout_secs(ENV_VARS.json_rpc_timeout.as_secs())
14631479
.run(move || {
@@ -1525,6 +1541,7 @@ impl EthereumAdapterTrait for EthereumAdapter {
15251541
let web3 = self.web3.clone();
15261542
let logger = logger.clone();
15271543
let res = retry(retry_log_message, &logger)
1544+
.redact_log_urls(true)
15281545
.when(|res| !res.is_ok() && !detect_null_block(res))
15291546
.no_limit()
15301547
.timeout_secs(ENV_VARS.json_rpc_timeout.as_secs())
@@ -2279,6 +2296,7 @@ async fn fetch_transaction_receipts_in_batch_with_retry(
22792296
block_hash
22802297
);
22812298
retry(retry_log_message, &logger)
2299+
.redact_log_urls(true)
22822300
.limit(ENV_VARS.request_retries)
22832301
.no_logging()
22842302
.timeout_secs(ENV_VARS.json_rpc_timeout.as_secs())
@@ -2406,6 +2424,7 @@ async fn fetch_block_receipts_with_retry(
24062424

24072425
// Perform the retry operation
24082426
let receipts_option = retry(retry_log_message, &logger)
2427+
.redact_log_urls(true)
24092428
.limit(ENV_VARS.request_retries)
24102429
.timeout_secs(ENV_VARS.json_rpc_timeout.as_secs())
24112430
.run(move || web3.eth().block_receipts(BlockId::Hash(block_hash)).boxed())
@@ -2450,6 +2469,7 @@ async fn fetch_transaction_receipt_with_retry(
24502469
transaction_hash
24512470
);
24522471
retry(retry_log_message, &logger)
2472+
.redact_log_urls(true)
24532473
.limit(ENV_VARS.request_retries)
24542474
.timeout_secs(ENV_VARS.json_rpc_timeout.as_secs())
24552475
.run(move || web3.eth().transaction_receipt(transaction_hash).boxed())

graph/src/util/futures.rs

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use crate::ext::futures::FutureExtension;
22
use futures03::{Future, FutureExt, TryFutureExt};
3+
use lazy_static::lazy_static;
4+
use regex::Regex;
35
use slog::{debug, trace, warn, Logger};
46
use std::fmt::Debug;
57
use std::marker::PhantomData;
@@ -61,6 +63,7 @@ pub fn retry<I, E>(operation_name: impl ToString, logger: &Logger) -> RetryConfi
6163
log_after: 1,
6264
warn_after: 10,
6365
limit: RetryConfigProperty::Unknown,
66+
redact_log_urls: false,
6467
phantom_item: PhantomData,
6568
phantom_error: PhantomData,
6669
}
@@ -75,6 +78,7 @@ pub struct RetryConfig<I, E> {
7578
limit: RetryConfigProperty<usize>,
7679
phantom_item: PhantomData<I>,
7780
phantom_error: PhantomData<E>,
81+
redact_log_urls: bool,
7882
}
7983

8084
impl<I, E> RetryConfig<I, E>
@@ -125,6 +129,12 @@ where
125129
self
126130
}
127131

132+
/// Redact alphanumeric URLs surrounded by parens from error messages.
133+
pub fn redact_log_urls(mut self, redact_log_urls: bool) -> Self {
134+
self.redact_log_urls = redact_log_urls;
135+
self
136+
}
137+
128138
/// Set how long (in seconds) to wait for an attempt to complete before giving up on that
129139
/// attempt.
130140
pub fn timeout_secs(self, timeout_secs: u64) -> RetryConfigWithTimeout<I, E> {
@@ -173,6 +183,7 @@ where
173183
let log_after = self.inner.log_after;
174184
let warn_after = self.inner.warn_after;
175185
let limit_opt = self.inner.limit.unwrap(&operation_name, "limit");
186+
let redact_log_urls = self.inner.redact_log_urls;
176187
let timeout = self.timeout;
177188

178189
trace!(logger, "Run with retry: {}", operation_name);
@@ -184,6 +195,7 @@ where
184195
log_after,
185196
warn_after,
186197
limit_opt,
198+
redact_log_urls,
187199
move || {
188200
try_it()
189201
.timeout(timeout)
@@ -214,6 +226,7 @@ impl<I, E> RetryConfigNoTimeout<I, E> {
214226
let log_after = self.inner.log_after;
215227
let warn_after = self.inner.warn_after;
216228
let limit_opt = self.inner.limit.unwrap(&operation_name, "limit");
229+
let redact_log_urls = self.inner.redact_log_urls;
217230

218231
trace!(logger, "Run with retry: {}", operation_name);
219232

@@ -224,6 +237,7 @@ impl<I, E> RetryConfigNoTimeout<I, E> {
224237
log_after,
225238
warn_after,
226239
limit_opt,
240+
redact_log_urls,
227241
// No timeout, so all errors are inner errors
228242
move || try_it().map_err(TimeoutError::Inner),
229243
)
@@ -265,6 +279,7 @@ fn run_retry<O, E, F, R>(
265279
log_after: u64,
266280
warn_after: u64,
267281
limit_opt: Option<usize>,
282+
redact_log_urls: bool,
268283
mut try_it_with_timeout: F,
269284
) -> impl Future<Output = Result<O, TimeoutError<E>>> + Send
270285
where
@@ -311,25 +326,38 @@ where
311326

312327
// If needs retry
313328
if condition.check(&result) {
329+
let result_str = || {
330+
if redact_log_urls {
331+
lazy_static! {
332+
static ref RE: Regex =
333+
Regex::new(r#"https?://[a-zA-Z0-9\-\._:/\?#&=]+"#).unwrap();
334+
}
335+
let e = format!("{result:?}");
336+
RE.replace_all(&e, "[REDACTED]").into_owned()
337+
} else {
338+
format!("{result:?}")
339+
}
340+
};
341+
314342
if attempt_count >= warn_after {
315343
// This looks like it would be nice to de-duplicate, but if we try
316344
// to use log! slog complains about requiring a const for the log level
317345
// See also b05e1594-e408-4047-aefb-71fc60d70e8f
318346
warn!(
319347
logger,
320-
"Trying again after {} failed (attempt #{}) with result {:?}",
348+
"Trying again after {} failed (attempt #{}) with result {}",
321349
&operation_name,
322350
attempt_count,
323-
result
351+
result_str(),
324352
);
325353
} else if attempt_count >= log_after {
326354
// See also b05e1594-e408-4047-aefb-71fc60d70e8f
327355
debug!(
328356
logger,
329-
"Trying again after {} failed (attempt #{}) with result {:?}",
357+
"Trying again after {} failed (attempt #{}) with result {}",
330358
&operation_name,
331359
attempt_count,
332-
result
360+
result_str(),
333361
);
334362
}
335363

0 commit comments

Comments
 (0)