@@ -25,6 +25,7 @@ import (
2525 "github.com/containerd/typeurl"
2626 ptypes "github.com/gogo/protobuf/types"
2727 "github.com/opencontainers/runtime-spec/specs-go"
28+ opentracing "github.com/opentracing/opentracing-go"
2829 "github.com/pkg/errors"
2930 "github.com/sirupsen/logrus"
3031 "golang.org/x/sys/unix"
@@ -72,13 +73,29 @@ func New(ctx context.Context, id string, publisher events.Publisher) (cdshim.Shi
7273 vci .SetLogger (ctx , logger )
7374 katautils .SetLogger (ctx , logger , logger .Logger .Level )
7475
76+ // load runtime config so that tracing can start if enabled
77+ _ , runtimeConfig , err := katautils .LoadConfiguration ("" , false , true )
78+ if err != nil {
79+ return nil , err
80+ }
81+
82+ // create tracer
83+ _ , err = katautils .CreateTracer ("kata" )
84+ if err != nil {
85+ return nil , err
86+ }
87+ // create span
88+ span , ctx := trace (ctx , "New" )
89+ defer span .Finish ()
90+
7591 ctx , cancel := context .WithCancel (ctx )
7692
7793 s := & service {
7894 id : id ,
7995 pid : uint32 (os .Getpid ()),
8096 ctx : ctx ,
8197 containers : make (map [string ]* container ),
98+ config : & runtimeConfig ,
8299 events : make (chan interface {}, chSize ),
83100 ec : make (chan exit , bufferSize ),
84101 cancel : cancel ,
@@ -161,6 +178,13 @@ func newCommand(ctx context.Context, containerdBinary, id, containerdAddress str
161178// StartShim willl start a kata shimv2 daemon which will implemented the
162179// ShimV2 APIs such as create/start/update etc containers.
163180func (s * service ) StartShim (ctx context.Context , id , containerdBinary , containerdAddress string ) (string , error ) {
181+ // Stop tracing here since a new tracer will be created the next time New()
182+ // is called again after StartShim()
183+ defer katautils .StopTracing (s .ctx )
184+
185+ span , _ := trace (s .ctx , "StartShim" )
186+ defer span .Finish ()
187+
164188 bundlePath , err := os .Getwd ()
165189 if err != nil {
166190 return "" , err
@@ -274,7 +298,22 @@ func getTopic(e interface{}) string {
274298 return cdruntime .TaskUnknownTopic
275299}
276300
301+ func trace (ctx context.Context , name string ) (opentracing.Span , context.Context ) {
302+ if ctx == nil {
303+ logrus .WithField ("type" , "bug" ).Error ("trace called before context set" )
304+ ctx = context .Background ()
305+ }
306+
307+ span , ctx := opentracing .StartSpanFromContext (ctx , name )
308+ span .SetTag ("source" , "runtime" )
309+
310+ return span , ctx
311+ }
312+
277313func (s * service ) Cleanup (ctx context.Context ) (_ * taskAPI.DeleteResponse , err error ) {
314+ span , _ := trace (s .ctx , "Cleanup" )
315+ defer span .Finish ()
316+
278317 //Since the binary cleanup will return the DeleteResponse from stdout to
279318 //containerd, thus we must make sure there is no any outputs in stdout except
280319 //the returned response, thus here redirect the log to stderr in case there's
@@ -330,6 +369,9 @@ func (s *service) Cleanup(ctx context.Context) (_ *taskAPI.DeleteResponse, err e
330369
331370// Create a new sandbox or container with the underlying OCI runtime
332371func (s * service ) Create (ctx context.Context , r * taskAPI.CreateTaskRequest ) (_ * taskAPI.CreateTaskResponse , err error ) {
372+ span , _ := trace (s .ctx , "Create" )
373+ defer span .Finish ()
374+
333375 defer func () {
334376 err = toGRPC (err )
335377 }()
@@ -381,6 +423,9 @@ func (s *service) Create(ctx context.Context, r *taskAPI.CreateTaskRequest) (_ *
381423
382424// Start a process
383425func (s * service ) Start (ctx context.Context , r * taskAPI.StartRequest ) (_ * taskAPI.StartResponse , err error ) {
426+ span , _ := trace (s .ctx , "Start" )
427+ defer span .Finish ()
428+
384429 defer func () {
385430 err = toGRPC (err )
386431 }()
@@ -427,6 +472,9 @@ func (s *service) Start(ctx context.Context, r *taskAPI.StartRequest) (_ *taskAP
427472
428473// Delete the initial process and container
429474func (s * service ) Delete (ctx context.Context , r * taskAPI.DeleteRequest ) (_ * taskAPI.DeleteResponse , err error ) {
475+ span , _ := trace (s .ctx , "Delete" )
476+ defer span .Finish ()
477+
430478 defer func () {
431479 err = toGRPC (err )
432480 }()
@@ -474,6 +522,9 @@ func (s *service) Delete(ctx context.Context, r *taskAPI.DeleteRequest) (_ *task
474522
475523// Exec an additional process inside the container
476524func (s * service ) Exec (ctx context.Context , r * taskAPI.ExecProcessRequest ) (_ * ptypes.Empty , err error ) {
525+ span , _ := trace (s .ctx , "Exec" )
526+ defer span .Finish ()
527+
477528 defer func () {
478529 err = toGRPC (err )
479530 }()
@@ -507,6 +558,9 @@ func (s *service) Exec(ctx context.Context, r *taskAPI.ExecProcessRequest) (_ *p
507558
508559// ResizePty of a process
509560func (s * service ) ResizePty (ctx context.Context , r * taskAPI.ResizePtyRequest ) (_ * ptypes.Empty , err error ) {
561+ span , _ := trace (s .ctx , "ResizePty" )
562+ defer span .Finish ()
563+
510564 defer func () {
511565 err = toGRPC (err )
512566 }()
@@ -541,6 +595,9 @@ func (s *service) ResizePty(ctx context.Context, r *taskAPI.ResizePtyRequest) (_
541595
542596// State returns runtime state information for a process
543597func (s * service ) State (ctx context.Context , r * taskAPI.StateRequest ) (_ * taskAPI.StateResponse , err error ) {
598+ span , _ := trace (s .ctx , "State" )
599+ defer span .Finish ()
600+
544601 defer func () {
545602 err = toGRPC (err )
546603 }()
@@ -584,11 +641,13 @@ func (s *service) State(ctx context.Context, r *taskAPI.StateRequest) (_ *taskAP
584641 Terminal : execs .tty .terminal ,
585642 ExitStatus : uint32 (execs .exitCode ),
586643 }, nil
587-
588644}
589645
590646// Pause the container
591647func (s * service ) Pause (ctx context.Context , r * taskAPI.PauseRequest ) (_ * ptypes.Empty , err error ) {
648+ span , _ := trace (s .ctx , "Pause" )
649+ defer span .Finish ()
650+
592651 defer func () {
593652 err = toGRPC (err )
594653 }()
@@ -623,6 +682,9 @@ func (s *service) Pause(ctx context.Context, r *taskAPI.PauseRequest) (_ *ptypes
623682
624683// Resume the container
625684func (s * service ) Resume (ctx context.Context , r * taskAPI.ResumeRequest ) (_ * ptypes.Empty , err error ) {
685+ span , _ := trace (s .ctx , "Resume" )
686+ defer span .Finish ()
687+
626688 defer func () {
627689 err = toGRPC (err )
628690 }()
@@ -655,6 +717,9 @@ func (s *service) Resume(ctx context.Context, r *taskAPI.ResumeRequest) (_ *ptyp
655717
656718// Kill a process with the provided signal
657719func (s * service ) Kill (ctx context.Context , r * taskAPI.KillRequest ) (_ * ptypes.Empty , err error ) {
720+ span , _ := trace (s .ctx , "Kill" )
721+ defer span .Finish ()
722+
658723 defer func () {
659724 err = toGRPC (err )
660725 }()
@@ -707,6 +772,9 @@ func (s *service) Kill(ctx context.Context, r *taskAPI.KillRequest) (_ *ptypes.E
707772// Since for kata, it cannot get the process's pid from VM,
708773// thus only return the Shim's pid directly.
709774func (s * service ) Pids (ctx context.Context , r * taskAPI.PidsRequest ) (_ * taskAPI.PidsResponse , err error ) {
775+ span , _ := trace (s .ctx , "Pids" )
776+ defer span .Finish ()
777+
710778 var processes []* task.ProcessInfo
711779
712780 defer func () {
@@ -725,6 +793,9 @@ func (s *service) Pids(ctx context.Context, r *taskAPI.PidsRequest) (_ *taskAPI.
725793
726794// CloseIO of a process
727795func (s * service ) CloseIO (ctx context.Context , r * taskAPI.CloseIORequest ) (_ * ptypes.Empty , err error ) {
796+ span , _ := trace (s .ctx , "CloseIO" )
797+ defer span .Finish ()
798+
728799 defer func () {
729800 err = toGRPC (err )
730801 }()
@@ -761,6 +832,9 @@ func (s *service) CloseIO(ctx context.Context, r *taskAPI.CloseIORequest) (_ *pt
761832
762833// Checkpoint the container
763834func (s * service ) Checkpoint (ctx context.Context , r * taskAPI.CheckpointTaskRequest ) (_ * ptypes.Empty , err error ) {
835+ span , _ := trace (s .ctx , "Checkpoint" )
836+ defer span .Finish ()
837+
764838 defer func () {
765839 err = toGRPC (err )
766840 }()
@@ -770,6 +844,9 @@ func (s *service) Checkpoint(ctx context.Context, r *taskAPI.CheckpointTaskReque
770844
771845// Connect returns shim information such as the shim's pid
772846func (s * service ) Connect (ctx context.Context , r * taskAPI.ConnectRequest ) (_ * taskAPI.ConnectResponse , err error ) {
847+ span , _ := trace (s .ctx , "Connect" )
848+ defer span .Finish ()
849+
773850 defer func () {
774851 err = toGRPC (err )
775852 }()
@@ -785,6 +862,8 @@ func (s *service) Connect(ctx context.Context, r *taskAPI.ConnectRequest) (_ *ta
785862}
786863
787864func (s * service ) Shutdown (ctx context.Context , r * taskAPI.ShutdownRequest ) (_ * ptypes.Empty , err error ) {
865+ span , _ := trace (s .ctx , "Shutdown" )
866+
788867 defer func () {
789868 err = toGRPC (err )
790869 }()
@@ -796,6 +875,9 @@ func (s *service) Shutdown(ctx context.Context, r *taskAPI.ShutdownRequest) (_ *
796875 }
797876 s .mu .Unlock ()
798877
878+ span .Finish ()
879+ katautils .StopTracing (s .ctx )
880+
799881 s .cancel ()
800882
801883 os .Exit (0 )
@@ -806,6 +888,9 @@ func (s *service) Shutdown(ctx context.Context, r *taskAPI.ShutdownRequest) (_ *
806888}
807889
808890func (s * service ) Stats (ctx context.Context , r * taskAPI.StatsRequest ) (_ * taskAPI.StatsResponse , err error ) {
891+ span , _ := trace (s .ctx , "Stats" )
892+ defer span .Finish ()
893+
809894 defer func () {
810895 err = toGRPC (err )
811896 }()
@@ -830,6 +915,9 @@ func (s *service) Stats(ctx context.Context, r *taskAPI.StatsRequest) (_ *taskAP
830915
831916// Update a running container
832917func (s * service ) Update (ctx context.Context , r * taskAPI.UpdateTaskRequest ) (_ * ptypes.Empty , err error ) {
918+ span , _ := trace (s .ctx , "Update" )
919+ defer span .Finish ()
920+
833921 defer func () {
834922 err = toGRPC (err )
835923 }()
@@ -857,6 +945,9 @@ func (s *service) Update(ctx context.Context, r *taskAPI.UpdateTaskRequest) (_ *
857945
858946// Wait for a process to exit
859947func (s * service ) Wait (ctx context.Context , r * taskAPI.WaitRequest ) (_ * taskAPI.WaitResponse , err error ) {
948+ span , _ := trace (s .ctx , "Wait" )
949+ defer span .Finish ()
950+
860951 var ret uint32
861952
862953 defer func () {
0 commit comments