improve(cgroups): skip KubeVirt helper containers in virt-launcher pods (#20896)
Ilya Mashchenko committed
Aug 27, 2025 at 21:55 UTC
105db69d581d6a6c0fb5a7120f200381c139e748
1 file changed
+75
-60
src/collectors/cgroups.plugin/cgroup-name.sh.in
+75
-60
@@ -16,14 +16,14 @@ cmd_line="'${0}' $(printf "'%s' " "${@}")"
16
PROGRAM_NAME="$(basename "${0}")"
17
18
# these should be the same with syslog() priorities
19
-NDLP_EMERG=0 # system is unusable
20
-NDLP_ALERT=1 # action must be taken immediately
21
-NDLP_CRIT=2 # critical conditions
22
-NDLP_ERR=3 # error conditions
23
-NDLP_WARN=4 # warning conditions
24
-NDLP_NOTICE=5 # normal but significant condition
25
-NDLP_INFO=6 # informational
26
-NDLP_DEBUG=7 # debug-level messages
19
+NDLP_EMERG=0 # system is unusable
20
+NDLP_ALERT=1 # action must be taken immediately
21
+NDLP_CRIT=2 # critical conditions
22
+NDLP_ERR=3 # error conditions
23
+NDLP_WARN=4 # warning conditions
24
+NDLP_NOTICE=5 # normal but significant condition
25
+NDLP_INFO=6 # informational
26
+NDLP_DEBUG=7 # debug-level messages
27
28
# the max (numerically) log level we will log
29
LOG_LEVEL=$NDLP_INFO
@@ -72,7 +72,7 @@ log() {
72
73
[[ -n "$level" && -n "$LOG_LEVEL" && "$level" -gt "$LOG_LEVEL" ]] && return
74
75
- systemd-cat-native --log-as-netdata <<EOFLOG
75
+ systemd-cat-native --log-as-netdata << EOFLOG
76
INVOCATION_ID=${NETDATA_INVOCATION_ID}
77
SYSLOG_IDENTIFIER=${PROGRAM_NAME}
78
PRIORITY=${level}
@@ -110,7 +110,7 @@ debug() {
110
111
function parse_docker_like_inspect_output() {
112
local output="${1}"
113
- eval "$(grep -E "^(NOMAD_NAMESPACE|NOMAD_JOB_NAME|NOMAD_TASK_NAME|NOMAD_SHORT_ALLOC_ID|CONT_NAME|IMAGE_NAME)=" <<<"$output")"
113
+ eval "$(grep -E "^(NOMAD_NAMESPACE|NOMAD_JOB_NAME|NOMAD_TASK_NAME|NOMAD_SHORT_ALLOC_ID|CONT_NAME|IMAGE_NAME)=" <<< "$output")"
114
if [ -n "$NOMAD_NAMESPACE" ] && [ -n "$NOMAD_JOB_NAME" ] && [ -n "$NOMAD_TASK_NAME" ] && [ -n "$NOMAD_SHORT_ALLOC_ID" ]; then
115
NAME="${NOMAD_NAMESPACE}-${NOMAD_JOB_NAME}-${NOMAD_TASK_NAME}-${NOMAD_SHORT_ALLOC_ID}"
116
else
@@ -122,7 +122,7 @@ function parse_docker_like_inspect_output() {
122
123
while IFS= read -r line; do
124
if [[ $line == LABEL_netdata.cloud/* ]]; then
125
- IFS="=" read -r lname lval <<<"$line"
125
+ IFS="=" read -r lname lval <<< "$line"
126
lname=${lname#LABEL_}
127
if [ -n "$LABELS" ]; then
128
LABELS="$LABELS,${lname}=\"${lval}\""
@@ -130,7 +130,7 @@ function parse_docker_like_inspect_output() {
130
LABELS="${lname}=\"${lval}\""
131
fi
132
fi
133
- done <<<"$output"
133
+ done <<< "$output"
134
}
135
136
function docker_like_get_name_command() {
@@ -139,7 +139,7 @@ function docker_like_get_name_command() {
139
# shellcheck disable=SC2016
140
if OUTPUT="$(${command} inspect --format='{{range .Config.Env}}{{println .}}{{end}}{{range $key, $value := .Config.Labels}}LABEL_{{$key}}={{$value}}{{println}}{{end}}IMAGE_NAME={{.Config.Image}}{{println}}CONT_NAME={{.Name}}' "${id}")" &&
141
[ -n "$OUTPUT" ]; then
142
- parse_docker_like_inspect_output "$OUTPUT"
142
+ parse_docker_like_inspect_output "$OUTPUT"
143
fi
144
return 0
145
}
@@ -155,7 +155,7 @@ function docker_like_get_name_api() {
155
return 1
156
fi
157
158
- if ! command -v jq >/dev/null 2>&1; then
158
+ if ! command -v jq > /dev/null 2>&1; then
159
warning "Can't find jq command line tool. jq is required for netdata to retrieve container name using ${host} API, falling back to docker ps"
160
return 1
161
fi
@@ -248,13 +248,13 @@ function k8s_is_pause_container() {
248
[ ! -f "$file" ] && return 1
249
250
local procs
251
- IFS= read -rd' ' procs 2>/dev/null <"$file"
251
+ IFS= read -rd' ' procs 2> /dev/null < "$file"
252
#shellcheck disable=SC2206
253
procs=($procs)
254
255
[ "${#procs[@]}" -ne 1 ] && return 1
256
257
- IFS= read -r comm 2>/dev/null <"/proc/${procs[0]}/comm"
257
+ IFS= read -r comm 2> /dev/null < "/proc/${procs[0]}/comm"
258
259
[ "$comm" == "pause" ]
260
return
@@ -384,12 +384,12 @@ function k8s_get_kubepod_name() {
384
[ -f "$tmp_kube_cluster_name" ] &&
385
[ -f "$tmp_kube_system_ns_uid_file" ] &&
386
[ -f "$tmp_kube_containers_file" ] &&
387
- labels=$(grep "$cntr_id" "$tmp_kube_containers_file" 2>/dev/null); then
388
- IFS= read -r kube_system_uid 2>/dev/null <"$tmp_kube_system_ns_uid_file"
389
- IFS= read -r kube_cluster_name 2>/dev/null <"$tmp_kube_cluster_name"
387
+ labels=$(grep "$cntr_id" "$tmp_kube_containers_file" 2> /dev/null); then
388
+ IFS= read -r kube_system_uid 2> /dev/null < "$tmp_kube_system_ns_uid_file"
389
+ IFS= read -r kube_cluster_name 2> /dev/null < "$tmp_kube_cluster_name"
390
else
391
- IFS= read -r kube_system_uid 2>/dev/null <"$tmp_kube_system_ns_uid_file"
392
- IFS= read -r kube_cluster_name 2>/dev/null <"$tmp_kube_cluster_name"
391
+ IFS= read -r kube_system_uid 2> /dev/null < "$tmp_kube_system_ns_uid_file"
392
+ IFS= read -r kube_cluster_name 2> /dev/null < "$tmp_kube_cluster_name"
393
[ -z "$kube_cluster_name" ] && ! kube_cluster_name=$(k8s_gcp_get_cluster_name) && kube_cluster_name="unknown"
394
395
local kube_system_ns
@@ -397,7 +397,7 @@ function k8s_get_kubepod_name() {
397
398
if [ -n "${KUBERNETES_SERVICE_HOST}" ] && [ -n "${KUBERNETES_PORT_443_TCP_PORT}" ]; then
399
local token header host url
400
- token="$(</var/run/secrets/kubernetes.io/serviceaccount/token)"
400
+ token="$(< /var/run/secrets/kubernetes.io/serviceaccount/token)"
401
header="Authorization: Bearer $token"
402
host="$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT"
403
@@ -422,7 +422,7 @@ function k8s_get_kubepod_name() {
422
warning "${fn}: error on curl '${url}': ${pods}."
423
return 1
424
fi
425
- elif ps -C kubelet >/dev/null 2>&1 && command -v kubectl >/dev/null 2>&1; then
425
+ elif ps -C kubelet > /dev/null 2>&1 && command -v kubectl > /dev/null 2>&1; then
426
if [ -z "$kube_system_uid" ]; then
427
if ! kube_system_ns=$(kubectl --kubeconfig="$KUBE_CONFIG" get namespaces kube-system -o json 2>&1); then
428
warning "${fn}: error on 'kubectl': ${kube_system_ns}."
@@ -439,7 +439,7 @@ function k8s_get_kubepod_name() {
439
return 1
440
fi
441
442
- if [ -n "$kube_system_ns" ] && ! kube_system_uid=$(jq -r '.metadata.uid' <<<"$kube_system_ns" 2>&1); then
442
+ if [ -n "$kube_system_ns" ] && ! kube_system_uid=$(jq -r '.metadata.uid' <<< "$kube_system_ns" 2>&1); then
443
warning "${fn}: error on 'jq' parse kube_system_ns: ${kube_system_uid}."
444
fi
445
@@ -459,14 +459,14 @@ function k8s_get_kubepod_name() {
459
jq_filter+='sub("(docker|cri-o|containerd)://";"")' # containerID: docker://a346da9bc0e3eaba6b295f64ac16e02f2190db2cef570835706a9e7a36e2c722
460
461
local containers
462
- if ! containers=$(jq -r "${jq_filter}" <<<"$pods" 2>&1); then
462
+ if ! containers=$(jq -r "${jq_filter}" <<< "$pods" 2>&1); then
463
warning "${fn}: error on 'jq' parse pods: ${containers}."
464
return 1
465
fi
466
467
- [ -n "$kube_cluster_name" ] && echo "$kube_cluster_name" >"$tmp_kube_cluster_name" 2>/dev/null
468
- [ -n "$kube_system_ns" ] && [ -n "$kube_system_uid" ] && echo "$kube_system_uid" >"$tmp_kube_system_ns_uid_file" 2>/dev/null
469
- echo "$containers" >"$tmp_kube_containers_file" 2>/dev/null
467
+ [ -n "$kube_cluster_name" ] && echo "$kube_cluster_name" > "$tmp_kube_cluster_name" 2> /dev/null
468
+ [ -n "$kube_system_ns" ] && [ -n "$kube_system_uid" ] && echo "$kube_system_uid" > "$tmp_kube_system_ns_uid_file" 2> /dev/null
469
+ echo "$containers" > "$tmp_kube_containers_file" 2> /dev/null
470
fi
471
472
local qos_class
@@ -480,6 +480,21 @@ function k8s_get_kubepod_name() {
480
# namespace, pod_name, pod_uid, container_name, container_id, node_name
481
if [ -n "$cntr_id" ]; then
482
if [ -n "$labels" ] || labels=$(grep "$cntr_id" <<< "$containers" 2> /dev/null); then
483
+
484
+ # --- skip kubevirt helper containers in virt-launcher pods ---
485
+ local container_name pod_name
486
+ container_name="$(get_lbl_val "$labels" container_name)"
487
+ pod_name="$(get_lbl_val "$labels" pod_name)"
488
+
489
+ if [[ "$pod_name" == virt-launcher-* ]]; then
490
+ case "$container_name" in
491
+ volumerootdisk | guest-console-log)
492
+ info "${fn}: skipping kubevirt helper container '$container_name' in pod '$pod_name'"
493
+ return 3
494
+ ;;
495
+ esac
496
+ fi
497
+
498
labels+=',kind="container"'
499
labels+=",qos_class=\"$qos_class\""
500
[ -n "$kube_system_uid" ] && [ "$kube_system_uid" != "null" ] && labels+=",cluster_id=\"$kube_system_uid\""
@@ -537,45 +552,45 @@ function k8s_get_name() {
552
kubepod_name=$(k8s_get_kubepod_name "$cgroup_path" "$id")
553
554
case "$?" in
540
- 0)
541
- kubepod_name="k8s_${kubepod_name}"
555
+ 0)
556
+ kubepod_name="k8s_${kubepod_name}"
557
543
- local name labels
544
- name=${kubepod_name%% *}
545
- labels=${kubepod_name#* }
558
+ local name labels
559
+ name=${kubepod_name%% *}
560
+ labels=${kubepod_name#* }
561
547
- if [ "$name" != "$labels" ]; then
548
- info "${fn}: cgroup '${id}' has chart name '${name}', labels '${labels}"
549
- NAME="$name"
550
- LABELS="$labels"
551
- else
552
- info "${fn}: cgroup '${id}' has chart name '${NAME}'"
553
- NAME="$name"
554
- fi
555
- EXIT_CODE=$EXIT_SUCCESS
556
- ;;
557
- 1)
558
- NAME="k8s_${id}"
559
- warning "${fn}: cannot find the name of cgroup with id '${id}'. Setting name to ${NAME} and enabling it."
560
- EXIT_CODE=$EXIT_SUCCESS
561
- ;;
562
- 2)
563
- NAME="k8s_${id}"
564
- warning "${fn}: cannot find the name of cgroup with id '${id}'. Setting name to ${NAME} and asking for retry."
565
- EXIT_CODE=$EXIT_RETRY
566
- ;;
567
- *)
568
- NAME="k8s_${id}"
569
- warning "${fn}: cannot find the name of cgroup with id '${id}'. Setting name to ${NAME} and disabling it."
570
- EXIT_CODE=$EXIT_DISABLE
571
- ;;
562
+ if [ "$name" != "$labels" ]; then
563
+ info "${fn}: cgroup '${id}' has chart name '${name}', labels '${labels}"
564
+ NAME="$name"
565
+ LABELS="$labels"
566
+ else
567
+ info "${fn}: cgroup '${id}' has chart name '${NAME}'"
568
+ NAME="$name"
569
+ fi
570
+ EXIT_CODE=$EXIT_SUCCESS
571
+ ;;
572
+ 1)
573
+ NAME="k8s_${id}"
574
+ warning "${fn}: cannot find the name of cgroup with id '${id}'. Setting name to ${NAME} and enabling it."
575
+ EXIT_CODE=$EXIT_SUCCESS
576
+ ;;
577
+ 2)
578
+ NAME="k8s_${id}"
579
+ warning "${fn}: cannot find the name of cgroup with id '${id}'. Setting name to ${NAME} and asking for retry."
580
+ EXIT_CODE=$EXIT_RETRY
581
+ ;;
582
+ *)
583
+ NAME="k8s_${id}"
584
+ warning "${fn}: cannot find the name of cgroup with id '${id}'. Setting name to ${NAME} and disabling it."
585
+ EXIT_CODE=$EXIT_DISABLE
586
+ ;;
587
esac
588
}
589
590
function docker_get_name() {
591
local id="${1}"
592
# See https://github.com/netdata/netdata/pull/13523 for details
578
- if command -v snap >/dev/null 2>&1 && snap list docker >/dev/null 2>&1; then
593
+ if command -v snap > /dev/null 2>&1 && snap list docker > /dev/null 2>&1; then
594
docker_like_get_name_api DOCKER_HOST "${id}"
595
elif hash docker 2> /dev/null; then
596
docker_like_get_name_command docker "${id}"
@@ -629,7 +644,7 @@ function podman_validate_id() {
644
645
DOCKER_HOST="${DOCKER_HOST:=unix:///var/run/docker.sock}"
646
PODMAN_HOST="${PODMAN_HOST:=unix:///run/podman/podman.sock}"
632
-CGROUP_PATH="${1}" # the path as it is (e.g. '/docker/efcf4c409')
647
+CGROUP_PATH="${1}" # the path as it is (e.g. '/docker/efcf4c409')
648
CGROUP="${2//\//_}" # the modified path (e.g. 'docker_efcf4c409')
649
EXIT_SUCCESS=0
650
EXIT_RETRY=2