Skip to content

[cri] ListContainerStats returns empty response if filter is nil  #6198

@bobbypage

Description

@bobbypage

Description

xref: #6113 (comment)

Currently for the ListContainerStats RPC in CRI, if a nil filter is supplied, the response is empty. This is not consistent with other containerd CRI List calls which provide full list if nil filter is supplied.

For ListContainerStats, in the current implementation is

  1. We create a metrics request

    request, containers, err := c.buildTaskMetricsRequest(in)

  2. If the request is nil, we return req, nil, nil

func (c *criService) buildTaskMetricsRequest(
r *runtime.ListContainerStatsRequest,
) (tasks.MetricsRequest, []containerstore.Container, error) {
var req tasks.MetricsRequest
if r.GetFilter() == nil {
return req, nil, nil
}

  1. We call toCRIContainerStats passing nil for containers

criStats, err := c.toCRIContainerStats(resp.Metrics, containers)

  1. Since containers is nil, we will ultimately skip the for loop and return an empty response

containerStats := new(runtime.ListContainerStatsResponse)
for _, cntr := range containers {
cs, err := c.containerMetrics(cntr.Metadata, statsMap[cntr.ID])
if err != nil {
return nil, errors.Wrapf(err, "failed to decode container metrics for %q", cntr.ID)
}
containerStats.Stats = append(containerStats.Stats, cs)

As a comparison, for the ContainerList RPC, if filter is nil, all containers are returned.

func (c *criService) filterCRIContainers(containers []*runtime.Container, filter *runtime.ContainerFilter) []*runtime.Container {
if filter == nil {
return containers
}

This is behavior is also not consistent with CRI-O implementation for ListContainerStats.

We should identify it make sense to change the functionality so a nil filter will return full response.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/criContainer Runtime Interface (CRI)kind/bug

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions