Prhub

#45465 [Bugfix][Rust Frontend] Make metrics respect --served-model-name

原始 PR 作者 reidliu41 合并时间 2026-06-15 16:05 文件变更 2 提交数 1 评论 0 代码增减 +118 / -9

执行摘要

修复 Rust 前端指标未使用 --served-model-name

根据PR描述,例如使用--served-model-name my-model启动Qwen/Qwen3-0.6B时,前端指标应显示model_name="my-model"而非model_name="Qwen/Qwen3-0.6B"。之前Rust前端未遵循该配置,导致监控数据与用户预期不符。

值得合并,逻辑简洁、测试充分。设计上选择在构建状态时一次性解析名称,避免运行时检查,值得借鉴。

讨论亮点

该PR无review评论,BugenZhao直接给出LGTM并批准合并,说明变更清晰、无争议。

实现拆解

  1. 在rust/src/server/src/lib.rs中新增effective_served_model_names函数,当served_model_name为空时回退到后端模型路径,否则直接返回用户指定的名称列表。
  2. 在build_state中提前调用该函数,提取served_model_names[0]作为metrics_model_name用于指标标签。
  3. 修改EngineCoreClientConfig的model_name字段,从config.model改为metrics_model_name,使客户端连通阶段即使用正确的公共名称。
  4. 在rust/src/server/src/routes/tests.rs中新增集成测试request_metrics_use_served_model_name_label,构造mock engine并验证指标vllm:request_success_total的model_name标签值为served-model-metrics而非后端名称。
文件 模块 状态 重要度
rust/src/server/src/lib.rs Rust 前端 modified 7.89
rust/src/server/src/routes/tests.rs Rust 前端 modified 7.48

关键符号

effective_served_model_names request_metrics_use_served_model_name_label

关键源码片段

rust/src/server/src/lib.rs core-logic

核心逻辑变更:新增 effective_served_model_names 函数,修改 build_state 中模型名称解析和传递,直接影响指标标签。

/// Resolve the public model names accepted by the frontend.
fn effective_served_model_names(model: &str, served_model_name: &[String]) -> Vec<String> {
    // 如果用户没有指定 served model name,则回退到后端模型路径
    if served_model_name.is_empty() {
        vec![model.to_string()]
    } else {
        // 使用用户指定的公共名称作为指标标签
        served_model_name.to_vec()
    }
}
​
/// Build the shared application state for one configured model and one engine client.
async fn build_state(config: &Config) -> Result<Arc<AppState>> {
    // 先解析有效的 served model names,并取第一个作为 metrics 标签
    let served_model_names = effective_served_model_names(&config.model, &config.served_model_name);
    let metrics_model_name = served_model_names[0].clone();
​
    // ... 其他初始化逻辑 ...
​
    // 关键变更:将 EngineCoreClientConfig 的 model_name 从 config.model 改为 metrics_model_name
    let client = EngineCoreClient::connect(EngineCoreClientConfig {
        transport_mode: config.transport_mode.clone(),
        coordinator_mode,
        model_name: metrics_model_name, // 之前是 config.model.clone()
        client_index: 0,
    })
    .await
    .context("failed to connect to engine core")?;
​
    // ...
}
rust/src/server/src/routes/tests.rs entrypoint

新增集成测试,验证指标 label 正确性,确保变更有效且防止回归。

#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
#[serial]
async fn request_metrics_use_served_model_name_label() {
    // 建立 mock engine,模拟请求响应
    let ipc = IpcNamespace::new().expect("create ipc namespace");
    // ... 初始化 ...
    let client = EngineCoreClient::connect(
        EngineCoreClientConfig::new_single(handshake_address)
            .with_model_name("served-model-metrics") // 模型标签为 served name
            // ...
    )
    .await
    .expect("connect client");
    // 创建 AppState 时使用两个 served model names,第一个作为指标标签
    let mut app = build_router(Arc::new(AppState::new(
        vec![
            "served-model-metrics".to_string(),
            "served-model-alias".to_string(),
        ],
        chat,
    )));
    let before = METRICS.render().unwrap();
​
    // 发送请求时使用第二个名称(别名),但指标应记录第一个作为 model_name
    let response = app
        .call(
            Request::builder()
                .method("POST")
                .uri("/v1/chat/completions")
                .header("content-type", "application/json")
                .body(Body::from(
                    json!({
                        "model": "served-model-alias", // 请求使用别名
                        // ...
                    })
                    .to_string(),
                ))
                .expect("build request"),
        )
        .await
        .expect("call app");
​
    assert_eq!(response.status(), StatusCode::OK);
    // 渲染指标并断言指标包含正确的 model_name 标签
    let after = METRICS.render().unwrap();
    assert_eq!(
        metric_delta(
            &before,
            &after,
            "vllm:request_success_total",
            Some("model_name=\"served-model-metrics\",engine=\"0\",finished_reason=\"stop\""),
        ),
        1.0
    );
    // ...
}

评论区精华

无讨论 other

PR 直接获得批准,无评论。

结论:审核者 BugenZhao 批准。 · 已解决

风险与影响

变更集中在Rust前端内部的模型名称传递,不涉及后端模型加载或推理核心路径。metrics_model_name仅在初始化时决定,运行时不变,因此性能无影响。新增测试覆盖了单一请求场景下的指标标签,但未覆盖并发或流式场景。整体风险较低。

影响使用Rust前端且指定--served-model-name的用户,现在相关指标(如请求成功数、延迟)的标签将正确反映公共模型名称,提升监控可读性和一致性。对其他用户(不指定served model name或无Rust前端用户)无影响。

低风险 测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论