Stack completo de monitorización

stack completo: Traefik + Telegraf + GeoIP + InfluxDB + Grafana

Stack completo de monitorización

Comenzamos con un stack sencillo: un TIG stack, al que añadimos pequeños cambios para mejorar la observabilidad.

Hemos utilizado Docker y, como orquestador, Docker Compose.
Este es el archivo Compose (/srv/docker/monitoring/docker-compose.yml):

En este stack tenemos:

Telegraf: encargado de monitorizar tanto los contenedores a través del socket de Docker como de recolectar las métricas de todo el servidor.

geoipupdate: contiene las bases de datos de IPs, países y ciudades para ser consultadas de manera rápida y local.

geoip-shipper: contenedor Alpine con Python 3 para ejecutar un script que procesa los datos de Traefik (/srv/docker/traefik/logs/access.log) y los envía al bucket de InfluxDB mediante peticiones HTTP POST.

services:
# 1. ACTUALIZADOR AUTOMÁTICO DE BASES DE DATOS GEOIP (MAXMIND)
  geoipupdate:
    image: ghcr.io/maxmind/geoipupdate:latest
    container_name: geoipupdate
    hostname: geoipupdate
    restart: unless-stopped
    env_file: /srv/docker/.env
    environment:
      - GEOIPUPDATE_ACCOUNT_ID=${GEOIPUPDATE_ACCOUNT_ID}
      - GEOIPUPDATE_LICENSE_KEY=${GEOIPUPDATE_KEY}
      - 'GEOIPUPDATE_EDITION_IDS=GeoLite2-ASN GeoLite2-City GeoLite2-Country'
      - GEOIPUPDATE_FREQUENCY=48
    volumes:
      - /srv/docker/monitoring/maxmind/data:/usr/share/GeoIP
    networks:
      - private_network

# 2. TELEGRAF (MÉTRICAS DE SISTEMA + DOCKER)
  telegraf:
    image: telegraf:latest
    container_name: telegraf
    hostname: telegraf
    restart: unless-stopped
    user: telegraf:989
    env_file: /srv/docker/.env
    group_add:
      - "989"
    security_opt:
      - "no-new-privileges:true"
    environment:
      - TZ=Europe/Madrid
      - HOST_ETC=/hostfs/etc
      - HOST_PROC=/hostfs/proc
      - HOST_SYS=/hostfs/sys
      - HOST_VAR=/hostfs/var
      - HOST_RUN=/hostfs/run
      - HOST_MOUNT_PREFIX=/hostfs
    volumes:
      - /srv/docker/monitoring/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /:/hostfs:ro
      - /etc/localtime:/etc/localtime:ro
    deploy:
      resources:
        limits:
          cpus: "0.40"
          memory: 384M
        reservations:
          memory: 128M
    networks:
      - private_network

  # 3. GEOIP SHIPPER (LOG ENRICHMENT & STREAMING -> traefik bucket)

  geoip-shipper:
    image: python:3.11-alpine
    container_name: geoip-shipper
    restart: unless-stopped
    depends_on:
      - geoipupdate
    command: >
      sh -c "pip install --no-cache-dir geoip2 requests && python -u /app/shipper.py"
    environment:
      - INFLUXDB_URL=${INFLUXDB_URL}
      - INFLUX_TOKEN=${INFLUXDB_TOKEN_TRAEFIK}
      - INFLUX_ORG=${INFLUXDB_ORG}
      - INFLUX_BUCKET=${INFLUXDB_BUCKET_TRAEFIK}
      - LOG_PATH=/var/log/traefik/access.log
      - GEOIP_DB_PATH=/usr/share/GeoIP/GeoLite2-City.mmdb
    volumes:
      - /srv/docker/monitoring/scripts/shipper.py:/app/shipper.py:ro
      - /srv/docker/traefik/logs:/var/log/traefik:ro
      - /srv/docker/monitoring/maxmind/data:/usr/share/GeoIP:ro
    deploy:
      resources:
        limits:
          cpus: "0.30"
          memory: 256M
        reservations:
          memory: 64M
    networks:
      - private_network

networks:
  private_network:
    name: docker_private_network
    external: true

Dando los siguiente resultados:

grafana_main.png

En la parte local on-premises, almacenamos los datos en InfluxDB y, a su vez, los visualizamos con Grafana.

grafana_vps_containers.png

Como PVE tiene un sistema nativo de recolección de métricas, no hacemos uso del servicio de Telegraf. Todas estas métricas las enviamos a nuestro bucket de PVE en el servidor de monitorización: monitoring (10.10.0.251).

grafana_proxmox_resources.png

Es un sistema bastante sencillo de implementar y con una configuración muy accesible que puede ayudar a tener el control de las conexiones entrantes que reciben los dominios.