fix: kcp 协议内部日志细节
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user