Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions internal/lib/stats/descriptors.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,3 +163,12 @@ var (
LabelKeys: baseLabelKeys,
}
)

// Process metrics.
var (
containerProcesses = &types.MetricDescriptor{
Name: "container_processes",
Help: "Number of processes running inside the container",
LabelKeys: baseLabelKeys,
}
)
4 changes: 4 additions & 0 deletions internal/lib/stats/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ const (
MemoryMetrics = "memory"
NetworkMetrics = "network"
OOMMetrics = "oom"
ProcessMetrics = "process"
)

type metricValue struct {
Expand Down Expand Up @@ -90,6 +91,9 @@ func (ss *StatsServer) PopulateMetricDescriptors(includedKeys []string) map[stri
OOMMetrics: {
containerOomEventsTotal,
},
ProcessMetrics: {
containerProcesses,
},
}

return descriptorsMap
Expand Down
24 changes: 24 additions & 0 deletions internal/lib/stats/process_metrics.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package statsserver

import (
types "k8s.io/cri-api/pkg/apis/runtime/v1"

"github.com/cri-o/cri-o/internal/config/cgmgr"
"github.com/cri-o/cri-o/internal/lib/sandbox"
)

func generateSandboxProcessMetrics(sb *sandbox.Sandbox, pids *cgmgr.PidsStats) []*types.Metric {
processMetrics := []*containerMetric{
{
desc: containerProcesses,
valueFunc: func() metricValues {
return metricValues{{
value: pids.Current,
metricType: types.MetricType_GAUGE,
}}
},
},
}

return computeSandboxMetrics(sb, processMetrics, "process")
}
4 changes: 4 additions & 0 deletions internal/lib/stats/stats_server_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,10 @@ func (ss *StatsServer) containerMetricsFromCgStats(sb *sandbox.Sandbox, c *oci.C
metrics = append(metrics, oomMetrics...)
case NetworkMetrics:
continue // Network metrics are collected at the pod level only.
case ProcessMetrics:
if processMetrics := generateSandboxProcessMetrics(sb, cgstats.Pid); processMetrics != nil {
metrics = append(metrics, processMetrics...)
}
default:
log.Warnf(ss.ctx, "Unknown metric: %s", m)
}
Expand Down
30 changes: 28 additions & 2 deletions test/cri-metrics.bats
Original file line number Diff line number Diff line change
Expand Up @@ -169,10 +169,8 @@ EOF
collection_period = 0
included_pod_metrics = [
"network",
"cpu",
"hugetlb",
"memory",
"oom",
]
EOF
start_crio_no_setup
Expand Down Expand Up @@ -230,3 +228,31 @@ EOF
echo 0 | tee /proc/sys/vm/nr_hugepages
fi
}

@test "container process metrics" {
CONTAINER_ENABLE_METRICS="true" CONTAINER_METRICS_PORT=$(free_port) setup_crio
cat << EOF > "$CRIO_CONFIG"
[crio.stats]
collection_period = 0
included_pod_metrics = [
"network",
"memory",
"process",
]
EOF
start_crio_no_setup
check_images

metrics_setup
set_container_pod_cgroup_root "" "$CONTAINER_ID"

# run some processes in the container
crictl exec --sync "$CONTAINER_ID" /bin/bash -c 'sleep 30 &'
crictl exec --sync "$CONTAINER_ID" /bin/bash -c 'sleep 30 &'

metrics=$(crictl metricsp | jq '.podMetrics[0].containerMetrics[0].metrics[]')

# assert container_processes == 3
metrics_container_processes=$(echo "$metrics" | jq 'select(.name == "container_processes") | .value.value | tonumber')
[[ $metrics_container_processes == "3" ]]
}
Loading