Ai/automazione

AlertManager: Notificaciones Telegram, Email y PagerDuty (2026)

AlertManager: Notificaciones Telegram, Email y PagerDuty (2026)

Cuando una infraestructura de TI crece, la monitorización se vuelve esencial, pero la gestión de las alertas puede convertirse fácilmente en una pesadilla. He visto situaciones en las que se generaban 300 alertas en una sola noche de mantenimiento programado. Todo el equipo las leía, pero ninguna era realmente relevante. ¿El resultado? El equipo empezó a ignorar las notificaciones. La semana siguiente, una alerta crítica real fue ignorada durante cuatro horas, causando un tiempo de inactividad significativo. El problema no era la ausencia de monitorización, sino la total falta de enrutamiento inteligente y silences efectivos.

Prometheus es un estándar de facto para la monitorización de series temporales. AlertManager, su componente complementario, está diseñado para gestionar y distribuir las alertas generadas por Prometheus, asegurando que las notificaciones correctas lleguen a las personas adecuadas, a través del canal justo y en el momento oportuno. Configurar AlertManager de forma estratégica es fundamental para transformar un flujo caótico de notificaciones en un sistema de alerta eficaz que reduce el ruido y focaliza la atención en los problemas reales. Este artículo te guiará en la configuración de AlertManager para enviar notificaciones a Telegram, correo electrónico y PagerDuty, implementando enrutamiento avanzado, inhibiciones y silences para un entorno empresarial con cientos de VM.

Requisitos Previos / Entorno de Prueba

Para seguir esta guía, necesitarás una instalación de Prometheus funcionando que ya esté recopilando métricas. El entorno de prueba ideal incluye un servidor Linux (ej. Ubuntu 24.04 LTS) con Docker o una instalación directa de Prometheus y AlertManager. Asegúrate de tener acceso a una cuenta de Telegram (para crear un bot), un servidor SMTP para el envío de correos electrónicos y una cuenta de PagerDuty (para las notificaciones críticas). Para nuestros ejemplos, usaremos node_exporter para generar métricas del sistema.

Arquitectura AlertManager: receivers, routes, inhibitions, silences

AlertManager no se limita a reenviar las alertas. Su arquitectura está pensada para procesar las alertas de forma inteligente. Los componentes clave son:

  • Receivers: Definen dónde y cómo se enviarán las notificaciones (ej. Telegram, correo electrónico, PagerDuty, Slack, Webhook). Cada receiver tiene un nombre único.
  • Routes: Son las reglas que determinan qué alertas se envían a qué receivers. Puedes definir jerarquías y condiciones basadas en las etiquetas de las alertas (ej. severity, team, instance). Las routes se organizan en una estructura de árbol, con una default_route que captura todas las alertas no gestionadas por otras reglas.
  • Inhibitions: Impiden el envío de notificaciones redundantes o correlacionadas. Por ejemplo, si un servidor está offline, AlertManager puede inhibir todas las alertas relativas a los servicios que se ejecutan en ese servidor, evitando una explosión de notificaciones y focalizando la atención en la alerta principal (el servidor offline).
  • Silences: Permiten desactivar temporalmente el envío de notificaciones para un determinado conjunto de alertas, útiles durante mantenimientos programados o investigaciones sobre un incidente. Pueden crearse a través de la interfaz web de AlertManager o mediante la CLI amtool.

Comprender estos conceptos es crucial para construir un sistema de alerting robusto y no intrusivo. Un sistema bien configurado reduce el “ruido” en un 70%, como he comprobado en un entorno con 2.000 endpoints y más de 300 VM, mejorando la reactividad del equipo en un 50%.

Instalar y configurar AlertManager

La instalación de AlertManager es sencilla. Puedes descargarlo como binario independiente o ejecutarlo a través de Docker. Para un entorno de producción, recomiendo el uso de Docker o la integración en un orquestador como Kubernetes.

Instalación vía Docker (ejemplo):

Creemos un archivo alertmanager.yml para la configuración:

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'instance']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'default-receiver'

receivers:
  - name: 'default-receiver'
    email_configs:
      - to: '[email protected]'
        send_resolved: true

Este es un ejemplo mínimo. Ahora iniciamos AlertManager:

docker run -d \n  -p 9093:9093 \n  -v $(pwd)/alertmanager.yml:/etc/alertmanager/alertmanager.yml \n  --name alertmanager \n  prom/alertmanager

Accede a la interfaz web de AlertManager en http://localhost:9093.

Receiver Telegram: notificaciones en tiempo real en móvil

Telegram es un excelente canal para alertas de advertencia o para notificaciones que requieren atención inmediata pero no son críticas. El primer paso es crear un bot de Telegram y obtener el bot_token y el chat_id.

