diff --git a/handler/relay/bind.go b/handler/relay/bind.go index 8ccdd62..7d498a8 100644 --- a/handler/relay/bind.go +++ b/handler/relay/bind.go @@ -222,6 +222,9 @@ func (h *relayHandler) handleBindTunnel(ctx context.Context, conn net.Conn, netw h.pool.Add(tunnelID, NewConnector(connectorID, session)) log.Debugf("tunnel %s connector %s/%s established", tunnelID, connectorID, network) + if h.recorder.Recorder != nil { + h.recorder.Recorder.Record(ctx, tunnelID[:]) + } return } diff --git a/handler/relay/connect.go b/handler/relay/connect.go index 52d9e6a..66daf3f 100644 --- a/handler/relay/connect.go +++ b/handler/relay/connect.go @@ -182,7 +182,7 @@ func (h *relayHandler) handleConnectTunnel(ctx context.Context, conn net.Conn, n } var features []relay.Feature - af := &relay.AddrFeature{} // visitor address + af := &relay.AddrFeature{} // source/visitor address af.ParseFrom(conn.RemoteAddr().String()) features = append(features, af) diff --git a/handler/relay/handler.go b/handler/relay/handler.go index f095720..e30568b 100644 --- a/handler/relay/handler.go +++ b/handler/relay/handler.go @@ -13,10 +13,12 @@ import ( "github.com/go-gost/core/hop" "github.com/go-gost/core/listener" md "github.com/go-gost/core/metadata" + "github.com/go-gost/core/recorder" "github.com/go-gost/core/service" "github.com/go-gost/relay" xnet "github.com/go-gost/x/internal/net" auth_util "github.com/go-gost/x/internal/util/auth" + xrecorder "github.com/go-gost/x/recorder" "github.com/go-gost/x/registry" xservice "github.com/go-gost/x/service" ) @@ -33,12 +35,13 @@ func init() { } type relayHandler struct { - hop hop.Hop - router *chain.Router - md metadata - options handler.Options - ep service.Service - pool *ConnectorPool + hop hop.Hop + router *chain.Router + md metadata + options handler.Options + ep service.Service + pool *ConnectorPool + recorder recorder.RecorderObject } func NewHandler(opts ...handler.Option) handler.Handler { @@ -63,6 +66,15 @@ func (h *relayHandler) Init(md md.Metadata) (err error) { h.router = chain.NewRouter(chain.LoggerRouterOption(h.options.Logger)) } + if opts := h.router.Options(); opts != nil { + for _, ro := range opts.Recorders { + if ro.Record == xrecorder.RecorderServiceHandlerRelayTunnelEndpoint { + h.recorder = ro + break + } + } + } + if err = h.initEntryPoint(); err != nil { return } diff --git a/handler/relay/tunnel.go b/handler/relay/tunnel.go index 18d1bfa..98e9a05 100644 --- a/handler/relay/tunnel.go +++ b/handler/relay/tunnel.go @@ -100,7 +100,7 @@ func (t *Tunnel) GetConnector(network string) *Connector { } func (t *Tunnel) clean() { - ticker := time.NewTicker(3 * time.Second) + ticker := time.NewTicker(30 * time.Second) for range ticker.C { t.mu.Lock() var connectors []*Connector diff --git a/recorder/recorder.go b/recorder/recorder.go index cc0a874..dc7348a 100644 --- a/recorder/recorder.go +++ b/recorder/recorder.go @@ -1,5 +1,6 @@ package recorder const ( - RecorderServiceHandlerSerial = "recorder.service.handler.serial" + RecorderServiceHandlerSerial = "recorder.service.handler.serial" + RecorderServiceHandlerRelayTunnelEndpoint = "recorder.service.handler.relay.tunnel.endpoint" )