fix: kcp 协议内部日志细节

This commit is contained in:
2026-03-25 15:09:32 +08:00
parent be013b701b
commit 665a908421
15 changed files with 1117 additions and 42 deletions

View File

@@ -7,6 +7,7 @@ import (
"fmt"
"net"
"sync"
"time"
kcp "github.com/xtaci/kcp-go/v5"
@@ -31,6 +32,10 @@ type KCPConn struct {
nodeRole string
nodeID string
sessionStatsLogger KCPSessionStatsLogger
sessionStatsInterval time.Duration
sessionStatsSampler *kcpSessionStatsSampler
writeMu sync.Mutex
closeOnce sync.Once
closeErr error
@@ -48,6 +53,14 @@ func WithKCPLogger(logger latencylog.Logger, nodeRole, nodeID string) KCPOption
}
}
// WithKCPSessionStatsLogger 为 KCP 连接注入会话级与进程级统计日志器。
func WithKCPSessionStatsLogger(logger KCPSessionStatsLogger, interval time.Duration) KCPOption {
return func(conn *KCPConn) {
conn.sessionStatsLogger = logger
conn.sessionStatsInterval = interval
}
}
// NewKCPConn 用已有的 KCP 会话创建 transport 连接封装。
func NewKCPConn(session *kcp.UDPSession, opts ...KCPOption) (*KCPConn, error) {
if session == nil {
@@ -66,6 +79,7 @@ func NewKCPConn(session *kcp.UDPSession, opts ...KCPOption) (*KCPConn, error) {
}
configureKCPSession(session)
conn.sessionStatsSampler = newKCPSessionStatsSampler(session, conn.sessionStatsLogger, conn.nodeRole, conn.nodeID, conn.sessionStatsInterval)
return conn, nil
}
@@ -75,10 +89,16 @@ func (c *KCPConn) Send(msg protocol.Message) error {
defer c.writeMu.Unlock()
latencylog.LogMessageEvent(c.logger, c.nodeRole, c.nodeID, latencylog.EventSendHandoffBegin, msg)
if c.sessionStatsSampler != nil {
c.sessionStatsSampler.SampleEvent(kcpStatsSampleReasonSendHandoffBegin)
}
if err := protocol.WriteMessage(c.session, msg); err != nil {
return fmt.Errorf("transport: kcp send message: %w", err)
}
latencylog.LogMessageEvent(c.logger, c.nodeRole, c.nodeID, latencylog.EventSendHandoffEnd, msg)
if c.sessionStatsSampler != nil {
c.sessionStatsSampler.SampleEvent(kcpStatsSampleReasonSendHandoffEnd)
}
return nil
}
@@ -88,6 +108,9 @@ func (c *KCPConn) Receive() (protocol.Message, error) {
if err != nil {
return protocol.Message{}, fmt.Errorf("transport: kcp receive message: %w", err)
}
if c.sessionStatsSampler != nil {
c.sessionStatsSampler.SampleEvent(kcpStatsSampleReasonReceive)
}
return msg, nil
}
@@ -110,6 +133,9 @@ func (c *KCPConn) ReceiveLoop(handler func(protocol.Message) error) error {
// Close 关闭底层 KCP 会话,并保证重复调用是安全的。
func (c *KCPConn) Close() error {
c.closeOnce.Do(func() {
if c.sessionStatsSampler != nil {
c.sessionStatsSampler.Close()
}
c.closeErr = c.session.Close()
})
return c.closeErr