Crear un bot de Telegram:

  1. Busca @BotFather en Telegram e inicia una conversación.
  2. Usa el comando /newbot y sigue las instrucciones para darle un nombre a tu bot. Se te proporcionará el bot_token.
  3. Inicia una conversación con tu nuevo bot. Luego, para obtener el chat_id, visita https://api.telegram.org/bot/getUpdates en el navegador. Envía un mensaje al bot, luego recarga la página. Encontrarás el chat_id en la respuesta JSON.

Configuración en alertmanager.yml:

receivers:
  - name: 'telegram-warnings'
    telegram_configs:
      - bot_token: '<TU_BOT_TOKEN_TELEGRAM>'
        chat_id: <TU_CHAT_ID_TELEGRAM>
        message: '{{ .CommonAnnotations.summary }} - Severidad: {{ .CommonLabels.severity }}'
        parse_mode: 'HTML'
        send_resolved: true

Sustituye y con los valores obtenidos.

Receiver email con SMTP

Para notificaciones más formales o para alertas que requieren una acción documentada, el correo electrónico es un canal fiable. AlertManager soporta el envío a través de un servidor SMTP.

Configuración en alertmanager.yml:

global:
  smtp_smarthost: 'smtp.example.com:587'
  smtp_from: '[email protected]'
  smtp_auth_username: 'smtpuser'
  smtp_auth_password: 'smtppassword'
  smtp_require_tls: true

receivers:
  - name: 'email-criticals'
    email_configs:
      - to: '[email protected]'
        subject: 'ALERTA CRÍTICA: {{ .CommonLabels.alertname }}'
        send_resolved: true

Asegúrate de que los parámetros smtp_smarthost, smtp_from, smtp_auth_username y smtp_auth_password sean correctos para tu servidor SMTP. Por razones de seguridad, es aconsejable utilizar variables de entorno o un Vault para las credenciales.

Routing rules: enviar alertas críticas a PagerDuty, warnings a Telegram

Aquí reside la verdadera fuerza de AlertManager: definir reglas precisas para el reenvío de alertas. Queremos que las alertas critical vayan a PagerDuty, mientras que las warning a Telegram.

Configuración en alertmanager.yml:

route:
  group_by: ['alertname', 'instance', 'severity']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'default-email'
  routes:
    - match:
        severity: 'critical'
      receiver: 'pagerduty-criticals'
    - match:
        severity: 'warning'
      receiver: 'telegram-warnings'

receivers:
  - name: 'default-email'
    email_configs:
      - to: '[email protected]'

  - name: 'telegram-warnings'
    telegram_configs:
      - bot_token: '<TU_BOT_TOKEN_TELEGRAM>'
        chat_id: <TU_CHAT_ID_TELEGRAM>

  - name: 'pagerduty-criticals'
    pagerduty_configs:
      - service_key: '<TU_SERVICE_KEY_PAGERDUTY>'
        send_resolved: true

En esta configuración, el default-email recibirá todas las alertas que no coincidan con las reglas critical o warning. Las alertas con severity: critical se enviarán a PagerDuty (deberás generar una service_key desde la interfaz de PagerDuty), mientras que las de severity: warning irán a Telegram. Este enfoque garantiza que solo las alertas que requieren una acción inmediata interrumpan el sueño del equipo de guardia.

Inhibiciones: no recibir alertas derivadas durante un incidente

Las inhibiciones son cruciales para evitar la fatiga por alertas. Imagina que un servidor aloja 10 servicios diferentes. Si el servidor se desconecta, recibirías 10 alertas por los servicios y 1 por el servidor. Con las inhibiciones, puedes configurar AlertManager para enviar solo la alerta del servidor offline y suprimir las demás.

Configuración en alertmanager.yml (sección inhibit_rules):

inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    # Las alertas con severity 'critical' inhiben las de 'warning'
    # si comparten las etiquetas 'instance' y 'job'
    equal: ['instance', 'job']

  - source_match:
      alertname: 'HostDown'
    target_match:
      alertname: 'ServiceDown'
    equal: ['instance']

La primera regla inhibe las alertas de warning si ya existe una critical con la misma instance y job. La segunda inhibe las alertas de ServiceDown si HostDown ya está activo para la misma instance. Esto reduce el ruido y ayuda al equipo a concentrarse en la causa principal.

Silences: pausar alertas durante el mantenimiento

Durante las ventanas de mantenimiento programado (ej. actualizaciones de software, reinicios de servidores), es normal que se generen alertas. Los silences permiten suprimir estas notificaciones temporalmente.

Puedes crear un silence a través de la interfaz web de AlertManager o mediante la CLI amtool:

amtool silence add alertname=DiskWarning instance=my-server-01 --duration=2h --comment="Mantenimiento programado de disco" --expire-on-resolve

