From 27f56e607f3e59792aa1e78d025c2d0cc5eb9e96 Mon Sep 17 00:00:00 2001 From: Brad Davidson Date: Wed, 3 May 2023 18:24:30 +0000 Subject: [PATCH] Fix umarshal metrics for CRI server Signed-off-by: Brad Davidson --- .../sbserver/container_stats_list_linux.go | 30 ++++++++++++++----- pkg/cri/server/container_stats_list_linux.go | 30 ++++++++++++++----- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/pkg/cri/sbserver/container_stats_list_linux.go b/pkg/cri/sbserver/container_stats_list_linux.go index e855ccd88..231d51190 100644 --- a/pkg/cri/sbserver/container_stats_list_linux.go +++ b/pkg/cri/sbserver/container_stats_list_linux.go @@ -17,12 +17,15 @@ package sbserver import ( + "errors" "fmt" + "reflect" "time" + wstats "github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/stats" + v1 "github.com/containerd/cgroups/v3/cgroup1/stats" + v2 "github.com/containerd/cgroups/v3/cgroup2/stats" "github.com/containerd/containerd/api/types" - v1 "github.com/containerd/containerd/metrics/types/v1" - v2 "github.com/containerd/containerd/metrics/types/v2" "github.com/containerd/containerd/protobuf" "github.com/containerd/typeurl/v2" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -59,18 +62,29 @@ func (c *criService) containerMetrics( } if stats != nil { - s, err := typeurl.UnmarshalAny(stats.Data) - if err != nil { + var data interface{} + switch { + case typeurl.Is(stats.Data, (*v1.Metrics)(nil)): + data = &v1.Metrics{} + case typeurl.Is(stats.Data, (*v2.Metrics)(nil)): + data = &v2.Metrics{} + case typeurl.Is(stats.Data, (*wstats.Statistics)(nil)): + data = &wstats.Statistics{} + default: + return nil, errors.New("cannot convert metric data to cgroups.Metrics or windows.Statistics") + } + + if err := typeurl.UnmarshalTo(stats.Data, data); err != nil { return nil, fmt.Errorf("failed to extract container metrics: %w", err) } - cpuStats, err := c.cpuContainerStats(meta.ID, false /* isSandbox */, s, protobuf.FromTimestamp(stats.Timestamp)) + cpuStats, err := c.cpuContainerStats(meta.ID, false /* isSandbox */, data, protobuf.FromTimestamp(stats.Timestamp)) if err != nil { return nil, fmt.Errorf("failed to obtain cpu stats: %w", err) } cs.Cpu = cpuStats - memoryStats, err := c.memoryContainerStats(meta.ID, s, protobuf.FromTimestamp(stats.Timestamp)) + memoryStats, err := c.memoryContainerStats(meta.ID, data, protobuf.FromTimestamp(stats.Timestamp)) if err != nil { return nil, fmt.Errorf("failed to obtain memory stats: %w", err) } @@ -151,7 +165,7 @@ func (c *criService) cpuContainerStats(ID string, isSandbox bool, stats interfac }, nil } default: - return nil, fmt.Errorf("unexpected metrics type: %v", metrics) + return nil, fmt.Errorf("unexpected metrics type: %T from %s", metrics, reflect.TypeOf(metrics).Elem().PkgPath()) } return nil, nil } @@ -193,7 +207,7 @@ func (c *criService) memoryContainerStats(ID string, stats interface{}, timestam }, nil } default: - return nil, fmt.Errorf("unexpected metrics type: %v", metrics) + return nil, fmt.Errorf("unexpected metrics type: %T from %s", metrics, reflect.TypeOf(metrics).Elem().PkgPath()) } return nil, nil } diff --git a/pkg/cri/server/container_stats_list_linux.go b/pkg/cri/server/container_stats_list_linux.go index 20556a93b..ee46db934 100644 --- a/pkg/cri/server/container_stats_list_linux.go +++ b/pkg/cri/server/container_stats_list_linux.go @@ -17,12 +17,15 @@ package server import ( + "errors" "fmt" + "reflect" "time" + wstats "github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/stats" + v1 "github.com/containerd/cgroups/v3/cgroup1/stats" + v2 "github.com/containerd/cgroups/v3/cgroup2/stats" "github.com/containerd/containerd/api/types" - v1 "github.com/containerd/containerd/metrics/types/v1" - v2 "github.com/containerd/containerd/metrics/types/v2" "github.com/containerd/containerd/protobuf" "github.com/containerd/typeurl/v2" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -59,18 +62,29 @@ func (c *criService) containerMetrics( } if stats != nil { - s, err := typeurl.UnmarshalAny(stats.Data) - if err != nil { + var data interface{} + switch { + case typeurl.Is(stats.Data, (*v1.Metrics)(nil)): + data = &v1.Metrics{} + case typeurl.Is(stats.Data, (*v2.Metrics)(nil)): + data = &v2.Metrics{} + case typeurl.Is(stats.Data, (*wstats.Statistics)(nil)): + data = &wstats.Statistics{} + default: + return nil, errors.New("cannot convert metric data to cgroups.Metrics or windows.Statistics") + } + + if err := typeurl.UnmarshalTo(stats.Data, data); err != nil { return nil, fmt.Errorf("failed to extract container metrics: %w", err) } - cpuStats, err := c.cpuContainerStats(meta.ID, false /* isSandbox */, s, protobuf.FromTimestamp(stats.Timestamp)) + cpuStats, err := c.cpuContainerStats(meta.ID, false /* isSandbox */, data, protobuf.FromTimestamp(stats.Timestamp)) if err != nil { return nil, fmt.Errorf("failed to obtain cpu stats: %w", err) } cs.Cpu = cpuStats - memoryStats, err := c.memoryContainerStats(meta.ID, s, protobuf.FromTimestamp(stats.Timestamp)) + memoryStats, err := c.memoryContainerStats(meta.ID, data, protobuf.FromTimestamp(stats.Timestamp)) if err != nil { return nil, fmt.Errorf("failed to obtain memory stats: %w", err) } @@ -152,7 +166,7 @@ func (c *criService) cpuContainerStats(ID string, isSandbox bool, stats interfac }, nil } default: - return nil, fmt.Errorf("unexpected metrics type: %v", metrics) + return nil, fmt.Errorf("unexpected metrics type: %T from %s", metrics, reflect.TypeOf(metrics).Elem().PkgPath()) } return nil, nil } @@ -194,7 +208,7 @@ func (c *criService) memoryContainerStats(ID string, stats interface{}, timestam }, nil } default: - return nil, fmt.Errorf("unexpected metrics type: %v", metrics) + return nil, fmt.Errorf("unexpected metrics type: %T from %s", metrics, reflect.TypeOf(metrics).Elem().PkgPath()) } return nil, nil }