fix(observability): cAdvisor 0.55.1 — 0.52 не видит контейнеры на Docker 29 #3109

Merged
lekss361 merged 1 commit from fix/cadvisor-bump-055 into main 2026-08-26 10:41:26 +00:00
Owner

Догоняем #3108: тот PR пустые панели по контейнерам не починил, и правило relabel в нём было ни при чём. Настоящая причина оказалась глубже.

Причина

Docker 29 на обоих хостах работает через containerd-snapshotter, а cAdvisor 0.52 ищет метаданные слоя в легаси-хранилище:

failed to identify the read-write layer ID for container "<id>"
- open /rootfs/var/lib/docker/image/overlayfs/layerdb/mounts/<id>/mount-id:
  no such file or directory
Beget Poincare
Docker 29.4.1 29.7.2
Storage Driver overlayfs overlayfs
snapshotter io.containerd.snapshotter.v1 то же
/var/lib/docker/image/ только identity-cache.db

При снапшоттере каталога image/<driver>/layerdb нет вовсе — метаданные слоёв живут в containerd. Обработчик контейнера не создаётся, и наружу уходит ровно один ряд:

container_last_seen{id="/"} 1.787739688e+09

Отсюда «нодата» на панелях контейнеров при живых node / postgres / app метриках.

Проверка — пробами с ПРОДОВЫМИ флагами на обоих хостах

Одноразовые контейнеры, убраны за собой:

Beget    (Docker 29.4.1): 22 ряда container_last_seen, все с name=, ошибок rw-layer 0
Poincare (Docker 29.7.2): 23 ряда container_last_seen, все с name=, ошибок rw-layer 0

Примеры того, что появилось:

container_last_seen{id="…docker-071553b9….scope",image="grafana/alloy:v1.6.1",name="gendesign-alloy"}
container_last_seen{id="…docker-129dff33….scope",image="ghcr.io/lekss361/gendesign-backend:latest",name="gendesign-backend-1"}
container_last_seen{id="…docker-1eb15720….scope",image="osrm/osrm-backend:latest",name="gendesign-osrm-1"}

Ровно то, чего не хватало панелям.

Заодно

Поправлен комментарий, который я же вписал в cadvisor_trim в #3108: он объяснял пустые панели трактовкой пустого regex — это оказалось неверно. Само правило корректно и остаётся (корневой ряд приходит с name="" и должен отсеиваться), но объяснение рядом с ним уводило бы следующий разбор по ложному следу.

Почему тег .1

В реестре нет ни v0.53.0, ни v0.54.0, ни v0.55.0 — только v0.54.1 и v0.55.1. В прошлый раз я проверял подбором тегов и сделал неверный вывод «новее 0.52.1 ничего нет»; теперь смотрел по списку тегов реестра.

Проверки

  • yaml.safe_load для docker-compose.metrics-agent.yml — ok
  • alloy fmt обоих .alloy в grafana/alloy:v1.6.1 — exit 0
  • флаги не менялись: проба запускалась с тем же набором --docker_only / --disable_metrics / --store_container_labels, что в compose, и 0.55.1 их принял

После мёрджа

count(container_last_seen) должен перестать быть пустым — проверю.

