From a72d39d74d3ed0d78d1e2509b6cefb250299d9e8 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Wed, 26 Aug 2026 13:40:03 +0300 Subject: [PATCH] =?UTF-8?q?fix(observability):=20cAdvisor=200.55.1=20?= =?UTF-8?q?=E2=80=94=200.52=20=D0=BD=D0=B5=20=D0=B2=D0=B8=D0=B4=D0=B8?= =?UTF-8?q?=D1=82=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=B9=D0=BD=D0=B5=D1=80?= =?UTF-8?q?=D1=8B=20=D0=BD=D0=B0=20Docker=2029?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #3108 не починил пустые панели по контейнерам, и правило relabel там было ни при чём. Настоящая причина глубже: Docker 29 на обоих хостах работает через containerd-snapshotter (Storage Driver = overlayfs), а cAdvisor 0.52 ищет метаданные слоя в легаси-хранилище: failed to identify the read-write layer ID for container "" - open /rootfs/var/lib/docker/image/overlayfs/layerdb/mounts//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. --- docker-compose.metrics-agent.yml | 6 +++++- ops/metrics/alloy/alloy-apps.alloy | 11 +++++++---- ops/metrics/alloy/alloy-infra.alloy | 11 +++++++---- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/docker-compose.metrics-agent.yml b/docker-compose.metrics-agent.yml index 11eddf4b..94bae061 100644 --- a/docker-compose.metrics-agent.yml +++ b/docker-compose.metrics-agent.yml @@ -116,7 +116,11 @@ services: # Читает докер-сокет, поэтому видит ВСЕ контейнеры хоста независимо от сетей — # отдельно подключать его к gendesign_default не нужно. cadvisor: - image: gcr.io/cadvisor/cadvisor:v0.52.1 + # v0.55.1, не v0.52.x: Docker 29 работает через containerd-snapshotter + # (Storage Driver = overlayfs), а 0.52 искал метаданные слоя в легаси + # /var/lib/docker/image//layerdb, которого при снапшоттере + # просто нет. Итог был — ни одной метрики по контейнерам. + image: gcr.io/cadvisor/cadvisor:v0.55.1 container_name: gendesign-cadvisor restart: unless-stopped privileged: true diff --git a/ops/metrics/alloy/alloy-apps.alloy b/ops/metrics/alloy/alloy-apps.alloy index f1e03dd3..05acbb8c 100644 --- a/ops/metrics/alloy/alloy-apps.alloy +++ b/ops/metrics/alloy/alloy-apps.alloy @@ -92,10 +92,13 @@ prometheus.relabel "cadvisor_trim" { action = "keep" } - // Служебные контейнеры docker без имени только зашумляют графики. - // keep .+ вместо drop с пустым regex: в Alloy незаданный regex - // документированно дефолтится в (.*), а пустая строка неотличима от - // незаданного значения — такой drop рискует выкинуть вообще все ряды. + // Служебные ряды без имени (корневой cgroup, id="/") только зашумляют графики. + // keep .+ вместо drop с пустым regex — та же мысль, но без зависимости от + // трактовки пустого regex: в Alloy он неотличим от незаданного, а незаданный + // дефолтится в (.*). + // + // NB: на пустые панели это правило НЕ влияло. Причина была в cAdvisor 0.52 на + // Docker 29 — до сюда доезжал ровно один ряд, корневой. Лечится версией 0.55.1. rule { source_labels = ["name"] regex = ".+" diff --git a/ops/metrics/alloy/alloy-infra.alloy b/ops/metrics/alloy/alloy-infra.alloy index 0ecc6ffe..bc55f1dd 100644 --- a/ops/metrics/alloy/alloy-infra.alloy +++ b/ops/metrics/alloy/alloy-infra.alloy @@ -63,10 +63,13 @@ prometheus.relabel "cadvisor_trim" { action = "keep" } - // Служебные контейнеры docker без имени только зашумляют графики. - // keep .+ вместо drop с пустым regex: в Alloy незаданный regex - // документированно дефолтится в (.*), а пустая строка неотличима от - // незаданного значения — такой drop рискует выкинуть вообще все ряды. + // Служебные ряды без имени (корневой cgroup, id="/") только зашумляют графики. + // keep .+ вместо drop с пустым regex — та же мысль, но без зависимости от + // трактовки пустого regex: в Alloy он неотличим от незаданного, а незаданный + // дефолтится в (.*). + // + // NB: на пустые панели это правило НЕ влияло. Причина была в cAdvisor 0.52 на + // Docker 29 — до сюда доезжал ровно один ряд, корневой. Лечится версией 0.55.1. rule { source_labels = ["name"] regex = ".+" -- 2.45.3