From 671d6091274dea2c41165efc202b8c212fd7cc7c Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Wed, 30 Apr 2025 12:29:47 -0500 Subject: [PATCH] Improve trace log for retryable errors (#13228) Previously, this looked like > TRACE Considering retry of error: Error { kind: WrappedReqwestError(Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("pkgs.dev.azure.com")), port: None, path: "/My-Project-Name/_packaging/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX/pypi/download/rr-config/4/rr_config-4.0.0-py3-none-any.whl", query: None, fragment: None }, WrappedReqwestError(Reqwest(reqwest::Error { kind: Status(405), url: "https://pkgs.dev.azure.com/My-Project-Name/_packaging/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX/pypi/download/rr-config/4/rr_config-4.0.0-py3-none-any.whl" }))) } --- crates/uv-client/src/base_client.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/crates/uv-client/src/base_client.rs b/crates/uv-client/src/base_client.rs index bf3628547..55a4de09a 100644 --- a/crates/uv-client/src/base_client.rs +++ b/crates/uv-client/src/base_client.rs @@ -480,7 +480,18 @@ impl RetryableStrategy for UvRetryableStrategy { /// /// These cases should be safe to retry with [`Retryable::Transient`]. pub fn is_extended_transient_error(err: &dyn Error) -> bool { - trace!("Considering retry of error: {err:?}"); + // First, try to show a nice trace log + if let Some((Some(status), Some(url))) = find_source::(&err) + .map(|request_err| (request_err.status(), request_err.url())) + { + let status = status + .canonical_reason() + .map(|reason| format!(" HTTP {status} {reason} ")) + .unwrap_or_else(|| format!(" HTTP {status} ")); + trace!("Considering retry of {status} for {url}"); + } else { + trace!("Considering retry of error: {err:?}"); + } if let Some(io) = find_source::(&err) { if io.kind() == std::io::ErrorKind::ConnectionReset