¡Esta es una revisión vieja del documento!
Tabla de Contenidos
Monitoreo
Como servicio de monitoreo implementamos Grafana y Prometheus, dos herramientas complementarias que permiten recopilar, almacenar y visualizar métricas del servidor y de los servicios que lo componen. Prometheus actúa como base de datos de series temporales, recolectando información desde distintos endpoints de métricas (exporters). Grafana, por su parte, ofrece un entorno gráfico avanzado para visualizar esos datos mediante paneles personalizados, facilitando la supervisión del rendimiento, disponibilidad y estado general del sistema.
docker-compose.yml
El archivo docker-compose.yml se compone de la siguiente manera:
# Creamos los volumenes para guardar datos persistentes y que no se pierdan al eliminar la máquina. volumes: prometheus-data: {} # Guarda metricas grafana-data: {} # Conectamos los contenedores en la misma red networks: net_backend: external: true # Declaramos los sevicios services: ############################## GRAFANA ############################## grafana: image: grafana/grafana:12.1.1 # Utilizo la version 12.1.1 container_name: grafana # Nombro al contenedor restart: unless-stopped volumes: - ./config/grafana/datasources.yml:/etc/grafana/provisioning/datasources/datasources.yml:ro # Para que linkee automaticamente el prometheus a grafana - grafana-data:/var/lib/grafana ports: - '3000:3000' # Grafana utiliza el puerto 3000 env_file: - path: ./config/grafana.env # Archivo que contiene las variables de entorno depends_on: # Va a levantar cuando levante prometheus - prometheus networks: - net_backend ############################## PROMETHEUS ############################## prometheus: image: prom/prometheus:latest container_name: prometheus # Nombro al contenedor restart: unless-stopped # Si se reinicie, salvo cuando lo detengo volumes: - ./config/prometheus.yaml:/etc/prometheus/prometheus.yml:ro # Pone el archivo prometheus.yaml en esa ruta para que tenga esa configuración - prometheus-data:/prometheus # Asigno espacio al volumen dentro de docker command: - '--config.file=/etc/prometheus/prometheus.yml' # Utilizo esta configuracion - '--storage.tsdb.path=/prometheus' # Persistir los datos en donde prometheus crea su DB - '--storage.tsdb.retention.time=1y' # Guardo la info por 1 año depends_on: # Va a levantar cuando levante node-exporter - node-exporter networks: - net_backend ports: - "9090:9090" ############################## NODE - EXPORTER ############################## node-exporter: # No depende de nadie asi que levanta primero image: prom/node-exporter:latest container_name: node-exporter restart: unless-stopped user: "0" volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - '--path.procfs=/host/proc' - '--path.rootfs=/rootfs' - '--path.sysfs=/host/sys' - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)' networks: - net_backend ############################## CADVISOR ############################## 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 networks: - net_backend
Variables de entorno
Las variables de entorno definidas en el archivo .env son:
GF_SECURITY_ADMIN_USER = <USER> GF_SECURITY_ADMIN_PASSWORD = <PASSWORD> GF_SERVER_DOMAIN = grafana.TUDOMINIO.com.ar
Estas variables permiten establecer las credenciales iniciales de acceso a Grafana.
Datasources
Como vemos, los datasources se vinculan con el archivo datasources.yml, que contiene la configuración de Prometheus:
apiVersion: 1 datasources: - name: Prometheus type: prometheus access: proxy url: http://prometheus:9090 isDefault: true
Este archivo define la conexión principal de Grafana hacia Prometheus, de modo que los paneles puedan visualizar las métricas recolectadas automáticamente.
Endpoints Prometheus
Los endpoints de los cuales Prometheus obtiene métricas se encuentran declarados en el archivo prometheus.yml de la siguiente manera:
global: scrape_interval: 15s scrape_configs: - job_name: "prometheus" scrape_interval: 1m static_configs: - targets: ["localhost:9090"] - job_name: "node" static_configs: - targets: ["node-exporter:9100"] - job_name: "cadvisor" static_configs: - targets: ["cadvisor:8080"] - job_name: "nextcloud" static_configs: - targets: ["nextcloud-exporter:9205"] - job_name: "homeassistant" metrics_path: '/api/prometheus' scheme: 'http' bearer_token: "TOKEN" # Credenciales de un usuario exclusivo para monitoreo static_configs: - targets: ["<IP_PRIVADA>:8123"] - job_name: "postgres" static_configs: - targets: ["postgres_exporter:9187"]
Targets configurados
Los siguientes son los targets monitoreados por Prometheus:
- Prometheus: se scrapea a sí mismo para monitorear su propio estado y rendimiento, asegurando visibilidad completa del sistema de monitoreo.
- Node-exporter: recopila métricas del host donde se ejecutan los contenedores (CPU, memoria, disco, red).
- cAdvisor: monitoriza los contenedores Docker del host, proporcionando información de consumo y estado.
- Nextcloud: a través del nextcloud-exporter, expone métricas específicas como usuarios activos y uso de almacenamiento.
- Home Assistant: se ejecuta en network_mode: host y expone métricas en /api/prometheus, las cuales se recolectan mediante token de acceso.
- Postgres: mediante postgres-exporter, expone métricas de base de datos como conexiones, consultas activas y tamaño de tablas.
