Prhub

#50129 [Rust Frontend] Extract shared tracing setup logic into `vllm-tracing`

原始 PR 作者 BugenZhao 合并时间 2026-07-29 03:31 文件变更 8 提交数 1 评论 0 代码增减 +35 / -21

执行摘要

提取共享 tracing 设置到新 crate `vllm-tracing`

PR #48937 引入了 tracing 基准日志,但留下了重复的 subscriber 设置在 vllm-cmd 和 vllm-bench 中。本 PR 创建一个共享的 vllm-tracing crate 来统一这些设置,减少重复代码并确保一致的日志格式。

值得合并的清理式重构,展示了如何系统性地消除代码重复。开发者可关注 vllm-tracing crate 的设计,作为 workspace 内部共享 crate 的范例。

讨论亮点

无实质性 review 讨论,仅机器人自动评论和 reviewer 快速批准,表明变更清晰无争议。

实现拆解

  1. 新建 vllm-tracing crate:在 rust/src/tracing/ 下创建新的 workspace crate,将 rust/src/cmd/src/logging.rs 中的 init_tracing、build_targets_filter 和 VllmEventFormatter 搬迁至此,并将 init_tracing 的可见性从 pub(crate) 提升为 pub,同时添加 doc comment。
  2. 更新 rust/src/bench/src/main.rs:删除冗余的本地 init_tracing 定义和 TODO 注释,改为直接调用 vllm_tracing::init_tracing("Bench"),并移除不再需要的 tracing-subscriber 依赖(已在 vllm-tracing 中)。
  3. 更新 rust/src/cmd/src/main.rs:删除 mod logging 声明,改为调用 vllm_tracing::init_tracing(process_label),并移除 time 和 tracing-subscriber 依赖,改为依赖 vllm-tracing。
  4. 调整 workspace 配置:在根 Cargo.toml 中注册 vllm-tracing 成员,在相应子 crate 的 Cargo.toml 中修改依赖关系。
  5. 更新 Cargo.lock:自动更新以反映新的 crate 和依赖变化。
文件 模块 状态 重要度
rust/src/tracing/src/lib.rs Rust 日志 renamed 6.22
rust/src/bench/src/main.rs 基准测试 modified 6.2
rust/src/cmd/src/main.rs 命令行 modified 4.99
rust/src/tracing/Cargo.toml Rust 日志 added 4.27
rust/src/cmd/Cargo.toml 命令行 modified 3.17
rust/Cargo.toml Rust 工作区 modified 3.07
rust/Cargo.lock Rust 工作区 modified 2.87
rust/src/bench/Cargo.toml 基准测试 modified 3.07

关键符号

init_tracing

关键源码片段

rust/src/tracing/src/lib.rs rename-or-move

核心文件,新 crate 的入口,包含提取后的 `init_tracing` 函数。

// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: Copyright contributors to the vLLM project
​
//! 共享的 vLLM 风格 tracing subscriber 和日志格式化,用于所有 Rust 二进制文件。
​
use std::{env, fmt, process};
use time::UtcOffset;
use time::macros::format_description;
use tracing::level_filters::LevelFilter;
use tracing::{Event, Level, Subscriber};
use tracing_subscriber::Layer as _;
use tracing_subscriber::filter::Targets;
use tracing_subscriber::fmt::format::{FormatEvent, FormatFields, Writer};
use tracing_subscriber::fmt::time::FormatTime;
use tracing_subscriber::fmt::{FmtContext, FormattedFields};
use tracing_subscriber::layer::SubscriberExt as _;
use tracing_subscriber::registry::LookupSpan;
use tracing_subscriber::util::SubscriberInitExt as _;
​
const CYAN: &str = "\x1b[0;36m";
const GREY: &str = "\x1b[90m";
const GREEN: &str = "\x1b[32m";
const YELLOW: &str = "\x1b[33m";
const RED: &str = "\x1b[31m";
const WHITE: &str = "\x1b[37m";
const RESET: &str = "\x1b[0m";
const VLLM_TIME_FORMAT: &[time::format_description::FormatItem<'static>] =
    format_description!("[month]-[day] [hour]:[minute]:[second]");
​
/// 安装 process-wide 的 vLLM 风格 tracing subscriber。
/// `process_label` 会出现在日志前缀中,例如 `[Bench]`、`[RustFrontend]`。
pub fn init_tracing(process_label: &str) {
    let filter = build_targets_filter(
        env::var("VLLM_LOGGING_LEVEL").ok().as_deref(),
        env::var("RUST_LOG").ok().as_deref(),
    );
    let formatter = VllmEventFormatter::new(process_label);
​
    let _ = tracing_subscriber::registry()
        .with(
            tracing_subscriber::fmt::layer()
                .event_format(formatter)
                .with_writer(std::io::stderr)
                .with_filter(filter),
        )
        .try_init();
}
​
// build_targets_filter 和 VllmEventFormatter 定义保持原样,省略。
rust/src/bench/src/main.rs core-logic

使用新 crate 替换内联 tracing 初始化,是主要消费方之一。

// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: Copyright contributors to the vLLM project
​
#[cfg(not(target_env = "msvc"))]
#[global_allocator]
static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;
​
use anyhow::Context;
use clap::Parser;
​
#[derive(Parser)]
#[command(name = "vllm-bench", about = "Benchmark online serving throughput", version)]
struct Cli {
    #[command(flatten)]
    args: vllm_bench::BenchServeArgs,
}
​
fn main() -> anyhow::Result<()> {
    // 使用共享的 vllm_tracing crate 初始化日志,进程标签为 "Bench"
    vllm_tracing::init_tracing("Bench");
​
    let cli = Cli::parse();
    vllm_bench::prepare_process();
​
    let runtime = tokio::runtime::Builder::new_multi_thread()
        .enable_all()
        .build()
        .context("Failed to build tokio runtime")?;
​
    runtime.block_on(vllm_bench::run(cli.args))
}

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

风险极低。变更本质是代码提取和搬迁,未改变 tracing 行为。需注意:

  • init_tracing 可见性从 pub(crate) 变为 pub,但 crate 仅在 workspace 内部使用,对外不可见,无安全隐患。
  • 依赖项移除后需确保编译正确,Cargo.lock 已自动更新确认。
  • 若未来有其他 Rust 二进制文件需要 tracing,应直接使用 vllm-tracing,避免重复编写。

影响范围:仅限于 vLLM 的 Rust 前端二进制文件(vllm-rs 和 vllm-bench)。用户无感知,但开发者受益于统一的日志格式和更易维护的代码。未来新增 Rust 二进制文件时可复用同一 crate。

低风险重构 可见性变更 (pub(crate) → pub)

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论