Prometheus Prometheus

Monitoriza un host y sus contenedores con node_exporter y cAdvisor

Ejecuta juntos Prometheus, node_exporter y cAdvisor, recopila métricas de ambos y confirma que los targets están sanos.

14 min Principiante

Las métricas a nivel de host (CPU, memoria, disco, red) y las métricas por contenedor provienen de dos exporters distintos. Esta guía ejecuta Prometheus junto a ambos con Docker Compose, configura Prometheus para recopilar de los dos y confirma que funciona antes de pasar los datos a un dashboard en la siguiente guía.

Las tres piezas

  • Prometheus en sí: recopila datos de los targets según un calendario y almacena los resultados.
  • node_exporter: expone las métricas del propio sistema operativo del host, CPU, memoria, disco, red, en /metrics en el puerto 9100.
  • cAdvisor (Container Advisor, mantenido por Google): expone el uso de recursos por contenedor, CPU, memoria, E/S, en /metrics en el puerto 8080.

Ambos exporters necesitan visibilidad de cosas que un contenedor normal no puede ver: node_exporter necesita el sistema de archivos raíz y el namespace de procesos del host para informar con precisión sobre el host, no solo sobre su propio contenedor, y cAdvisor necesita acceso a los propios datos del runtime de contenedores para informar sobre cada contenedor que se ejecuta en el host, no solo sobre sí mismo.

Docker Compose para los tres

version: "3"

volumes:
  prometheus-data:

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - prometheus-data:/prometheus
    command:
      - "--config.file=/etc/prometheus/prometheus.yml"
      - "--storage.tsdb.retention.time=15d"

  node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    pid: host
    volumes:
      - /:/host:ro,rslave
    command:
      - "--path.rootfs=/host"

  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    container_name: cadvisor
    ports:
      - "8080:8080"
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro

El pid: host de node-exporter y el montaje de solo lectura de la raíz son lo que le permite informar sobre el host en lugar de sobre la vista aislada de su propio contenedor; --path.rootfs=/host le dice dónde aterrizó realmente esa raíz montada dentro del contenedor. cadvisor necesita su propio conjunto de montajes de solo lectura hacia el estado del runtime del host por la misma razón: sin ellos, solo puede verse a sí mismo, no a los demás contenedores del host. Nada de esto necesita acceso de escritura al host, todos los montajes son de solo lectura, algo que conviene tener presente si una revisión de seguridad pregunta qué pueden hacer realmente estos contenedores.

Configura Prometheus para recopilar de ambos

# prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "node-exporter"
    static_configs:
      - targets: ["node-exporter:9100"]

  - job_name: "cadvisor"
    static_configs:
      - targets: ["cadvisor:8080"]

global.scrape_interval no es el valor predeterminado integrado de Prometheus (que es un minuto); establecerlo explícitamente en 15 segundos, como hacen la mayoría de los ejemplos de primeros pasos, es una convención que conviene seguir, ya que es lo bastante frecuente para dar dashboards reactivos sin generar un volumen de scrape excesivo. Cada job_name es una etiqueta arbitraria que eliges, adjunta a cada serie que ese job recopila, que es como más adelante distinguirías “esta métrica vino de node-exporter” de “esta métrica vino de cadvisor” en una consulta. Los targets se direccionan por su nombre de servicio de Compose (node-exporter, cadvisor) porque los contenedores de la misma red de Compose se resuelven entre sí por nombre de servicio automáticamente; no hacen falta IP de contenedores ni localhost aquí.

Levántalo y confirma que los targets están sanos

docker compose up -d

Abre http://localhost:9090/targets en un navegador. Cada job configurado debería aparecer como UP. Si alguno no lo hace, revisa primero los logs de ese contenedor y confirma que puedes llegar directamente a su endpoint /metrics (curl http://localhost:9100/metrics desde el host, o docker exec dentro del contenedor de Prometheus y haz curl al nombre de servicio de Compose del target) antes de asumir que el problema está en la configuración de Prometheus y no en el propio target.

Desde la página Graph de Prometheus, prueba una comprobación rápida:

up{job="node-exporter"}

up es una métrica sintética que Prometheus genera por sí mismo para cada target, 1 si el último scrape tuvo éxito, 0 si no, lo que la convierte en una forma rápida de comprobar la salud de un target directamente mediante PromQL en lugar de la página de Targets.

Una nota antes de seguir

Ni la interfaz de Prometheus ni la de cAdvisor traen autenticación ni TLS por defecto. Es un valor predeterminado razonable para algo pensado para recopilarse y consultarse desde dentro de una red de confianza, pero significa que estos puertos no deberían exponerse directamente a internet público sin añadir control de acceso, ya sea un reverse proxy con autenticación delante, o simplemente mantenerlos accesibles solo desde una red interna desde el principio.

Con ambos exporters informando a Prometheus, la siguiente guía cubre cómo convertir esto en un dashboard real con Grafana.

Guías populares