Мониторинг контейнеров с помощью cAdvisor и Prometheus

10 минут чтения
Средний рейтинг статьи — 4.9

Контейнеры упростили деплой, но усложнили наблюдаемость: процессы изолированы, живут недолго, масштабируются динамически. Чтобы понимать, что происходит в системе, нужен мониторинг на уровне контейнеров.

Один из самых популярных стеков — cAdvisor + Prometheus. Он позволяет в реальном времени отслеживать CPU, память, сеть и дисковую активность контейнеров.

Что такое cAdvisor и Prometheus

cAdvisor (Container Advisor) — это агент от Google, который собирает метрики о контейнерах прямо с хоста.

Он умеет:

  • отслеживать использование CPU
  • показывать потребление памяти
  • собирать сетевые метрики
  • отдавать данные по HTTP в формате, понятном Prometheus

Фактически это «датчик», который снимает метрики с Docker.

Prometheus — это система мониторинга, которая:

  • периодически опрашивает (scrape) источники метрик
  • хранит их во временных рядах
  • позволяет строить запросы (PromQL)
  • используется для алертинга

У нас уже есть статья про базовый сетап мониторинга с помощью Prometheus + Grafana, сначала можно ознакомиться с ней.

В связке:

  • cAdvisor → отдаёт метрики
  • Prometheus → собирает и хранит

Как это работает вместе

  1. cAdvisor запускается на хосте
  2. Он собирает метрики контейнеров
  3. Prometheus опрашивает cAdvisor по HTTP
  4. Метрики сохраняются и становятся доступными для анализа

Схема:
Docker → cAdvisor → Prometheus → Grafana

Запуск и настройка

Самый простой способ — через Docker:

docker run -d \
  --name=cadvisor \
  -p 8080:8080 \
  -v /:/rootfs:ro \
  -v /var/run:/var/run:ro \
  -v /sys:/sys:ro \
  -v /var/lib/docker/:/var/lib/docker:ro \
  gcr.io/cadvisor/cadvisor:latest

После запуска метрики доступны по адресу:

http://localhost:8080/metrics

В конфиге prometheus.yml добавляем:

scrape_configs:
  - job_name: 'cadvisor'
    static_configs:
      - targets: ['localhost:8080']

После этого Prometheus начнёт собирать метрики.

Какие метрики доступны

CPU

  • container_cpu_usage_seconds_total — общее время CPU
  • container_cpu_cfs_throttled_seconds_total — сколько времени контейнер был ограничен

Пример запроса:

rate(container_cpu_usage_seconds_total[1m])

Память

  • container_memory_usage_bytes — текущее использование
  • container_memory_limit_bytes — лимит

Пример:

container_memory_usage_bytes / container_memory_limit_bytes

Сеть

  • container_network_receive_bytes_total
  • container_network_transmit_bytes_total

Пример:

rate(container_network_receive_bytes_total[1m])

Диск

  • container_fs_reads_bytes_total
  • container_fs_writes_bytes_total

Практические кейсы

Поиск контейнеров, которые грузят CPU

topk(5, rate(container_cpu_usage_seconds_total[1m]))

Контейнеры на грани OOM

container_memory_usage_bytes / container_memory_limit_bytes > 0.9

Всплески сетевого трафика

rate(container_network_transmit_bytes_total[1m])

Grafana (визуализация)

Prometheus хранит данные, но для удобной визуализации обычно используют Grafana.

Готовые дашборды:

  • Docker monitoring
  • Kubernetes cluster monitoring

Они позволяют видеть:

  • нагрузку по контейнерам
  • использование ресурсов
  • аномалии и пики

Важные нюансы

  • cAdvisor потребляет ресурсы (но немного)
  • метрики могут быть шумными — важно правильно писать запросы
  • при большом количестве контейнеров нужно тюнить Prometheus (retention, storage)

Alertmanager и алерты

Prometheus умеет не только собирать метрики, но и отправлять алерты при проблемах. Для этого используется Alertmanager.

Он отвечает за:

  • отправку уведомлений (Telegram, Slack, Email)
  • группировку алертов
  • подавление повторяющихся событий

Пример правила алерта

Добавим правило в alerts.yml:

groups:
  - name: containers
    rules:
      - alert: HighCPUUsage
        expr: rate(container_cpu_usage_seconds_total[1m]) > 0.8
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "Высокая нагрузка CPU у контейнера"
          description: "Контейнер использует более 80% CPU более 2 минут"

Подключаем файл в prometheus.yml:

rule_files:
  - "alerts.yml"

Настройка Alertmanager

Пример alertmanager.yml:

route:
  receiver: 'default'
 
receivers:
  - name: 'default'
    webhook_configs:
      - url: 'http://localhost:5001/'

В реальной системе вместо webhook используют:

  • Telegram боты
  • Slack
  • Email

Что важно учитывать

  • добавляйте for, чтобы избежать ложных срабатываний
  • группируйте алерты, чтобы не было спама
  • используйте разные severity (warning, critical)

Примеры полезных алертов

CPU:

rate(container_cpu_usage_seconds_total[1m]) > 0.9

Память:

container_memory_usage_bytes / container_memory_limit_bytes > 0.9

OOM риск:

container_memory_usage_bytes > container_memory_limit_bytes * 0.95

Сеть (аномальный трафик):

rate(container_network_receive_bytes_total[1m]) > 10000000

Альтернатива публичного мониторинга

Если нужно не только собирать метрики в Prometheus, но и предоставлять клиентам или команде публичный статус сервисов, можно использовать наш сервис мониторинга Statuser. Он позволяет:

  • быстро создать публичную страницу статуса для сервисов
  • следить за uptime и метриками без сложной настройки
  • получать уведомления о сбоях через Telegram, Email или вебхуки

Это удобно, если хочется дополнить внутренний мониторинг Prometheus визуальными страницами статуса, особенно для клиентов или команды поддержки.

Итог

Связка cAdvisor + Prometheus — простой и эффективный способ мониторинга контейнеров.

  • cAdvisor собирает метрики
  • Prometheus хранит и анализирует
  • Grafana визуализирует

Это базовый стек для наблюдаемости, который используется как в Docker, так и в Kubernetes, и позволяет быстро находить проблемы с CPU, памятью и сетью в продакшене.

10 минут чтения
Средний рейтинг статьи — 4.9

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний