feat(usage): 新增输出速度统计与请求详情性能分析

- 把 upstream_is_stream 物化到 usage 与 billing facts,避免 Provider 聚合回连 public.usage
- 统一前端标准/流式 TPS 计算与显示,流式按首字后生成耗时计算
- 新增请求详情抽屉展示单请求输出速度与 Provider 聚合 TPS
This commit is contained in:
mayrain
2026-05-05 17:34:12 +08:00
parent f0197b685f
commit 6b6d32b4a3
14 changed files with 712 additions and 64 deletions

View File

@@ -877,6 +877,7 @@ async fn gateway_handles_admin_stats_provider_performance_locally_with_trusted_a
);
row.response_time_ms = Some((index * 100) as u64);
row.first_byte_time_ms = Some((index * 10) as u64);
row.request_metadata = Some(json!({ "upstream_is_stream": true }));
row
})
.collect::<Vec<_>>();
@@ -956,7 +957,7 @@ async fn gateway_handles_admin_stats_provider_performance_locally_with_trusted_a
let payload: serde_json::Value = response.json().await.expect("json body should parse");
assert_eq!(payload["summary"]["request_count"], 12);
assert_eq!(payload["summary"]["success_rate"], 91.67);
assert_eq!(payload["summary"]["avg_output_tps"], 18.46);
assert_eq!(payload["summary"]["avg_output_tps"], 20.17);
assert_eq!(payload["summary"]["avg_first_byte_time_ms"], 55.0);
assert_eq!(payload["summary"]["avg_response_time_ms"], 590.91);
@@ -968,7 +969,7 @@ async fn gateway_handles_admin_stats_provider_performance_locally_with_trusted_a
assert_eq!(payload["providers"][0]["error_count"], 1);
assert_eq!(payload["providers"][0]["success_rate"], 90.91);
assert_eq!(payload["providers"][0]["output_tokens"], 199);
assert_eq!(payload["providers"][0]["avg_output_tps"], 18.18);
assert_eq!(payload["providers"][0]["avg_output_tps"], 20.2);
assert_eq!(payload["providers"][0]["avg_first_byte_time_ms"], 55.0);
assert_eq!(payload["providers"][0]["avg_response_time_ms"], 550.0);
assert_eq!(payload["providers"][0]["p90_response_time_ms"], 910);
@@ -991,7 +992,7 @@ async fn gateway_handles_admin_stats_provider_performance_locally_with_trusted_a
assert_eq!(payload["timeline"].as_array().map(Vec::len), Some(2));
assert_eq!(payload["timeline"][0]["date"], "2024-03-21T05:00:00+00:00");
assert_eq!(payload["timeline"][0]["provider_id"], "provider-1");
assert_eq!(payload["timeline"][0]["avg_output_tps"], 18.18);
assert_eq!(payload["timeline"][0]["avg_output_tps"], 20.2);
assert_eq!(payload["timeline"][0]["success_rate"], 90.91);
assert_eq!(payload["timeline"][1]["provider_id"], "provider-2");
assert_eq!(