Skip to content
This repository was archived by the owner on May 12, 2021. It is now read-only.

Commit 0279c81

Browse files
author
Chelsea Mafrica
committed
shimv2: Add tracing to shimv2
Add trace calls to shimv2 that create spans for functions in service.go. Tracing starts in New(), which is forked twice and is followed by either StartShim() or Create(). Tracing cannot start without the value for Trace enabled from the runtime config so load the config in New(), which results in it being loaded every time New() is called in addition to where it is originally loaded after Create(). Fixes #1807 Signed-off-by: Chelsea Mafrica <[email protected]>
1 parent 2a98f43 commit 0279c81

File tree

1 file changed

+92
-1
lines changed

1 file changed

+92
-1
lines changed

containerd-shim-v2/service.go

Lines changed: 92 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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.
163180
func (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+
277313
func (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
332371
func (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
383425
func (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
429474
func (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
476524
func (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
509560
func (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
543597
func (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
591647
func (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
625684
func (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
657719
func (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.
709774
func (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
727795
func (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
763834
func (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
772846
func (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

787864
func (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

808890
func (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
832917
func (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
859947
func (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

Comments
 (0)