From 7951041eb0b8608958de896c426df60707935218 Mon Sep 17 00:00:00 2001 From: ZeroMagic Date: Thu, 9 Aug 2018 10:33:04 +0800 Subject: [PATCH] containerd-shim-kata-v2: add the service Stats support Add the Stats api support to get the container's resouces statistic. Signed-off-by: ZeroMagic --- containerd-shim-v2/metrics.go | 71 +++++++++++++++++++++++++++++++++++ containerd-shim-v2/service.go | 17 ++++++++- 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 containerd-shim-v2/metrics.go diff --git a/containerd-shim-v2/metrics.go b/containerd-shim-v2/metrics.go new file mode 100644 index 0000000000..a07486c1c2 --- /dev/null +++ b/containerd-shim-v2/metrics.go @@ -0,0 +1,71 @@ +// Copyright (c) 2018 HyperHQ Inc. +// +// SPDX-License-Identifier: Apache-2.0 +// + +package containerdshim + +import ( + "github.com/containerd/cgroups" + "github.com/containerd/typeurl" + + google_protobuf "github.com/gogo/protobuf/types" + vc "github.com/kata-containers/runtime/virtcontainers" +) + +func marshalMetrics(s *service, containerID string) (*google_protobuf.Any, error) { + stats, err := s.sandbox.StatsContainer(containerID) + if err != nil { + return nil, err + } + + metrics := statsToMetrics(stats.CgroupStats) + + data, err := typeurl.MarshalAny(metrics) + if err != nil { + return nil, err + } + + return data, nil +} + +func statsToMetrics(cgStats *vc.CgroupStats) *cgroups.Metrics { + var hugetlb []*cgroups.HugetlbStat + for _, v := range cgStats.HugetlbStats { + hugetlb = append( + hugetlb, + &cgroups.HugetlbStat{ + Usage: v.Usage, + Max: v.MaxUsage, + Failcnt: v.Failcnt, + }) + } + + var perCPU []uint64 + for _, v := range cgStats.CPUStats.CPUUsage.PercpuUsage { + perCPU = append(perCPU, v) + } + + metrics := &cgroups.Metrics{ + Hugetlb: hugetlb, + Pids: &cgroups.PidsStat{ + Current: cgStats.PidsStats.Current, + Limit: cgStats.PidsStats.Limit, + }, + CPU: &cgroups.CPUStat{ + Usage: &cgroups.CPUUsage{ + Total: cgStats.CPUStats.CPUUsage.TotalUsage, + PerCPU: perCPU, + }, + }, + Memory: &cgroups.MemoryStat{ + Cache: cgStats.MemoryStats.Cache, + Usage: &cgroups.MemoryEntry{ + Limit: cgStats.MemoryStats.Usage.Limit, + Usage: cgStats.MemoryStats.Usage.Usage, + }, + }, + } + + return metrics +} diff --git a/containerd-shim-v2/service.go b/containerd-shim-v2/service.go index 9f14efd460..b34e80de28 100644 --- a/containerd-shim-v2/service.go +++ b/containerd-shim-v2/service.go @@ -667,7 +667,22 @@ func (s *service) Shutdown(ctx context.Context, r *taskAPI.ShutdownRequest) (*pt } func (s *service) Stats(ctx context.Context, r *taskAPI.StatsRequest) (*taskAPI.StatsResponse, error) { - return nil, errdefs.ErrNotImplemented + s.Lock() + defer s.Unlock() + + c, err := s.getContainer(r.ID) + if err != nil { + return nil, err + } + + data, err := marshalMetrics(s, c.id) + if err != nil { + return nil, err + } + + return &taskAPI.StatsResponse{ + Stats: data, + }, nil } // Update a running container