starnet/request_trace.go
starainrt 2f4c7158cf
feat: 增加请求级 trace 摘要与诊断能力
- 新增 TraceRecorder 和 TraceSummary,汇总 DNS、连接、TLS、写请求、首包等关键事件
  - 为请求执行链接入结构化 trace hooks,补充标准路径与动态路径的 TLS 元信息
  - 增加 Request.TraceSummary() 和 Response.TraceSummary(),提供请求级与响应级摘要快照
  - 修复共享 TraceRecorder 在 Client 默认选项、Clone 和请求复用场景下的状态串扰问题
  - 修复 Response.TraceSummary() 回读 Request 最近状态导致的非快照语义
  - 收口自定义 DialFunc 下的 TLS trace 元数据,避免伪造连接地址
  - 补充 trace 相关回归测试,覆盖 HTTPS、DNS/Connect、连接复用、共享 recorder、响应快照和自定义拨号场景
  - 更新 README,补充 trace、Host 与 TLSServerName 的行为说明
2026-04-20 17:54:43 +08:00

57 lines
1.4 KiB
Go

package starnet
// SetTraceHooks 设置请求 trace 回调。
func (r *Request) SetTraceHooks(hooks *TraceHooks) *Request {
return r.applyMutation(mutateTraceHooks(hooks))
}
// SetTraceRecorder 设置请求级 trace 摘要记录器。
// 记录器会保存最近一次已完成请求的摘要;若多个请求共享同一个记录器,则以最后一次完成的请求为准。
func (r *Request) SetTraceRecorder(recorder *TraceRecorder) *Request {
return r.applyMutation(mutateTraceRecorder(recorder))
}
// TraceSummary 返回当前请求最近一次执行的 trace 摘要快照。
func (r *Request) TraceSummary() *TraceSummary {
if r == nil || r.lastTraceSummary == nil {
return nil
}
summary := cloneTraceSummary(*r.lastTraceSummary)
return &summary
}
func (r *Request) startTraceExecution() {
if r == nil {
return
}
r.traceRun = nil
if r.traceRecorder == nil {
return
}
r.traceRun = r.traceRecorder.forkExecution()
if r.traceRun != nil {
r.traceRun.startRequest()
}
}
func (r *Request) finishTraceExecution(resp *Response) {
if r == nil {
return
}
if r.traceRun == nil {
r.lastTraceSummary = nil
if resp != nil {
resp.traceSummary = nil
}
return
}
summary := r.traceRun.Summary()
r.lastTraceSummary = cloneTraceSummaryPtr(summary)
r.traceRecorder.publishSummary(summary)
if resp != nil {
resp.traceSummary = cloneTraceSummaryPtr(summary)
}
r.traceRun = nil
}