Skip to content

Commit 4f01eb5

Browse files
authored
Merge pull request kubernetes#74336 from littleroad/exited_container
cri_stats_provider: Implement removeTerminatedContainer correctly
2 parents 9fd7a4c + 3f8eda3 commit 4f01eb5

File tree

3 files changed

+67
-8
lines changed

3 files changed

+67
-8
lines changed

pkg/kubelet/stats/cri_stats_provider.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,12 +455,19 @@ func (p *criStatsProvider) makeContainerStats(
455455
if usageNanoCores != nil {
456456
result.CPU.UsageNanoCores = usageNanoCores
457457
}
458+
} else {
459+
result.CPU.Time = metav1.NewTime(time.Unix(0, time.Now().UnixNano()))
460+
result.CPU.UsageCoreNanoSeconds = Uint64Ptr(0)
461+
result.CPU.UsageNanoCores = Uint64Ptr(0)
458462
}
459463
if stats.Memory != nil {
460464
result.Memory.Time = metav1.NewTime(time.Unix(0, stats.Memory.Timestamp))
461465
if stats.Memory.WorkingSetBytes != nil {
462466
result.Memory.WorkingSetBytes = &stats.Memory.WorkingSetBytes.Value
463467
}
468+
} else {
469+
result.Memory.Time = metav1.NewTime(time.Unix(0, time.Now().UnixNano()))
470+
result.Memory.WorkingSetBytes = Uint64Ptr(0)
464471
}
465472
if stats.WritableLayer != nil {
466473
result.Rootfs.Time = metav1.NewTime(time.Unix(0, stats.WritableLayer.Timestamp))
@@ -516,13 +523,21 @@ func (p *criStatsProvider) makeContainerCPUAndMemoryStats(
516523
if usageNanoCores != nil {
517524
result.CPU.UsageNanoCores = usageNanoCores
518525
}
526+
} else {
527+
result.CPU.Time = metav1.NewTime(time.Unix(0, time.Now().UnixNano()))
528+
result.CPU.UsageCoreNanoSeconds = Uint64Ptr(0)
529+
result.CPU.UsageNanoCores = Uint64Ptr(0)
519530
}
520531
if stats.Memory != nil {
521532
result.Memory.Time = metav1.NewTime(time.Unix(0, stats.Memory.Timestamp))
522533
if stats.Memory.WorkingSetBytes != nil {
523534
result.Memory.WorkingSetBytes = &stats.Memory.WorkingSetBytes.Value
524535
}
536+
} else {
537+
result.Memory.Time = metav1.NewTime(time.Unix(0, time.Now().UnixNano()))
538+
result.Memory.WorkingSetBytes = Uint64Ptr(0)
525539
}
540+
526541
return result
527542
}
528543

pkg/kubelet/stats/cri_stats_provider_test.go

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,19 +57,23 @@ const (
5757
seedContainer2 = 5000
5858
seedSandbox2 = 6000
5959
seedContainer3 = 7000
60+
seedSandbox3 = 8000
61+
seedContainer5 = 9000
6062
)
6163

6264
const (
6365
pName0 = "pod0"
6466
pName1 = "pod1"
6567
pName2 = "pod2"
68+
pName3 = "pod3"
6669
)
6770

6871
const (
6972
cName0 = "container0-name"
7073
cName1 = "container1-name"
7174
cName2 = "container2-name"
7275
cName3 = "container3-name"
76+
cName5 = "container5-name"
7377
)
7478

