- 新增 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 的行为说明
57 lines
1.4 KiB
Go
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
|
|
}
|