Skip to content

Commit 27f56e6

Browse files
committed
Fix umarshal metrics for CRI server
Signed-off-by: Brad Davidson <[email protected]>
1 parent b324a4b commit 27f56e6

2 files changed

Lines changed: 44 additions & 16 deletions

File tree

pkg/cri/sbserver/container_stats_list_linux.go

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@
1717
package sbserver
1818

1919
import (
20+
"errors"
2021
"fmt"
22+
"reflect"
2123
"time"
2224

25+
wstats "github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/stats"
26+
v1 "github.com/containerd/cgroups/v3/cgroup1/stats"
27+
v2 "github.com/containerd/cgroups/v3/cgroup2/stats"
2328
"github.com/containerd/containerd/api/types"
24-
v1 "github.com/containerd/containerd/metrics/types/v1"
25-
v2 "github.com/containerd/containerd/metrics/types/v2"
2629
"github.com/containerd/containerd/protobuf"
2730
"github.com/containerd/typeurl/v2"
2831
runtime "k8s.io/cri-api/pkg/apis/runtime/v1"
@@ -59,18 +62,29 @@ func (c *criService) containerMetrics(
5962
}
6063

6164
if stats != nil {
62-
s, err := typeurl.UnmarshalAny(stats.Data)
63-
if err != nil {
65+
var data interface{}
66+
switch {
67+
case typeurl.Is(stats.Data, (*v1.Metrics)(nil)):
68+
data = &v1.Metrics{}
69+
case typeurl.Is(stats.Data, (*v2.Metrics)(nil)):
70+
data = &v2.Metrics{}
71+
case typeurl.Is(stats.Data, (*wstats.Statistics)(nil)):
72+
data = &wstats.Statistics{}
73+
default:
74+
return nil, errors.New("cannot convert metric data to cgroups.Metrics or windows.Statistics")
75+
}
76+
77+
if err := typeurl.UnmarshalTo(stats.Data, data); err != nil {
6478
return nil, fmt.Errorf("failed to extract container metrics: %w", err)
6579
}
6680

67-
cpuStats, err := c.cpuContainerStats(meta.ID, false /* isSandbox */, s, protobuf.FromTimestamp(stats.Timestamp))
81+
cpuStats, err := c.cpuContainerStats(meta.ID, false /* isSandbox */, data, protobuf.FromTimestamp(stats.Timestamp))
6882
if err != nil {
6983
return nil, fmt.Errorf("failed to obtain cpu stats: %w", err)
7084
}
7185
cs.Cpu = cpuStats
7286

73-
memoryStats, err := c.memoryContainerStats(meta.ID, s, protobuf.FromTimestamp(stats.Timestamp))
87+
memoryStats, err := c.memoryContainerStats(meta.ID, data, protobuf.FromTimestamp(stats.Timestamp))
7488
if err != nil {
7589
return nil, fmt.Errorf("failed to obtain memory stats: %w", err)
7690
}
@@ -151,7 +165,7 @@ func (c *criService) cpuContainerStats(ID string, isSandbox bool, stats interfac
151165
}, nil
152166
}
153167
default:
154-
return nil, fmt.Errorf("unexpected metrics type: %v", metrics)
168+
return nil, fmt.Errorf("unexpected metrics type: %T from %s", metrics, reflect.TypeOf(metrics).Elem().PkgPath())
155169
}
156170
return nil, nil
157171
}
@@ -193,7 +207,7 @@ func (c *criService) memoryContainerStats(ID string, stats interface{}, timestam
193207
}, nil
194208
}
195209
default:
196-
return nil, fmt.Errorf("unexpected metrics type: %v", metrics)
210+
return nil, fmt.Errorf("unexpected metrics type: %T from %s", metrics, reflect.TypeOf(metrics).Elem().PkgPath())
197211
}
198212
return nil, nil
199213
}

pkg/cri/server/container_stats_list_linux.go

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@
1717
package server
1818

1919
import (
20+
"errors"
2021
"fmt"
22+
"reflect"
2123
"time"
2224

25+
wstats "github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/stats"
26+
v1 "github.com/containerd/cgroups/v3/cgroup1/stats"
27+
v2 "github.com/containerd/cgroups/v3/cgroup2/stats"
2328
"github.com/containerd/containerd/api/types"
24-
v1 "github.com/containerd/containerd/metrics/types/v1"
25-
v2 "github.com/containerd/containerd/metrics/types/v2"
2629
"github.com/containerd/containerd/protobuf"
2730
"github.com/containerd/typeurl/v2"
2831
runtime "k8s.io/cri-api/pkg/apis/runtime/v1"
@@ -59,18 +62,29 @@ func (c *criService) containerMetrics(
5962
}
6063

6164
if stats != nil {
62-
s, err := typeurl.UnmarshalAny(stats.Data)
63-
if err != nil {
65+
var data interface{}
66+
switch {
67+
case typeurl.Is(stats.Data, (*v1.Metrics)(nil)):
68+
data = &v1.Metrics{}
69+
case typeurl.Is(stats.Data, (*v2.Metrics)(nil)):
70+
data = &v2.Metrics{}
71+
case typeurl.Is(stats.Data, (*wstats.Statistics)(nil)):
72+
data = &wstats.Statistics{}
73+
default:
74+
return nil, errors.New("cannot convert metric data to cgroups.Metrics or windows.Statistics")
75+
}
76+
77+
if err := typeurl.UnmarshalTo(stats.Data, data); err != nil {
6478
return nil, fmt.Errorf("failed to extract container metrics: %w", err)
6579
}
6680

67-
cpuStats, err := c.cpuContainerStats(meta.ID, false /* isSandbox */, s, protobuf.FromTimestamp(stats.Timestamp))
81+
cpuStats, err := c.cpuContainerStats(meta.ID, false /* isSandbox */, data, protobuf.FromTimestamp(stats.Timestamp))
6882
if err != nil {
6983
return nil, fmt.Errorf("failed to obtain cpu stats: %w", err)
7084
}
7185
cs.Cpu = cpuStats
7286

73-
memoryStats, err := c.memoryContainerStats(meta.ID, s, protobuf.FromTimestamp(stats.Timestamp))
87+
memoryStats, err := c.memoryContainerStats(meta.ID, data, protobuf.FromTimestamp(stats.Timestamp))
7488
if err != nil {
7589
return nil, fmt.Errorf("failed to obtain memory stats: %w", err)
7690
}
@@ -152,7 +166,7 @@ func (c *criService) cpuContainerStats(ID string, isSandbox bool, stats interfac
152166
}, nil
153167
}
154168
default:
155-
return nil, fmt.Errorf("unexpected metrics type: %v", metrics)
169+
return nil, fmt.Errorf("unexpected metrics type: %T from %s", metrics, reflect.TypeOf(metrics).Elem().PkgPath())
156170
}
157171
return nil, nil
158172
}
@@ -194,7 +208,7 @@ func (c *criService) memoryContainerStats(ID string, stats interface{}, timestam
194208
}, nil
195209
}
196210
default:
197-
return nil, fmt.Errorf("unexpected metrics type: %v", metrics)
211+
return nil, fmt.Errorf("unexpected metrics type: %T from %s", metrics, reflect.TypeOf(metrics).Elem().PkgPath())
198212
}
199213
return nil, nil
200214
}

0 commit comments

Comments
 (0)