Догоняем #3108: тот PR пустые панели по контейнерам **не починил**, и правило relabel в нём было ни при чём. Настоящая причина оказалась глубже. ## Причина Docker 29 на обоих хостах работает через containerd-snapshotter, а cAdvisor 0.52 ищет метаданные слоя в легаси-хранилище: ``` failed to identify the read-write layer ID for container "<id>" - open /rootfs/var/lib/docker/image/overlayfs/layerdb/mounts/<id>/mount-id: no such file or directory ``` | | Beget | Poincare | |---|---|---| | Docker | 29.4.1 | 29.7.2 | | Storage Driver | `overlayfs` | `overlayfs` | | snapshotter | `io.containerd.snapshotter.v1` | то же | | `/var/lib/docker/image/` | — | только `identity-cache.db` | При снапшоттере каталога `image/<driver>/layerdb` нет вовсе — метаданные слоёв живут в containerd. Обработчик контейнера не создаётся, и наружу уходит ровно один ряд: ``` container_last_seen{id="/"} 1.787739688e+09 ``` Отсюда «нодата» на панелях контейнеров при живых node / postgres / app метриках. ## Проверка — пробами с ПРОДОВЫМИ флагами на обоих хостах Одноразовые контейнеры, убраны за собой: ``` Beget (Docker 29.4.1): 22 ряда container_last_seen, все с name=, ошибок rw-layer 0 Poincare (Docker 29.7.2): 23 ряда container_last_seen, все с name=, ошибок rw-layer 0 ``` Примеры того, что появилось: ``` container_last_seen{id="…docker-071553b9….scope",image="grafana/alloy:v1.6.1",name="gendesign-alloy"} container_last_seen{id="…docker-129dff33….scope",image="ghcr.io/lekss361/gendesign-backend:latest",name="gendesign-backend-1"} container_last_seen{id="…docker-1eb15720….scope",image="osrm/osrm-backend:latest",name="gendesign-osrm-1"} ``` Ровно то, чего не хватало панелям. ## Заодно Поправлен комментарий, который я же вписал в `cadvisor_trim` в #3108: он объяснял пустые панели трактовкой пустого regex — это оказалось неверно. Само правило корректно и остаётся (корневой ряд приходит с `name=""` и должен отсеиваться), но объяснение рядом с ним уводило бы следующий разбор по ложному следу. ## Почему тег `.1` В реестре нет ни `v0.53.0`, ни `v0.54.0`, ни `v0.55.0` — только `v0.54.1` и `v0.55.1`. В прошлый раз я проверял подбором тегов и сделал неверный вывод «новее 0.52.1 ничего нет»; теперь смотрел по списку тегов реестра. ## Проверки - `yaml.safe_load` для `docker-compose.metrics-agent.yml` — ok - `alloy fmt` обоих `.alloy` в `grafana/alloy:v1.6.1` — exit 0 - флаги не менялись: проба запускалась с тем же набором `--docker_only` / `--disable_metrics` / `--store_container_labels`, что в compose, и 0.55.1 их принял ## После мёрджа `count(container_last_seen)` должен перестать быть пустым — проверю.
lekss361 added 1 commit 2026-08-26 10:40:37 +00:00
fix(observability): cAdvisor 0.55.1 — 0.52 не видит контейнеры на Docker 29
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
a72d39d74d
#3108 не починил пустые панели по контейнерам, и правило relabel там было ни
при чём. Настоящая причина глубже: Docker 29 на обоих хостах работает через
containerd-snapshotter (Storage Driver = overlayfs), а cAdvisor 0.52 ищет
метаданные слоя в легаси-хранилище:

    failed to identify the read-write layer ID for container "<id>"
    - open /rootfs/var/lib/docker/image/overlayfs/layerdb/mounts/<id>/mount-id:
      no such file or directory

При снапшоттере этого каталога нет вовсе — в /var/lib/docker/image/ лежит
только identity-cache.db, метаданные слоёв живут в containerd. Обработчик
контейнера не создаётся, и наружу уходит ровно один ряд: корневой cgroup
container_last_seen{id="/"}. Отсюда и «нодата» на панелях контейнеров при
живых node/postgres/app метриках.

0.55.1 умеет читать containerd-снапшоттер. Проверено пробами с ПРОДОВЫМИ
флагами на обоих хостах (одноразовые контейнеры, убраны за собой):

  Beget    (Docker 29.4.1): 22 ряда, все с name=, ошибок rw-layer 0
  Poincare (Docker 29.7.2): 23 ряда, все с name=, ошибок rw-layer 0

Примеры рядов — name="gendesign-alloy", name="gendesign-backend-1",
name="gendesign-osrm-1", с лейблом image. То есть именно то, чего не хватало
панелям.

Заодно поправлен комментарий, который я же вписал в cadvisor_trim в #3108: он
объяснял пустые панели трактовкой пустого regex, а это оказалось неверно.
Правило корректно и остаётся (корневой ряд приходит с name="" и должен
отсеиваться), но объяснение рядом с ним вводило в заблуждение.

Почему тег .1, а не .0: в реестре нет ни v0.53.0, ни v0.54.0, ни v0.55.0 —
только v0.54.1 и v0.55.1. Проверял по списку тегов, а не подбором.

Проверки: yaml.safe_load compose — ok; alloy fmt обоих .alloy в
grafana/alloy:v1.6.1 — exit 0.
lekss361 merged commit 52b076fa4a into main 2026-08-26 10:41:26 +00:00
lekss361 deleted branch fix/cadvisor-bump-055 2026-08-26 10:41:26 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3109
No description provided.