From e5885ce88825a70ef7bc55d467dfce07c5b381c9 Mon Sep 17 00:00:00 2001 From: xfy Date: Mon, 8 Jun 2026 18:17:08 +0800 Subject: [PATCH] fix(proxy): correct response time recording for Least Time - Record headerTime when header is received - Record lastByteTime when response is complete - Use correct timing calculations (headerReceived/connectEnd/responseEnd) --- internal/proxy/proxy.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/internal/proxy/proxy.go b/internal/proxy/proxy.go index 42361b7..0722f0e 100644 --- a/internal/proxy/proxy.go +++ b/internal/proxy/proxy.go @@ -874,11 +874,10 @@ func (p *Proxy) ServeHTTP(ctx *fasthttp.RequestCtx) { // 记录首字节时间 timing.MarkHeaderReceived() - // 记录响应时间(用于 least_time 负载均衡) + // 记录首字节响应时间(用于 least_time 负载均衡) if recorder, ok := p.balancer.(loadbalance.ResponseTimeRecorder); ok { - headerTime := timing.connectEnd.Sub(timing.connectStart) - lastByteTime := timing.connectEnd.Sub(timing.connectStart) - recorder.RecordResponseTime(target, headerTime, lastByteTime) + headerTime := timing.headerReceived.Sub(timing.connectEnd) + recorder.RecordResponseTime(target, headerTime, 0) } // 请求成功,减少连接计数 @@ -985,6 +984,15 @@ func (p *Proxy) ServeHTTP(ctx *fasthttp.RequestCtx) { // 修改响应头 p.modifyResponseHeaders(ctx) + + // 记录完整响应时间(用于 least_time 负载均衡) + timing.MarkResponseEnd() + if recorder, ok := p.balancer.(loadbalance.ResponseTimeRecorder); ok { + headerTime := timing.headerReceived.Sub(timing.connectEnd) + lastByteTime := timing.responseEnd.Sub(timing.connectEnd) + recorder.RecordResponseTime(target, headerTime, lastByteTime) + } + return }