diff --git a/cmd/ctr/commands/tasks/metrics.go b/cmd/ctr/commands/tasks/metrics.go index 80041867e..07facbaa5 100644 --- a/cmd/ctr/commands/tasks/metrics.go +++ b/cmd/ctr/commands/tasks/metrics.go @@ -27,7 +27,6 @@ import ( v1 "github.com/containerd/cgroups/v3/cgroup1/stats" v2 "github.com/containerd/cgroups/v3/cgroup2/stats" "github.com/containerd/containerd/cmd/ctr/commands" - "github.com/containerd/containerd/protobuf/proto" "github.com/containerd/typeurl/v2" "github.com/urfave/cli" ) @@ -154,22 +153,8 @@ func printCgroup2MetricsTable(w *tabwriter.Writer, data *v2.Metrics) { func printWindowsStats(w *tabwriter.Writer, windowsStats *wstats.Statistics) error { if windowsStats.GetLinux() != nil { - var stats v1.Metrics - - // It cannot be casted to v1.Metrics since windowsStats is still generated by gogo/protobuf. - linux := windowsStats.GetLinux() - - // But Marshal/Unmarshal works because the underlying protobuf message is compatible. - data, err := linux.Marshal() - if err != nil { - return err - } - err = proto.Unmarshal(data, &stats) - if err != nil { - return err - } - - printCgroupMetricsTable(w, &stats) + stats := windowsStats.GetLinux() + printCgroupMetricsTable(w, stats) } else if windowsStats.GetWindows() != nil { printWindowsContainerStatistics(w, windowsStats.GetWindows()) } diff --git a/pkg/cri/sbserver/container_stats_list.go b/pkg/cri/sbserver/container_stats_list.go index c1bbfedbe..d08d29ecb 100644 --- a/pkg/cri/sbserver/container_stats_list.go +++ b/pkg/cri/sbserver/container_stats_list.go @@ -303,13 +303,13 @@ func (c *criService) windowsContainerMetrics( } if wstats.Processor != nil { cs.Cpu = &runtime.CpuUsage{ - Timestamp: wstats.Timestamp.UnixNano(), + Timestamp: (protobuf.FromTimestamp(wstats.Timestamp)).UnixNano(), UsageCoreNanoSeconds: &runtime.UInt64Value{Value: wstats.Processor.TotalRuntimeNS}, } } if wstats.Memory != nil { cs.Memory = &runtime.MemoryUsage{ - Timestamp: wstats.Timestamp.UnixNano(), + Timestamp: (protobuf.FromTimestamp(wstats.Timestamp)).UnixNano(), WorkingSetBytes: &runtime.UInt64Value{ Value: wstats.Memory.MemoryUsagePrivateWorkingSetBytes, }, diff --git a/pkg/cri/sbserver/sandbox_stats_windows.go b/pkg/cri/sbserver/sandbox_stats_windows.go index 2408f9017..a063d1d37 100644 --- a/pkg/cri/sbserver/sandbox_stats_windows.go +++ b/pkg/cri/sbserver/sandbox_stats_windows.go @@ -31,6 +31,7 @@ import ( containerstore "github.com/containerd/containerd/pkg/cri/store/container" sandboxstore "github.com/containerd/containerd/pkg/cri/store/sandbox" "github.com/containerd/containerd/pkg/cri/store/stats" + "github.com/containerd/containerd/protobuf" "github.com/containerd/typeurl/v2" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -282,14 +283,14 @@ func (c *criService) convertToCRIStats(stats *wstats.Statistics) (*runtime.Windo } if wstats.Processor != nil { cs.Cpu = &runtime.WindowsCpuUsage{ - Timestamp: wstats.Timestamp.UnixNano(), + Timestamp: (protobuf.FromTimestamp(wstats.Timestamp)).UnixNano(), UsageCoreNanoSeconds: &runtime.UInt64Value{Value: wstats.Processor.TotalRuntimeNS}, } } if wstats.Memory != nil { cs.Memory = &runtime.WindowsMemoryUsage{ - Timestamp: wstats.Timestamp.UnixNano(), + Timestamp: (protobuf.FromTimestamp(wstats.Timestamp)).UnixNano(), WorkingSetBytes: &runtime.UInt64Value{ Value: wstats.Memory.MemoryUsagePrivateWorkingSetBytes, }, diff --git a/pkg/cri/sbserver/sandbox_stats_windows_test.go b/pkg/cri/sbserver/sandbox_stats_windows_test.go index 6db03d6b9..f0077f18a 100644 --- a/pkg/cri/sbserver/sandbox_stats_windows_test.go +++ b/pkg/cri/sbserver/sandbox_stats_windows_test.go @@ -24,6 +24,7 @@ import ( containerstore "github.com/containerd/containerd/pkg/cri/store/container" sandboxstore "github.com/containerd/containerd/pkg/cri/store/sandbox" "github.com/containerd/containerd/pkg/cri/store/stats" + "github.com/containerd/containerd/protobuf" "github.com/stretchr/testify/assert" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -384,7 +385,7 @@ func sandboxPod(id string, timestamp time.Time, cachedCPU uint64) sandboxstore.S func windowsStat(timestamp time.Time, cpu uint64, memory uint64) *wstats.Statistics_Windows { return &wstats.Statistics_Windows{ Windows: &wstats.WindowsContainerStatistics{ - Timestamp: timestamp, + Timestamp: protobuf.ToTimestamp(timestamp), Processor: &wstats.WindowsContainerProcessorStatistics{ TotalRuntimeNS: cpu, }, diff --git a/pkg/cri/server/container_stats_list_windows.go b/pkg/cri/server/container_stats_list_windows.go index c7cb68136..f3bdcb68f 100644 --- a/pkg/cri/server/container_stats_list_windows.go +++ b/pkg/cri/server/container_stats_list_windows.go @@ -22,6 +22,7 @@ import ( wstats "github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/stats" "github.com/containerd/containerd/api/types" + "github.com/containerd/containerd/protobuf" "github.com/containerd/typeurl/v2" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -67,13 +68,13 @@ func (c *criService) containerMetrics( } if wstats.Processor != nil { cs.Cpu = &runtime.CpuUsage{ - Timestamp: wstats.Timestamp.UnixNano(), + Timestamp: (protobuf.FromTimestamp(wstats.Timestamp)).UnixNano(), UsageCoreNanoSeconds: &runtime.UInt64Value{Value: wstats.Processor.TotalRuntimeNS}, } } if wstats.Memory != nil { cs.Memory = &runtime.MemoryUsage{ - Timestamp: wstats.Timestamp.UnixNano(), + Timestamp: (protobuf.FromTimestamp(wstats.Timestamp)).UnixNano(), WorkingSetBytes: &runtime.UInt64Value{ Value: wstats.Memory.MemoryUsagePrivateWorkingSetBytes, }, diff --git a/pkg/cri/server/sandbox_stats_windows.go b/pkg/cri/server/sandbox_stats_windows.go index eabaac860..b54bf0e2e 100644 --- a/pkg/cri/server/sandbox_stats_windows.go +++ b/pkg/cri/server/sandbox_stats_windows.go @@ -31,6 +31,7 @@ import ( containerstore "github.com/containerd/containerd/pkg/cri/store/container" sandboxstore "github.com/containerd/containerd/pkg/cri/store/sandbox" "github.com/containerd/containerd/pkg/cri/store/stats" + "github.com/containerd/containerd/protobuf" "github.com/containerd/typeurl/v2" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -282,14 +283,14 @@ func (c *criService) convertToCRIStats(stats *wstats.Statistics) (*runtime.Windo } if wstats.Processor != nil { cs.Cpu = &runtime.WindowsCpuUsage{ - Timestamp: wstats.Timestamp.UnixNano(), + Timestamp: (protobuf.FromTimestamp(wstats.Timestamp)).UnixNano(), UsageCoreNanoSeconds: &runtime.UInt64Value{Value: wstats.Processor.TotalRuntimeNS}, } } if wstats.Memory != nil { cs.Memory = &runtime.WindowsMemoryUsage{ - Timestamp: wstats.Timestamp.UnixNano(), + Timestamp: (protobuf.FromTimestamp(wstats.Timestamp)).UnixNano(), WorkingSetBytes: &runtime.UInt64Value{ Value: wstats.Memory.MemoryUsagePrivateWorkingSetBytes, }, diff --git a/pkg/cri/server/sandbox_stats_windows_test.go b/pkg/cri/server/sandbox_stats_windows_test.go index 2450c7fbd..13359435b 100644 --- a/pkg/cri/server/sandbox_stats_windows_test.go +++ b/pkg/cri/server/sandbox_stats_windows_test.go @@ -24,6 +24,7 @@ import ( containerstore "github.com/containerd/containerd/pkg/cri/store/container" sandboxstore "github.com/containerd/containerd/pkg/cri/store/sandbox" "github.com/containerd/containerd/pkg/cri/store/stats" + "github.com/containerd/containerd/protobuf" "github.com/stretchr/testify/assert" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) @@ -384,7 +385,7 @@ func sandboxPod(id string, timestamp time.Time, cachedCPU uint64) sandboxstore.S func windowsStat(timestamp time.Time, cpu uint64, memory uint64) *wstats.Statistics_Windows { return &wstats.Statistics_Windows{ Windows: &wstats.WindowsContainerStatistics{ - Timestamp: timestamp, + Timestamp: protobuf.ToTimestamp(timestamp), Processor: &wstats.WindowsContainerProcessorStatistics{ TotalRuntimeNS: cpu, },