Move `TRACING_DURATIONS_FILE` to `EnvironmentOptions` (#16109)

<!--
Thank you for contributing to uv! To help us out with reviewing, please
consider the following:

- Does this pull request include a summary of the change? (See below.)
- Does this pull request include a descriptive title?
- Does this pull request include references to any relevant issues?
-->

## Summary

<!-- What's the purpose of the change? What does it do, and why? -->

Fixes a part of #14720

Add `TRACING_DURATIONS_FILE` to EnvironmentOptions.

## Test Plan

<!-- How was it tested? -->
This commit is contained in:
Takayuki Maeda 2025-10-04 14:09:55 +09:00 committed by GitHub
parent 241ad88051
commit 34ec30563e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 29 additions and 8 deletions

View File

@ -50,3 +50,6 @@ url = { workspace = true }
ignored = ["uv-options-metadata", "clap"]
[dev-dependencies]
[features]
tracing-durations-export = []

View File

@ -574,6 +574,8 @@ pub struct EnvironmentOptions {
pub python_install_registry: Option<bool>,
pub install_mirrors: PythonInstallMirrors,
pub log_context: Option<bool>,
#[cfg(feature = "tracing-durations-export")]
pub tracing_durations_file: Option<PathBuf>,
}
impl EnvironmentOptions {
@ -599,6 +601,10 @@ impl EnvironmentOptions {
)?,
},
log_context: parse_boolish_environment_variable(EnvVars::UV_LOG_CONTEXT)?,
#[cfg(feature = "tracing-durations-export")]
tracing_durations_file: parse_path_environment_variable(
EnvVars::TRACING_DURATIONS_FILE,
),
})
}
}
@ -676,6 +682,18 @@ fn parse_string_environment_variable(name: &'static str) -> Result<Option<String
}
}
#[cfg(feature = "tracing-durations-export")]
/// Parse a path environment variable.
fn parse_path_environment_variable(name: &'static str) -> Option<PathBuf> {
let value = std::env::var_os(name)?;
if value.is_empty() {
return None;
}
Some(PathBuf::from(value))
}
/// Populate the [`EnvironmentFlags`] from the given [`EnvironmentOptions`].
impl From<&EnvironmentOptions> for EnvironmentFlags {
fn from(options: &EnvironmentOptions) -> Self {

View File

@ -167,7 +167,7 @@ performance-memory-allocator = ["dep:uv-performance-memory-allocator"]
self-update = ["axoupdater", "uv-cli/self-update"]
# Features for development only.
tracing-durations-export = ["dep:tracing-durations-export", "uv-resolver/tracing-durations-export"]
tracing-durations-export = ["dep:tracing-durations-export", "uv-resolver/tracing-durations-export", "uv-settings/tracing-durations-export"]
# Features that only apply when running tests, no-ops otherwise.
default-tests = [

View File

@ -360,7 +360,8 @@ async fn run(mut cli: Cli) -> Result<ExitStatus> {
// Configure the `tracing` crate, which controls internal logging.
#[cfg(feature = "tracing-durations-export")]
let (durations_layer, _duration_guard) = logging::setup_durations()?;
let (durations_layer, _duration_guard) =
logging::setup_durations(environment.tracing_durations_file.as_ref())?;
#[cfg(not(feature = "tracing-durations-export"))]
let durations_layer = None::<tracing_subscriber::layer::Identity>;
logging::setup_logging(

View File

@ -14,8 +14,6 @@ use tracing_tree::time::Uptime;
use uv_cli::ColorChoice;
use uv_logging::UvFormat;
#[cfg(feature = "tracing-durations-export")]
use uv_static::EnvVars;
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub(crate) enum Level {
@ -120,12 +118,13 @@ pub(crate) fn setup_logging(
/// Setup the `TRACING_DURATIONS_FILE` environment variable to enable tracing durations.
#[cfg(feature = "tracing-durations-export")]
pub(crate) fn setup_durations() -> anyhow::Result<(
pub(crate) fn setup_durations(
tracing_durations_file: Option<&std::path::PathBuf>,
) -> anyhow::Result<(
Option<DurationsLayer<Registry>>,
Option<DurationsLayerDropGuard>,
)> {
if let Ok(location) = std::env::var(EnvVars::TRACING_DURATIONS_FILE) {
let location = std::path::PathBuf::from(location);
if let Some(location) = tracing_durations_file {
if let Some(parent) = location.parent() {
fs_err::create_dir_all(parent)
.context("Failed to create parent of TRACING_DURATIONS_FILE")?;
@ -141,7 +140,7 @@ pub(crate) fn setup_durations() -> anyhow::Result<(
..PlotConfig::default()
};
let (layer, guard) = DurationsLayerBuilder::default()
.durations_file(&location)
.durations_file(location)
.plot_file(location.with_extension("svg"))
.plot_config(plot_config)
.build()