@@ -17,6 +17,8 @@ import (
1717 "github.com/lucas-clemente/quic-go"
1818 "github.com/pkg/errors"
1919 "github.com/rs/zerolog"
20+ "go.opentelemetry.io/otel/attribute"
21+ "go.opentelemetry.io/otel/trace"
2022 "golang.org/x/sync/errgroup"
2123
2224 "github.com/cloudflare/cloudflared/datagramsession"
@@ -259,24 +261,42 @@ func (q *QUICConnection) handleRPCStream(rpcStream *quicpogs.RPCServerStream) er
259261}
260262
261263// RegisterUdpSession is the RPC method invoked by edge to register and run a session
262- func (q * QUICConnection ) RegisterUdpSession (ctx context.Context , sessionID uuid.UUID , dstIP net.IP , dstPort uint16 , closeAfterIdleHint time.Duration , traceContext string ) error {
264+ func (q * QUICConnection ) RegisterUdpSession (ctx context.Context , sessionID uuid.UUID , dstIP net.IP , dstPort uint16 , closeAfterIdleHint time.Duration , traceContext string ) (* tunnelpogs.RegisterUdpSessionResponse , error ) {
265+ traceCtx := tracing .NewTracedContext (ctx , traceContext , q .logger )
266+ ctx , registerSpan := traceCtx .Tracer ().Start (traceCtx , "register-session" , trace .WithAttributes (
267+ attribute .String ("session-id" , sessionID .String ()),
268+ attribute .String ("dst" , fmt .Sprintf ("%s:%d" , dstIP , dstPort )),
269+ ))
263270 // Each session is a series of datagram from an eyeball to a dstIP:dstPort.
264271 // (src port, dst IP, dst port) uniquely identifies a session, so it needs a dedicated connected socket.
265272 originProxy , err := ingress .DialUDP (dstIP , dstPort )
266273 if err != nil {
267274 q .logger .Err (err ).Msgf ("Failed to create udp proxy to %s:%d" , dstIP , dstPort )
268- return err
275+ tracing .EndWithErrorStatus (registerSpan , err )
276+ return nil , err
269277 }
278+ registerSpan .SetAttributes (
279+ attribute .Bool ("socket-bind-success" , true ),
280+ attribute .String ("src" , originProxy .LocalAddr ().String ()),
281+ )
282+
270283 session , err := q .sessionManager .RegisterSession (ctx , sessionID , originProxy )
271284 if err != nil {
272285 q .logger .Err (err ).Str ("sessionID" , sessionID .String ()).Msgf ("Failed to register udp session" )
273- return err
286+ tracing .EndWithErrorStatus (registerSpan , err )
287+ return nil , err
274288 }
275289
276290 go q .serveUDPSession (session , closeAfterIdleHint )
277291
278292 q .logger .Debug ().Str ("sessionID" , sessionID .String ()).Str ("src" , originProxy .LocalAddr ().String ()).Str ("dst" , fmt .Sprintf ("%s:%d" , dstIP , dstPort )).Msgf ("Registered session" )
279- return nil
293+ tracing .End (registerSpan )
294+
295+ resp := tunnelpogs.RegisterUdpSessionResponse {
296+ Spans : traceCtx .GetProtoSpans (),
297+ }
298+
299+ return & resp , nil
280300}
281301
282302func (q * QUICConnection ) serveUDPSession (session * datagramsession.Session , closeAfterIdleHint time.Duration ) {
0 commit comments