[Rust Frontend] Add per-request timing metrics to chat and completions (#59314)

Signed-off-by: wxin <wxin@nvidia.com>
Signed-off-by: Bugen Zhao <i@bugenzhao.com>
Co-authored-by: Bugen Zhao <i@bugenzhao.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xinnywinne
2026-10-12 15:39:10 -07:00
committed by GitHub
co-authored by Bugen Zhao Claude Opus 5.5
parent 802feb6770
commit 1bc6e072b0
28 changed files with 517 additions and 25 deletions
+6
View File
@@ -348,6 +348,11 @@ pub struct SharedRuntimeArgs {
#[serde(default)]
pub enable_prompt_tokens_details: bool,
/// Include per-request timing metrics in API responses.
#[arg(long, default_missing_value = "true", num_args = 0..=1)]
#[serde(default)]
pub enable_per_request_metrics: bool,
/// If specified, API server will add X-Request-Id header to responses.
#[arg(
long,
@@ -635,6 +640,7 @@ impl SharedRuntimeArgs {
ApiServerOptions {
enable_log_requests: self.enable_log_requests,
enable_prompt_tokens_details: self.enable_prompt_tokens_details,
enable_per_request_metrics: self.enable_per_request_metrics,
enable_request_id_headers: self.enable_request_id_headers,
enable_scale_out: self.enable_scale_out,
sse_keep_alive_interval: (self.sse_keep_alive_interval > 0)
+40
View File
@@ -199,6 +199,7 @@ fn serve_args_forward_python_flags_with_separator() {
chat_template_content_format: Auto,
enable_log_requests: false,
enable_prompt_tokens_details: false,
enable_per_request_metrics: false,
enable_request_id_headers: false,
enable_scale_out: false,
sse_keep_alive_interval: 0,
@@ -970,6 +971,40 @@ fn serve_args_reject_unsupported_flag_arg() {
"#]].assert_eq(&error.to_string());
}
#[test]
fn serve_args_enable_per_request_metrics_requires_engine_stats() {
let cli = Cli::try_parse_from([
"vllm-rs",
"serve",
"Qwen/Qwen3-0.6B",
"--enable-per-request-metrics",
])
.expect("per-request metrics flag is supported");
let Command::Serve(args) = cli.command else {
panic!("expected serve args");
};
let config = args.to_frontend_config("tcp://127.0.0.1:0".into());
assert!(config.api_server_options.enable_per_request_metrics);
assert!(config.validate().is_ok());
let cli = Cli::try_parse_from([
"vllm-rs",
"serve",
"Qwen/Qwen3-0.6B",
"--enable-per-request-metrics",
"--disable-log-stats",
])
.expect("flags parse independently");
let Command::Serve(args) = cli.command else {
panic!("expected serve args");
};
let error = args.to_frontend_config("tcp://127.0.0.1:0".into()).validate().unwrap_err();
assert!(
format!("{error:#}")
.contains("--enable-per-request-metrics requires engine statistics logging")
);
}
#[test]
fn serve_args_reject_custom_generation_config_source() {
let error = Cli::try_parse_from([
@@ -1067,6 +1102,7 @@ fn frontend_args_accept_json() {
chat_template_content_format: Auto,
enable_log_requests: false,
enable_prompt_tokens_details: false,
enable_per_request_metrics: false,
enable_request_id_headers: false,
enable_scale_out: false,
sse_keep_alive_interval: 0,
@@ -1738,6 +1774,7 @@ fn serve_args_accept_handshake_aliases() {
chat_template_content_format: Auto,
enable_log_requests: false,
enable_prompt_tokens_details: false,
enable_per_request_metrics: false,
enable_request_id_headers: false,
enable_scale_out: false,
sse_keep_alive_interval: 0,
@@ -1895,6 +1932,7 @@ fn serve_frontend_config_uses_dp_address_as_advertised_host() {
api_server_options: ApiServerOptions {
enable_log_requests: false,
enable_prompt_tokens_details: false,
enable_per_request_metrics: false,
enable_request_id_headers: false,
enable_scale_out: false,
sse_keep_alive_interval: None,
@@ -1989,6 +2027,7 @@ fn serve_frontend_config_keeps_tcp_transport_for_non_local_only_topology() {
api_server_options: ApiServerOptions {
enable_log_requests: false,
enable_prompt_tokens_details: false,
enable_per_request_metrics: false,
enable_request_id_headers: false,
enable_scale_out: false,
sse_keep_alive_interval: None,
@@ -2127,6 +2166,7 @@ fn frontend_config_uses_external_coordinator_when_coordinator_address_is_present
api_server_options: ApiServerOptions {
enable_log_requests: false,
enable_prompt_tokens_details: false,
enable_per_request_metrics: false,
enable_request_id_headers: false,
enable_scale_out: false,
sse_keep_alive_interval: None,
-9
View File
@@ -476,15 +476,6 @@ pub struct ServerUnsupportedArgs {
#[arg(long)]
pub max_log_len: Option<Unsupported>,
/// If set to True, include per-request timing metrics in API responses.
#[arg(
long,
visible_alias = "no-enable-per-request-metrics",
default_missing_value = "true",
num_args = 0..=1
)]
pub enable_per_request_metrics: Option<Unsupported>,
/// If set to True, enable tracking server_load_metrics in the app state.
#[arg(
long,