feat: 代理 timing 细分指标与前端展示优化

- aether-proxy 新增 auth_ms/body_read_ms/body_parse_ms/body_size 计时字段
- 链路追踪面板代理耗时改为分阶段展示,密钥和代理信息改为堆叠布局
- 硬件信息从 Tooltip 改为 Popover,新增 FD Limit 展示
- 新增区域代码格式化工具函数,统一显示区域中文名称
This commit is contained in:
fawney19
2026-02-11 15:33:01 +08:00
parent d51234f202
commit 2a2a4b817e
6 changed files with 142 additions and 54 deletions

View File

@@ -52,9 +52,11 @@ pub async fn handle_delegate(
warn!(error = %e, "delegate auth failed");
return error_response(401, "authentication_failed", &e.to_string());
}
let auth_ms = total_start.elapsed().as_millis() as u64;
// Read and parse request body (limit to 10 MB to prevent OOM)
const MAX_BODY: usize = 10 * 1024 * 1024;
let body_read_start = Instant::now();
let body_bytes = match Limited::new(req.into_body(), MAX_BODY).collect().await {
Ok(collected) => collected.to_bytes(),
Err(e) => {
@@ -62,7 +64,10 @@ pub async fn handle_delegate(
return error_response(413, "payload_too_large", "request body exceeds 10MB limit");
}
};
let body_read_ms = body_read_start.elapsed().as_millis() as u64;
let body_size = body_bytes.len() as u64;
let body_parse_start = Instant::now();
let delegate_req: DelegateRequest = match serde_json::from_slice(&body_bytes) {
Ok(r) => r,
Err(e) => {
@@ -70,6 +75,7 @@ pub async fn handle_delegate(
return error_response(400, "bad_request", &format!("invalid JSON: {}", e));
}
};
let body_parse_ms = body_parse_start.elapsed().as_millis() as u64;
// Target filter: validate the upstream URL against allowed ports and private IP checks
let parsed_url = match Url::parse(&delegate_req.url) {
@@ -168,6 +174,10 @@ pub async fn handle_delegate(
// Inject proxy timing header for Aether to parse
let timing = serde_json::json!({
"auth_ms": auth_ms,
"body_read_ms": body_read_ms,
"body_parse_ms": body_parse_ms,
"body_size": body_size,
"dns_ms": dns_ms,
"upstream_ms": upstream_ms,
"total_ms": total_ms,