Este comando crea un silence para la alerta DiskWarning en la instancia my-server-01 durante dos horas. El flag --expire-on-resolve asegura que el silence se elimine tan pronto como la alerta se resuelva o expire.

Alert rule ejemplos prácticos: disco, CPU, memoria, servicios

Las alert rules se definen en el archivo de configuración de Prometheus (ej. prometheus.yml o en archivos separados incluidos mediante rule_files). Aquí tienes algunos ejemplos comunes:

Alerta por espacio de disco casi lleno:

# rules.yml

groups:
  - name: 'host-alerts'
    rules:
      - alert: DiskWarning
        expr: (node_filesystem_avail_bytes{fstype!=""} / node_filesystem_size_bytes{fstype!=""}) * 100 < 15
        for: 5m
        labels:
          severity: 'warning'
        annotations:
          summary: 'Disco casi lleno en {{ $labels.instance }} ({{ $value | printf "%.2f" }}%)'
          description: 'El espacio disponible en el disco {{ $labels.device }} de {{ $labels.instance }} es inferior al 15%.'

      - alert: DiskCritical
        expr: (node_filesystem_avail_bytes{fstype!=""} / node_filesystem_size_bytes{fstype!=""}) * 100 < 5
        for: 2m
        labels:
          severity: 'critical'
        annotations:
          summary: 'CRÍTICO: Disco lleno en {{ $labels.instance }} ({{ $value | printf "%.2f" }}%)'
          description: 'El espacio disponible en el disco {{ $labels.device }} de {{ $labels.instance }} es inferior al 5%. ¡Actuar inmediatamente!'

Alerta por uso de CPU elevado:

      - alert: HighCPUUsage
        expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
        for: 5m
        labels:
          severity: 'critical'
        annotations:
          summary: 'Uso de CPU elevado en {{ $labels.instance }} ({{ $value | printf "%.2f" }}%)'
          description: 'La CPU en {{ $labels.instance }} se ha utilizado más del 90% en los últimos 5 minutos.'

Alerta por memoria RAM insuficiente:

      - alert: InsufficientMemory
        expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 < 10
        for: 5m
        labels:
          severity: 'warning'
        annotations:
          summary: 'Memoria insuficiente en {{ $labels.instance }} ({{ $value | printf "%.2f" }}%)'
          description: 'La memoria disponible en {{ $labels.instance }} es inferior al 10%.'

Estos ejemplos son un buen punto de partida. Recuerda adaptarlos a tus umbrales y necesidades específicas. Para una referencia completa, consulta la documentación oficial de Prometheus Alerting.

Errores Comunes y Resolución de Problemas

  • Error de configuración YAML: A menudo, el problema es una formatación YAML incorrecta. Usa un linter YAML para validar tu archivo alertmanager.yml.
  • Credenciales erróneas: bot_token de Telegram, service_key de PagerDuty o credenciales SMTP no válidas. Revisa los logs de AlertManager (docker logs alertmanager).
  • Falta de etiquetas: Las reglas de enrutamiento e inhibición se basan en etiquetas. Si una alerta no tiene las etiquetas previstas (ej. severity), no se enrutará correctamente. Verifica las etiquetas de las alertas en Prometheus.
  • Firewall: Asegúrate de que AlertManager pueda alcanzar los endpoints externos (Telegram API, servidor SMTP, PagerDuty API). Revisa las reglas del firewall.
  • amtool check-config: Usa este comando para validar la sintaxis de tu archivo de configuración antes de recargarlo o reiniciar AlertManager.

Conclusiones con Puntos Clave Operativos

La configuración de AlertManager es un paso crítico para cualquier infraestructura que confíe en Prometheus. Implementando un enrutamiento inteligente, inhibiciones y silences, puedes transformar un sistema de alerting ruidoso e ineficaz en una herramienta potente que avisa a tu equipo solo de los problemas que importan. Recuerda siempre probar tus configuraciones y revisar periódicamente tus alert rules para asegurarte de que sigan siendo relevantes. Un sistema de alerting bien engrasado es la primera línea de defensa contra los tiempos de inactividad y garantiza que tu equipo pueda reaccionar de forma proactiva, no reactiva.

Actualizado: julio 2026

Lee también: Lynis Audit Linux: Guía Práctica de Hardening 2026

Comparte este artículo:

Escrito por

Rosario Giordano

Rosario Giordano es administrador de sistemas y consultor de TI especializado en c iberseguridad y cloud, con más de 20 años de experiencia en la gestión de infraestructuras Linux empresariales. Sus áreas de especialización incluyen el hardening de SSH, plataformas Kubernetes , bases de datos PostgreSQL, virtualización con VMware/Proxmox y el cumplimiento de los marcos de seguridad NIS2 e ISO 27001.