77 "io"
88 "net"
99 "os"
10+ "reflect"
1011 "sync"
1112 "sync/atomic"
1213
@@ -21,6 +22,9 @@ import (
2122 // authentication implements, Currently, only token authentication is implemented
2223 _ "github.com/yomorun/yomo/pkg/auth"
2324 "github.com/yomorun/yomo/pkg/frame-codec/y3codec"
25+ "github.com/yomorun/yomo/pkg/id"
26+ "github.com/yomorun/yomo/pkg/trace"
27+ oteltrace "go.opentelemetry.io/otel/trace"
2428)
2529
2630// ErrServerClosed is returned by the Server's Serve and ListenAndServe methods after a call to Shutdown or Close.
@@ -51,6 +55,7 @@ type Server struct {
5155 connectionCloseHandlers []ConnectionHandler
5256 listener Listener
5357 logger * slog.Logger
58+ tracerProvider oteltrace.TracerProvider
5459}
5560
5661// NewServer create a Server instance.
@@ -71,6 +76,7 @@ func NewServer(name string, opts ...ServerOption) *Server {
7176 name : name ,
7277 downstreams : make (map [string ]FrameWriterConnection ),
7378 logger : logger ,
79+ tracerProvider : options .tracerProvider ,
7480 codec : y3codec .Codec (),
7581 packetReadWriter : y3codec .PacketReadWriter (),
7682 opts : options ,
@@ -313,7 +319,40 @@ func (s *Server) handleDataFrame(c *Context) error {
313319 atomic .AddInt64 (& s .counterOfDataFrame , 1 )
314320
315321 from := c .DataStream
316-
322+ // trace
323+ tid := GetTIDFromMetadata (c .FrameMetadata )
324+ sid := GetSIDFromMetadata (c .FrameMetadata )
325+ tp := s .TracerProvider ()
326+ if tp != nil {
327+ span , err := trace .NewSpan (tp , "zipper" , "handle DataFrame" , tid , sid )
328+ if err != nil {
329+ s .logger .Error ("zipper trace error" , "err" , err )
330+ } else {
331+ defer span .End ()
332+ tid = span .SpanContext ().TraceID ().String ()
333+ sid = span .SpanContext ().SpanID ().String ()
334+ }
335+ }
336+ if tid == "" {
337+ s .logger .Debug ("zipper create new tid" )
338+ tid = id .TID ()
339+ }
340+ if sid == "" {
341+ s .logger .Debug ("zipper create new sid" )
342+ sid = id .SID ()
343+ }
344+ // reallocate metadata with new TID and SID
345+ SetTIDToMetadata (c .FrameMetadata , tid )
346+ SetSIDToMetadata (c .FrameMetadata , sid )
347+ md , err := c .FrameMetadata .Encode ()
348+ if err != nil {
349+ s .logger .Error ("encode metadata error" , "err" , err )
350+ return err
351+ }
352+ c .Frame .Metadata = md
353+ if tp != nil {
354+ s .logger .Debug ("zipper trace" , "tid" , tid , "sid" , sid , "frome_stream_name" , from .Name ())
355+ }
317356 // route
318357 route := s .router .Route (c .FrameMetadata )
319358 if route == nil {
@@ -435,6 +474,7 @@ func (s *Server) dispatchToDownstreams(c *Context) {
435474 var (
436475 broadcast = GetBroadcastFromMetadata (c .FrameMetadata )
437476 tid = GetTIDFromMetadata (c .FrameMetadata )
477+ sid = GetSIDFromMetadata (c .FrameMetadata )
438478 )
439479 if broadcast {
440480 mdBytes , err := c .FrameMetadata .Encode ()
@@ -445,7 +485,7 @@ func (s *Server) dispatchToDownstreams(c *Context) {
445485 c .Frame .Metadata = mdBytes
446486
447487 for streamID , ds := range s .downstreams {
448- c .Logger .Info ("dispatching to downstream" , "dispatch_stream_id" , streamID , "tid" , tid )
488+ c .Logger .Info ("dispatching to downstream" , "dispatch_stream_id" , streamID , "tid" , tid , "sid" , sid )
449489 ds .WriteFrame (c .Frame )
450490 }
451491 }
@@ -493,3 +533,14 @@ func (s *Server) authNames() []string {
493533
494534// Name returns the name of server.
495535func (s * Server ) Name () string { return s .name }
536+
537+ // TracerProvider returns the tracer provider of server.
538+ func (s * Server ) TracerProvider () oteltrace.TracerProvider {
539+ if s .tracerProvider == nil {
540+ return nil
541+ }
542+ if reflect .ValueOf (s .tracerProvider ).IsNil () {
543+ return nil
544+ }
545+ return s .tracerProvider
546+ }
0 commit comments