7579
func TestCRIListPodStats(t *testing.T) {
@@ -101,6 +105,11 @@ func TestCRIListPodStats(t *testing.T) {
101105
container4 = makeFakeContainer(sandbox2, cName3, 1, false)
102106
containerStats4 = makeFakeContainerStats(container4, imageFsMountpoint)
103107
containerLogStats4 = makeFakeLogStats(4000)
108+
109+
sandbox3 = makeFakePodSandbox("sandbox3-name", "sandbox3-uid", "sandbox3-ns")
110+
container5 = makeFakeContainer(sandbox3, cName5, 0, true)
111+
containerStats5 = makeFakeContainerStats(container5, imageFsMountpoint)
112+
containerLogStats5 = makeFakeLogStats(5000)
104113
)
105114

106115
var (
@@ -140,13 +149,13 @@ func TestCRIListPodStats(t *testing.T) {
140149
On("GetDirFsInfo", imageFsMountpoint).Return(imageFsInfo, nil).
141150
On("GetDirFsInfo", unknownMountpoint).Return(cadvisorapiv2.FsInfo{}, cadvisorfs.ErrNoSuchDevice)
142151
fakeRuntimeService.SetFakeSandboxes([]*critest.FakePodSandbox{
143-
sandbox0, sandbox1, sandbox2,
152+
sandbox0, sandbox1, sandbox2, sandbox3,
144153
})
145154
fakeRuntimeService.SetFakeContainers([]*critest.FakeContainer{
146-
container0, container1, container2, container3, container4,
155+
container0, container1, container2, container3, container4, container5,
147156
})
148157
fakeRuntimeService.SetFakeContainerStats([]*runtimeapi.ContainerStats{
149-
containerStats0, containerStats1, containerStats2, containerStats3, containerStats4,
158+
containerStats0, containerStats1, containerStats2, containerStats3, containerStats4, containerStats5,
150159
})
151160

152161
ephemeralVolumes := makeFakeVolumeStats([]string{"ephVolume1, ephVolumes2"})
@@ -161,6 +170,7 @@ func TestCRIListPodStats(t *testing.T) {
161170
kuberuntime.BuildContainerLogsDirectory(types.UID("sandbox0-uid"), cName1): containerLogStats1,
162171
kuberuntime.BuildContainerLogsDirectory(types.UID("sandbox1-uid"), cName2): containerLogStats2,
163172
kuberuntime.BuildContainerLogsDirectory(types.UID("sandbox2-uid"), cName3): containerLogStats4,
173+
kuberuntime.BuildContainerLogsDirectory(types.UID("sandbox3-uid"), cName5): containerLogStats5,
164174
}
165175
fakeLogStatsProvider := NewFakeLogMetricsService(fakeLogStats)
166176

@@ -177,7 +187,7 @@ func TestCRIListPodStats(t *testing.T) {
177187
stats, err := provider.ListPodStats()
178188
assert := assert.New(t)
179189
assert.NoError(err)
180-
assert.Equal(3, len(stats))
190+
assert.Equal(4, len(stats))
181191

182192
podStatsMap := make(map[statsapi.PodReference]statsapi.PodStats)
183193
for _, s := range stats {
@@ -239,6 +249,19 @@ func TestCRIListPodStats(t *testing.T) {
239249
checkCRINetworkStats(assert, p2.Network, infos[sandbox2.PodSandboxStatus.Id].Stats[0].Network)
240250
checkCRIPodCPUAndMemoryStats(assert, p2, infos[sandbox2Cgroup].Stats[0])
241251

252+
p3 := podStatsMap[statsapi.PodReference{Name: "sandbox3-name", UID: "sandbox3-uid", Namespace: "sandbox3-ns"}]
253+
assert.Equal(sandbox3.CreatedAt, p3.StartTime.UnixNano())
254+
assert.Equal(1, len(p3.Containers))
255+
256+
c5 := p3.Containers[0]
257+
assert.Equal(cName5, c5.Name)
258+
assert.Equal(container5.CreatedAt, c5.StartTime.UnixNano())
259+
assert.NotNil(c5.CPU.Time)
260+
assert.Zero(*c5.CPU.UsageCoreNanoSeconds)
261+
assert.Zero(*c5.CPU.UsageNanoCores)
262+
assert.NotNil(c5.Memory.Time)
263+
assert.Zero(*c5.Memory.WorkingSetBytes)
264+
242265
mockCadvisor.AssertExpectations(t)
243266
}
244267

@@ -266,6 +289,10 @@ func TestCRIListPodCPUAndMemoryStats(t *testing.T) {
266289
containerStats3 = makeFakeContainerStats(container3, imageFsMountpoint)
267290
container4 = makeFakeContainer(sandbox2, cName3, 1, false)
268291
containerStats4 = makeFakeContainerStats(container4, imageFsMountpoint)
292+
293+
sandbox3 = makeFakePodSandbox("sandbox3-name", "sandbox3-uid", "sandbox3-ns")
294+
container5 = makeFakeContainer(sandbox3, cName5, 0, true)
295+
containerStats5 = makeFakeContainerStats(container5, imageFsMountpoint)
269296
)
270297

271298
var (
@@ -301,13 +328,13 @@ func TestCRIListPodCPUAndMemoryStats(t *testing.T) {
301328
mockCadvisor.
302329
On("ContainerInfoV2", "/", options).Return(infos, nil)
303330
fakeRuntimeService.SetFakeSandboxes([]*critest.FakePodSandbox{
304-
sandbox0, sandbox1, sandbox2,
331+
sandbox0, sandbox1, sandbox2, sandbox3,
305332
})
306333
fakeRuntimeService.SetFakeContainers([]*critest.FakeContainer{
307-
container0, container1, container2, container3, container4,
334+
container0, container1, container2, container3, container4, container5,
308335
})
309336
fakeRuntimeService.SetFakeContainerStats([]*runtimeapi.ContainerStats{
310-
containerStats0, containerStats1, containerStats2, containerStats3, containerStats4,
337+
containerStats0, containerStats1, containerStats2, containerStats3, containerStats4, containerStats5,
311338
})
312339

313340
ephemeralVolumes := makeFakeVolumeStats([]string{"ephVolume1, ephVolumes2"})
@@ -330,7 +357,7 @@ func TestCRIListPodCPUAndMemoryStats(t *testing.T) {
330357
stats, err := provider.ListPodCPUAndMemoryStats()
331358
assert := assert.New(t)
332359
assert.NoError(err)
333-
assert.Equal(3, len(stats))
360+
assert.Equal(4, len(stats))
334361

335362
podStatsMap := make(map[statsapi.PodReference]statsapi.PodStats)
336363
for _, s := range stats {
@@ -399,6 +426,19 @@ func TestCRIListPodCPUAndMemoryStats(t *testing.T) {
399426
assert.Nil(c2.Accelerators)
400427
assert.Nil(c2.UserDefinedMetrics)
401428

429+
p3 := podStatsMap[statsapi.PodReference{Name: "sandbox3-name", UID: "sandbox3-uid", Namespace: "sandbox3-ns"}]
430+
assert.Equal(sandbox3.CreatedAt, p3.StartTime.UnixNano())
431+
assert.Equal(1, len(p3.Containers))
432+
433+
c5 := p3.Containers[0]
434+
assert.Equal(cName5, c5.Name)
435+
assert.Equal(container5.CreatedAt, c5.StartTime.UnixNano())
436+
assert.NotNil(c5.CPU.Time)
437+
assert.Zero(*c5.CPU.UsageCoreNanoSeconds)
438+
assert.Zero(*c5.CPU.UsageNanoCores)
439+
assert.NotNil(c5.Memory.Time)
440+
assert.Zero(*c5.Memory.WorkingSetBytes)
441+
402442
mockCadvisor.AssertExpectations(t)
403443
}
404444

pkg/kubelet/stats/helper.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,3 +326,7 @@ func getUint64Value(value *uint64) uint64 {
326326

327327
return *value
328328
}
329+
330+
func Uint64Ptr(i uint64) *uint64 {
331+
return &i
332+
}

0 commit comments

Comments
 (0)