@cryptotaxi247 / netdata-1 / commits / 105db69d5

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