Saltar a contenido

ADR-0004 · cAdvisor para métricas por contenedor, una instancia por VM

  • Estado: aceptado
  • Decisores: Hugo Quintero
  • Fecha de la decisión: 2026-09-03

Contexto y problema

El stack ya recolecta métricas del host con node_exporter (job cloud-nodes: CPU, memoria, disco de la VM completa), pero no tiene visibilidad por contenedor: no se puede ver cuánto consume medusa_backend frente al storefront, el CMS o Kafka, ni detectar cuál se satura o reinicia. Con el ecommerce cerca de estar en producción, ese desglose es necesario para operar.

Los hosts con contenedores son ecommerce-srv (stack de Medusa) y devops-vm (el propio stack de observabilidad más apps internas: Grafana, Loki, n8n, etc.).

Opciones consideradas

  1. cAdvisor, una instancia por VM con contenedores (elegida): expone métricas por contenedor en formato Prometheus, que ya es el motor de métricas del stack.
  2. Solo node_exporter: insuficiente, no distingue por contenedor.
  3. Recolectar del socket de Docker con otro exporter: menos estándar y con menos métricas que cAdvisor para el mismo acceso al host.

Decisión

cAdvisor corre en cada VM con contenedores (lee solo los del host local):

  • devops-vm: servicio cadvisor en el docker-compose.yml raíz, dentro de la red monitoring. Prometheus lo scrapea por cadvisor:8080; no publica puerto al host.
  • ecommerce-srv: compose propio en cadvisor/, publicado solo en la IP interna (10.158.0.19:9101, no en 0.0.0.0 ni por el túnel). Prometheus lo scrapea por IP, por la red interna (default-allow-internal; la VM no tiene el deny ni ufw de postgres-db-vm, así que no hace falta regla de firewall).
  • redis-srv-vm: mismo compose de cadvisor/ con CADVISOR_BIND_IP=10.158.0.23 (un contenedor Redis, usado por Chatwoot).
  • Un job cadvisor en prometheus.yml con los tres targets, etiquetados por instance. Sin basic auth, igual que cloud-postgres/cloud-pgbouncer.
  • Puerto 9101 (el 8080 lo usa kafka-ui y el 9100 node_exporter).

Consecuencias

Positivas

  • Visibilidad de CPU, memoria, red y disco por contenedor en Grafana.
  • Mismo patrón que el resto del stack (scrape Prometheus, un componente por carpeta), sin herramientas nuevas.

Negativas / deuda asumida

  • Versión mínima v0.55.1: en redis-srv-vm (Debian 13, Docker 29 con almacén de imágenes de containerd, driver overlayfs) las versiones 0.49 a 0.52 arrancan pero no ven ningún contenedor (failed to identify the read-write layer ID). Probado el 2026-09-03.

  • cAdvisor corre privilegiado (necesita acceso amplio al host para leer los contenedores): riesgo mitigado por no exponerlo, fijar la versión y restringir el scrapeo.

  • El despliegue en ecommerce-srv es manual (copiar el compose y levantarlo): el repo aún no versiona el despliegue de exporters en VMs remotas.
  • Queda sin basic auth mientras los exporters de la nube no se alineen (pendiente ya anotado en prometheus.yml).