Problemas con alertas¶
Esta página explica cómo diagnosticar y resolver los problemas más habituales relacionados con las alertas de Prometheus, Alertmanager y Grafana.
Una alerta no depende de un único componente. El flujo completo puede ser:
Métrica del sistema
|
v
Node Exporter
|
v
Prometheus
|
v
Regla de alerta
|
v
Alertmanager
|
v
Receptor de notificaciones
|
v
Correo, webhook, chat o sistema externo
Grafana también puede evaluar reglas de alerta mediante su propio sistema de alertas:
Fuente de datos
|
v
Regla de alerta de Grafana
|
v
Condición
|
v
Estado de alerta
|
v
Política de notificación
|
v
Contacto
Por este motivo, una alerta puede fallar en diferentes puntos:
- La métrica no existe.
- El target está
DOWN. - La consulta devuelve resultados incorrectos.
- La expresión no tiene datos.
- La regla no se carga.
- La regla no se evalúa.
- El umbral es incorrecto.
- La alerta permanece en
pending. - Alertmanager no recibe la alerta.
- La ruta de Alertmanager no coincide.
- El receptor está mal configurado.
- La notificación es rechazada.
- Grafana no puede consultar la fuente de datos.
- El usuario no tiene permisos para ver o modificar alertas.
Advertencia: realiza las prácticas en un entorno de laboratorio. Utiliza destinatarios de prueba y no incluyas contraseñas, tokens, claves API ni direcciones privadas en repositorios o informes públicos.
Objetivos¶
Al finalizar esta sesión, el alumno podrá:
- Explicar el flujo de una alerta.
- Diferenciar una métrica de una regla de alerta.
- Diferenciar una alerta de Prometheus de una alerta de Grafana.
- Crear una regla de alerta sencilla.
- Validar reglas con
promtool. - Comprobar el estado de las reglas.
- Comprobar el estado de las alertas.
- Interpretar los estados
inactive,pendingyfiring. - Diagnosticar alertas que no se activan.
- Diagnosticar alertas que se activan constantemente.
- Comprobar la comunicación entre Prometheus y Alertmanager.
- Revisar rutas y receptores de Alertmanager.
- Diagnosticar problemas de notificaciones.
- Utilizar etiquetas y anotaciones correctamente.
- Probar expresiones PromQL antes de crear alertas.
- Documentar una incidencia relacionada con alertas.
Introducción¶
Una alerta representa una condición que requiere atención.
Ejemplos:
- Un servidor no responde.
- El uso de CPU supera un umbral.
- El espacio libre es demasiado bajo.
- Prometheus no puede recopilar métricas.
- Una instancia tiene poca memoria disponible.
- Un servicio permanece detenido durante varios minutos.
Una alerta normalmente contiene:
- Nombre.
- Expresión.
- Duración mínima.
- Etiquetas.
- Anotaciones.
- Estado.
- Información de la serie que la activó.
Ejemplo conceptual:
alert: NodeExporterDown
expr: up{job="node_exporter"} == 0
for: 5m
labels:
severity: critical
annotations:
summary: Node Exporter no está disponible
La expresión determina cuándo se cumple la condición. Las etiquetas clasifican la alerta. Las anotaciones proporcionan información para la persona que recibe la notificación.
Componentes del sistema de alertas¶
Métrica¶
La métrica proporciona los datos utilizados por la expresión.
Ejemplo:
Expresión PromQL¶
La expresión determina si la condición se cumple.
Ejemplo:
Regla de alerta¶
La regla combina una expresión con metadatos:
Prometheus¶
Prometheus:
- Evalúa las reglas.
- Consulta las métricas.
- Cambia el estado de las alertas.
- Envía las alertas a Alertmanager.
Alertmanager¶
Alertmanager:
- Recibe alertas de Prometheus.
- Agrupa alertas.
- Silencia alertas.
- Inhibe alertas relacionadas.
- Selecciona receptores.
- Envía notificaciones.
Grafana Alerting¶
Grafana puede gestionar sus propias reglas de alerta.
Grafana puede:
- Consultar fuentes de datos.
- Evaluar expresiones.
- Crear reglas.
- Gestionar contactos.
- Aplicar políticas de notificación.
- Mostrar el estado de las alertas.
Receptor¶
Un receptor es el destino de una notificación.
Ejemplos:
- Correo electrónico.
- Webhook.
- Microsoft Teams.
- Slack.
- PagerDuty.
- OnCall.
- Sistema de tickets.
Estados de una alerta¶
inactive¶
La condición de la alerta no se cumple.
Ejemplo:
En este caso, la alerta de caída permanece inactiva.
pending¶
La condición se cumple, pero todavía no ha transcurrido el período definido en for.
Ejemplo:
Si la expresión se cumple durante dos minutos, la alerta estará en pending.
firing¶
La condición se ha cumplido durante el período requerido y la alerta está activa.
Ejemplo:
Transición de estados¶
inactive
|
| La expresión se cumple
v
pending
|
| Transcurre el valor de "for"
v
firing
|
| La expresión deja de cumplirse
v
inactive
Si la expresión deja de cumplirse durante el período pending, la alerta vuelve a inactive.
Alertas de Prometheus y alertas de Grafana¶
Alertas de Prometheus¶
Las reglas se almacenan normalmente en ficheros YAML:
Prometheus evalúa las expresiones.
Ejemplo:
groups:
- name: sistema
rules:
- alert: NodeExporterDown
expr: up{job="node_exporter"} == 0
for: 5m
labels:
severity: critical
annotations:
summary: Node Exporter no responde
Alertas de Grafana¶
Las reglas se gestionan desde la interfaz de Grafana o mediante su API y provisioning.
Grafana puede utilizar:
- Prometheus.
- Loki.
- InfluxDB.
- SQL.
- Otras fuentes compatibles.
Diferencias principales¶
| Característica | Prometheus | Grafana |
|---|---|---|
| Lugar habitual de configuración | Ficheros YAML | Interfaz, API o provisioning |
| Motor de evaluación | Prometheus | Grafana |
| Gestión de notificaciones | Habitualmente Alertmanager | Contactos y políticas de Grafana |
| Fuente principal del laboratorio | Prometheus | Varias fuentes posibles |
| Validación habitual | promtool |
Interfaz o API de Grafana |
| Visualización | Interfaz de Prometheus | Alerting de Grafana |
Ambos sistemas pueden utilizar PromQL, pero el proceso de evaluación y notificación no es idéntico.
Crear una regla de alerta en Prometheus¶
Estructura básica¶
groups:
- name: sistema
rules:
- alert: NodeExporterDown
expr: up{job="node_exporter"} == 0
for: 5m
labels:
severity: critical
annotations:
summary: Node Exporter no responde
description: El target {{ $labels.instance }} no está disponible.
Elementos de la regla¶
groups¶
Agrupa reglas relacionadas:
name¶
Identifica el grupo:
alert¶
Es el nombre de la alerta:
Utiliza nombres:
- Descriptivos.
- Estables.
- Sin espacios.
- Fáciles de buscar.
expr¶
Es la expresión PromQL:
for¶
Indica cuánto tiempo debe cumplirse la expresión:
labels¶
Clasifica la alerta:
annotations¶
Proporciona información adicional:
annotations:
summary: Node Exporter no responde
description: El target {{ $labels.instance }} no está disponible.
Crear un fichero de reglas¶
Crear el directorio¶
Crear el fichero¶
Contenido:
groups:
- name: sistema
rules:
- alert: NodeExporterDown
expr: up{job="node_exporter"} == 0
for: 5m
labels:
severity: critical
servicio: node_exporter
annotations:
summary: Node Exporter no responde
description: El target {{ $labels.instance }} no está disponible.
Comprobar los permisos¶
Comprobar que Prometheus puede leerlo¶
sudo -u prometheus test -r \
/etc/prometheus/rules/sistema.yml \
&& echo "El fichero es legible" \
|| echo "El fichero no es legible"
Configurar rule_files¶
En prometheus.yml, añade la ruta de las reglas:
Ejemplo completo:
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
- /etc/prometheus/rules/*.yml
scrape_configs:
- job_name: prometheus
static_configs:
- targets:
- localhost:9090
- job_name: node_exporter
static_configs:
- targets:
- localhost:9100
Validar la configuración principal¶
Validar las reglas¶
Reiniciar Prometheus¶
Consultar el estado¶
Comprobar las reglas cargadas¶
Interfaz web¶
Abre:
La página muestra:
- Nombre del grupo.
- Nombre de la regla.
- Expresión.
- Estado.
- Duración.
- Última evaluación.
- Alertas activas.
API de reglas¶
Mostrar las reglas de alerta¶
curl -s http://localhost:9090/api/v1/rules \
| jq '.data.groups[].rules[] | select(.type=="alerting")'
Consultar el estado de una regla¶
curl -s http://localhost:9090/api/v1/rules \
| jq '.data.groups[].rules[] | {
name: .name,
state: .state,
health: .health,
lastEvaluation: .lastEvaluation,
evaluationTime: .evaluationTime
}'
Comprobar las alertas activas¶
Interfaz web¶
Abre:
API de alertas¶
Mostrar información resumida¶
curl -s http://localhost:9090/api/v1/alerts \
| jq '.data.alerts[] | {
labels: .labels,
annotations: .annotations,
state: .state,
value: .value,
activeAt: .activeAt
}'
Consulta PromQL de alertas activas¶
Prometheus expone información de alertas mediante la métrica:
Consultar alertas activas:
Consultar alertas pendientes:
Consultar una alerta concreta:
Problemas al cargar reglas¶
La regla no aparece¶
Comprueba:
Consulta la configuración efectiva:
Comprueba que rule_files esté incluido en el fichero correcto.
La regla aparece como bad¶
Consulta:
Consulta los registros:
Posibles causas:
- Expresión PromQL incorrecta.
- Fichero no legible.
- Error de YAML.
- Ruta incorrecta.
- Métrica inexistente.
- Función no compatible con la versión instalada.
La regla aparece, pero no se evalúa¶
Comprueba:
evaluation_interval.- Estado de Prometheus.
- Registros.
- Salud del grupo.
- Carga del servidor.
- Errores de la expresión.
curl -s http://localhost:9090/api/v1/rules \
| jq '.data.groups[] | {
name: .name,
evaluationTime: .evaluationTime,
lastEvaluation: .lastEvaluation,
health: .health
}'
Error de permisos¶
Comprueba:
sudo -u prometheus test -r \
/etc/prometheus/rules/sistema.yml \
&& echo "Puede leer las reglas" \
|| echo "No puede leer las reglas"
Comprueba todos los directorios de la ruta:
Problemas con la expresión PromQL¶
La expresión no devuelve resultados¶
Prueba primero la consulta sin comparación:
Después:
Si el target está activo, la primera consulta devolverá 1 y la segunda no devolverá series.
Esto es normal: la alerta no debe activarse mientras el target esté disponible.
La métrica no existe¶
Consulta las métricas disponibles:
Prueba en Prometheus:
La etiqueta no coincide¶
Consulta las series:
Comprueba los valores de job:
La expresión devuelve demasiadas series¶
Ejemplo:
Puede crear una alerta por cada combinación de etiquetas.
Filtra o agrupa según el objetivo:
Expresiones con divisiones¶
Para porcentaje de memoria usada:
Para evitar diferencias de etiquetas:
100 * (
1 -
node_memory_MemAvailable_bytes{
job="node_exporter"
}
/
node_memory_MemTotal_bytes{
job="node_exporter"
}
)
> 90
Expresiones con rate¶
Uso de CPU:
Problemas con el período for¶
La alerta permanece en pending¶
Ejemplo:
La alerta permanecerá en pending hasta que la expresión se cumpla durante diez minutos completos.
Comprueba:
- Hora del sistema.
- Intervalo de evaluación.
- Duración configurada.
- Continuidad de la condición.
- Reinicios de Prometheus.
La condición se interrumpe¶
Si la expresión deja de cumplirse brevemente:
o:
El contador de for comienza de nuevo.
Diagnosticar el tiempo pendiente¶
Consulta:
curl -s http://localhost:9090/api/v1/alerts \
| jq '.data.alerts[] | {
labels: .labels,
state: .state,
activeAt: .activeAt
}'
Práctica recomendada¶
En el laboratorio utiliza períodos cortos:
En producción, el valor debe adaptarse al problema. Un período demasiado corto puede generar alertas inestables.
Problemas de alertas repetitivas¶
La alerta se activa constantemente¶
Posibles causas:
- El umbral es demasiado bajo.
- La métrica tiene fluctuaciones normales.
- Falta un período
for. - La expresión está invertida.
- Los datos no son fiables.
- El target está intermitente.
Ejemplo inestable¶
Puede activarse y desactivarse continuamente en un sistema con carga variable.
Añadir un período¶
Usar una condición más adecuada¶
El umbral debe tener sentido para el número de CPU y el comportamiento del sistema.
Alertas duplicadas¶
Pueden producirse cuando:
- Existen dos reglas iguales.
- Prometheus y Grafana alertan sobre la misma condición.
- Hay dos instancias de Prometheus.
- Alertmanager recibe la misma alerta con etiquetas diferentes.
- El dashboard contiene reglas duplicadas.
Consulta las reglas:
Etiquetas de las alertas¶
Etiquetas de clasificación¶
Ejemplo:
Las etiquetas pueden utilizarse para:
- Agrupar alertas.
- Enrutar notificaciones.
- Filtrar alertas.
- Crear silencias.
- Identificar equipos.
- Diferenciar entornos.
Etiqueta severity¶
Valores habituales:
Utiliza una convención coherente en todo el entorno.
Etiqueta environment¶
Etiqueta team¶
Etiquetas heredadas¶
Una alerta puede conservar etiquetas de la serie original.
Ejemplo:
La alerta puede conservar:
Anotaciones de las alertas¶
summary¶
Resume el problema:
description¶
Proporciona detalles:
runbook_url¶
Enlaza un procedimiento operativo:
Variables disponibles¶
En las anotaciones pueden utilizarse datos de las etiquetas:
annotations:
summary: CPU elevada en {{ $labels.instance }}
description: El uso de CPU supera el umbral configurado.
Anotaciones informativas¶
Incluye:
- Recurso afectado.
- Valor observado.
- Umbral.
- Duración.
- Acción recomendada.
- Enlace al procedimiento.
- Enlace al dashboard.
Ejemplo:
annotations:
summary: Poco espacio en {{ $labels.instance }}
description: El punto de montaje {{ $labels.mountpoint }} tiene menos del 10% libre.
runbook_url: https://documentacion.ejemplo.local/runbooks/disk-space
Ejemplos de reglas de alerta¶
Node Exporter caído¶
groups:
- name: disponibilidad
rules:
- alert: NodeExporterDown
expr: up{job="node_exporter"} == 0
for: 5m
labels:
severity: critical
servicio: node_exporter
annotations:
summary: Node Exporter no responde
description: El target {{ $labels.instance }} no está disponible.
Prometheus caído¶
Si Prometheus evalúa sus propias reglas, no puede alertar sobre sí mismo cuando está completamente detenido. Esta alerta sirve para detectar problemas relacionados con su target:
groups:
- name: disponibilidad
rules:
- alert: PrometheusTargetDown
expr: up{job="prometheus"} == 0
for: 5m
labels:
severity: critical
annotations:
summary: El target de Prometheus está caído
description: El target {{ $labels.instance }} no responde.
CPU elevada¶
groups:
- name: sistema
rules:
- alert: HighCPUUsage
expr: |
100 * (
1 -
avg by (instance) (
rate(
node_cpu_seconds_total{
mode="idle"
}[5m]
)
)
) > 80
for: 5m
labels:
severity: warning
annotations:
summary: CPU elevada en {{ $labels.instance }}
description: El uso de CPU supera el 80% durante cinco minutos.
Memoria elevada¶
groups:
- name: sistema
rules:
- alert: HighMemoryUsage
expr: |
100 * (
1 -
node_memory_MemAvailable_bytes
/
node_memory_MemTotal_bytes
) > 90
for: 5m
labels:
severity: critical
annotations:
summary: Memoria elevada en {{ $labels.instance }}
description: El uso de memoria supera el 90%.
Poco espacio libre¶
groups:
- name: almacenamiento
rules:
- alert: LowFilesystemSpace
expr: |
100 * (
node_filesystem_avail_bytes{
fstype!~"tmpfs|overlay|squashfs"
}
/
node_filesystem_size_bytes{
fstype!~"tmpfs|overlay|squashfs"
}
) < 10
for: 10m
labels:
severity: warning
annotations:
summary: Poco espacio libre en {{ $labels.instance }}
description: El punto {{ $labels.mountpoint }} tiene menos del 10% libre.
Sistema de archivos casi lleno¶
groups:
- name: almacenamiento
rules:
- alert: FilesystemAlmostFull
expr: |
100 * (
1 -
node_filesystem_avail_bytes{
fstype!~"tmpfs|overlay|squashfs"
}
/
node_filesystem_size_bytes{
fstype!~"tmpfs|overlay|squashfs"
}
) > 90
for: 10m
labels:
severity: warning
annotations:
summary: Sistema de archivos casi lleno
description: {{ $labels.instance }} tiene {{ $labels.mountpoint }} por encima del 90%.
Carga elevada¶
groups:
- name: sistema
rules:
- alert: HighSystemLoad
expr: node_load1 > 4
for: 10m
labels:
severity: warning
annotations:
summary: Carga elevada en {{ $labels.instance }}
description: La carga de un minuto supera el umbral configurado.
El valor adecuado depende del número de CPUs. En sistemas con diferentes tamaños, conviene normalizar la carga por el número de procesadores.
Validar reglas con promtool¶
Validar todas las reglas¶
Validar un fichero concreto¶
Validar la configuración completa¶
Errores habituales¶
Indica un problema de YAML.
Indica que falta la expresión.
Indica que la expresión PromQL no se puede interpretar.
Configurar Alertmanager¶
Consultar el servicio¶
Comprobar el puerto habitual¶
Probar la API¶
Comprobar la salud¶
Consultar los registros¶
Configuración de Prometheus¶
En prometheus.yml:
Validar la configuración¶
Reiniciar Prometheus¶
Comprobar el estado desde Prometheus¶
En la interfaz:
También mediante API:
Problemas de comunicación con Alertmanager¶
Prometheus no muestra Alertmanagers¶
Comprueba:
Comprueba la configuración:
Alertmanager está detenido¶
Puerto incorrecto¶
El puerto habitual es:
Comprueba:
Firewall¶
Si Prometheus y Alertmanager están en equipos diferentes:
Consultar errores de Prometheus¶
sudo journalctl -u prometheus \
--since "15 minutes ago" \
--no-pager \
| grep -i -E \
"alertmanager|notification|error|timeout|refused"
Configurar rutas en Alertmanager¶
Estructura básica¶
Enrutar por severidad¶
global:
resolve_timeout: 5m
route:
receiver: general
routes:
- matchers:
- severity="critical"
receiver: criticas
receivers:
- name: general
- name: criticas
Agrupar alertas¶
route:
receiver: general
group_by:
- alertname
- instance
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
Significado de los parámetros¶
group_by¶
Indica las etiquetas utilizadas para agrupar alertas.
group_wait¶
Tiempo de espera inicial antes de enviar el primer grupo.
group_interval¶
Tiempo mínimo entre grupos nuevos.
repeat_interval¶
Intervalo para repetir una alerta que continúa activa.
Validar Alertmanager¶
Según la versión instalada, puede utilizarse:
También puedes consultar la ayuda:
Problemas de rutas de Alertmanager¶
La alerta llega, pero no se notifica¶
Comprueba:
- Receptor utilizado.
- Coincidencia de labels.
- Orden de las rutas.
continue.- Reglas de silencio.
- Inhibiciones.
- Estado del receptor.
- Errores del canal externo.
La ruta no coincide¶
Ejemplo de alerta:
Matcher correcto:
Si la alerta utiliza:
no coincidirá con:
Consultar alertas en Alertmanager¶
Mostrar labels de las alertas¶
Consultar silencios¶
Problemas con receptores¶
Receptor de webhook¶
Ejemplo conceptual:
receivers:
- name: webhook-laboratorio
webhook_configs:
- url: http://servidor-receptor:8080/alertas
Comprueba:
Problemas habituales del webhook¶
- URL incorrecta.
- Puerto cerrado.
- Servicio receptor detenido.
- Certificado no válido.
- Error de autenticación.
- Respuesta HTTP no válida.
- Timeout.
- Ruta incorrecta.
Consultar registros de Alertmanager¶
Busca:
Receptores de correo¶
Comprueba:
- Servidor SMTP.
- Puerto.
- TLS.
- Usuario.
- Contraseña.
- Remitente.
- Destinatario.
- Resolución DNS.
- Firewall.
No incluyas credenciales SMTP reales en una configuración compartida.
Silencios e inhibiciones¶
Silencio¶
Un silencio evita temporalmente una notificación.
La alerta puede continuar activa, pero no se enviará la notificación mientras coincida con el silencio.
Consultar silencios¶
Problema: la alerta está activa, pero no llega¶
Comprueba:
- Silencios activos.
- Coincidencia de labels.
- Fecha de inicio.
- Fecha de expiración.
- Usuario que creó el silencio.
Inhibición¶
Una inhibición evita notificaciones secundarias cuando existe una alerta principal.
Ejemplo conceptual:
inhibit_rules:
- source_matchers:
- alertname="InstanceDown"
target_matchers:
- severity="warning"
equal:
- instance
Una alerta crítica sobre una instancia puede inhibir alertas de menor importancia de esa misma instancia.
Problemas con etiquetas y anotaciones¶
La alerta no tiene instance¶
Comprueba si la expresión conserva esa etiqueta.
Consulta:
Una agregación como esta puede eliminar etiquetas:
Si necesitas conservar instance:
La anotación muestra una variable vacía¶
Ejemplo:
Si la expresión no devuelve instance, la anotación no podrá mostrarlo.
Comprueba las etiquetas que devuelve la expresión en Prometheus.
Mostrar el valor observado¶
En alertas de Prometheus puede utilizarse:
Utiliza el formato que corresponda a la versión y al contexto de evaluación.
Anotaciones demasiado genéricas¶
Evita:
Utiliza:
Alertas de Grafana¶
Crear una regla¶
En Grafana:
- Accede a Alerting.
- Selecciona Alert rules.
- Pulsa New alert rule.
- Selecciona la fuente de datos.
- Define la consulta.
- Añade una condición.
- Define el período de evaluación.
- Añade etiquetas.
- Añade anotaciones.
- Selecciona una política de notificación.
- Guarda la regla.
Consulta de ejemplo¶
Condición¶
Ejemplo:
Estado de la regla¶
Grafana puede mostrar estados como:
La nomenclatura concreta puede variar según la versión y la configuración de la regla.
Estado NoData¶
Indica que la consulta no devolvió datos.
Puede configurarse para:
- Tratarlo como normal.
- Tratarlo como alerta.
- Mantener el estado anterior.
- Generar una alerta específica.
Estado Error¶
Indica que la consulta o la evaluación produjo un error.
Comprueba:
- Fuente de datos.
- Consulta.
- Permisos.
- Red.
- Logs.
- Query Inspector.
- Configuración de la regla.
Contactos y políticas de notificación en Grafana¶
Contact point¶
Un contact point define dónde se envía la notificación.
Ejemplos:
- Correo.
- Webhook.
- Slack.
- Microsoft Teams.
- PagerDuty.
Notification policy¶
Una política determina qué contact point recibe una alerta.
La política puede utilizar labels:
Problema: regla en firing, pero sin notificación¶
Comprueba:
- Contact point.
- Notification policy.
- Labels de la alerta.
- Silencios.
- Horarios de mute.
- Estado del canal.
- Logs de Grafana.
Sesión práctica 1: crear una alerta de Node Exporter caído¶
Objetivo¶
Crear, validar y probar una alerta de disponibilidad.
Crear el fichero de reglas¶
Contenido:
groups:
- name: disponibilidad
rules:
- alert: NodeExporterDown
expr: up{job="node_exporter"} == 0
for: 1m
labels:
severity: critical
servicio: node_exporter
entorno: laboratorio
annotations:
summary: Node Exporter no responde
description: El target {{ $labels.instance }} no está disponible.
Validar las reglas¶
Validar la configuración completa¶
Reiniciar Prometheus¶
Comprobar la regla¶
Detener Node Exporter¶
Consultar el estado¶
Consultar la alerta¶
Observar la transición¶
Durante el primer minuto:
Después:
Recuperar Node Exporter¶
Comprobar la recuperación¶
Preguntas de análisis¶
- ¿Cuánto tardó la alerta en pasar a
pending? - ¿Cuánto tardó en pasar a
firing? - ¿Qué etiqueta identificó el target?
- ¿Qué ocurrió al iniciar de nuevo Node Exporter?
- ¿Qué valor tenía
upen cada estado?
Sesión práctica 2: probar una alerta de CPU¶
Objetivo¶
Crear una alerta temporal de CPU elevada.
Crear la regla¶
groups:
- name: rendimiento
rules:
- alert: HighCPUUsage
expr: |
100 * (
1 -
avg by (instance) (
rate(
node_cpu_seconds_total{
mode="idle"
}[5m]
)
)
) > 20
for: 1m
labels:
severity: warning
annotations:
summary: CPU elevada en {{ $labels.instance }}
description: El uso de CPU supera el 20% durante un minuto.
El umbral del 20% se utiliza únicamente para facilitar la práctica.
Validar¶
Generar carga¶
En un entorno de laboratorio:
Para detenerlo:
En otra terminal, puedes consultar:
Consultar el estado¶
Recuperar el sistema¶
Detén el proceso de carga:
Espera a que la expresión deje de cumplirse.
Preguntas de análisis¶
- ¿El valor superó el umbral?
- ¿La alerta pasó a
pending? - ¿Cuánto tardó en activarse?
- ¿Qué ocurrió al detener la carga?
- ¿El período
forevitó una activación instantánea?
Sesión práctica 3: probar una alerta de memoria¶
Objetivo¶
Crear una alerta de memoria con un umbral controlado.
Regla de laboratorio¶
groups:
- name: memoria
rules:
- alert: HighMemoryUsage
expr: |
100 * (
1 -
node_memory_MemAvailable_bytes
/
node_memory_MemTotal_bytes
) > 20
for: 1m
labels:
severity: warning
annotations:
summary: Memoria elevada en {{ $labels.instance }}
description: El uso de memoria supera el 20%.
Validar la expresión directamente¶
Validar la regla¶
Observar la alerta¶
Ajustar el umbral¶
En un sistema de laboratorio, el valor real puede no superar el umbral. Prueba temporalmente un umbral adecuado al entorno, documentándolo claramente.
Sesión práctica 4: comprobar el flujo con Alertmanager¶
Objetivo¶
Verificar que Prometheus envía alertas a Alertmanager.
Comprobar Alertmanager¶
Consultar la configuración de Prometheus¶
Consultar los Alertmanagers conectados¶
Consultar las alertas recibidas¶
Generar una alerta¶
Detén Node Exporter:
Consultar Prometheus¶
Consultar Alertmanager¶
Recuperar el servicio¶
Preguntas de análisis¶
- ¿Prometheus detectó la alerta?
- ¿Alertmanager la recibió?
- ¿Qué labels llegaron a Alertmanager?
- ¿Qué estado tenía la alerta?
- ¿Se produjo una notificación?
Sesión práctica 5: diagnosticar una alerta que permanece pending¶
Objetivo¶
Comprender el funcionamiento de for.
Crear una regla¶
groups:
- name: practica
rules:
- alert: PracticaPending
expr: up{job="node_exporter"} == 0
for: 5m
labels:
severity: warning
annotations:
summary: Alerta de práctica
description: Esta alerta debe permanecer en pending durante cinco minutos.
Detener Node Exporter¶
Consultar la alerta¶
Iniciar Node Exporter antes de cinco minutos¶
Observar el resultado¶
La alerta debería volver a inactive sin llegar a firing.
Repetir con tiempo suficiente¶
Detén Node Exporter y espera más de cinco minutos:
Consultar¶
Recuperar¶
Sesión práctica 6: diagnosticar una regla que nunca se activa¶
Objetivo¶
Encontrar un filtro incorrecto en una expresión.
Regla incorrecta¶
El nombre real puede ser:
Consultar los valores reales¶
Probar la expresión amplia¶
Probar el filtro incorrecto¶
Probar el filtro correcto¶
Corregir la regla¶
Validar y reiniciar¶
Sesión práctica 7: diagnosticar una alerta con notificaciones duplicadas¶
Objetivo¶
Identificar por qué se reciben varias notificaciones para el mismo problema.
Comprobar reglas duplicadas¶
Comprobar alertas en Prometheus¶
Comprobar alertas en Alertmanager¶
Revisar la agrupación¶
Consulta la configuración de Alertmanager:
Posibles causas¶
- Dos reglas con el mismo objetivo.
group_byinsuficiente.repeat_intervaldemasiado corto.- Dos instancias de Prometheus.
- Alertas de Prometheus y Grafana para la misma métrica.
- Diferencias en etiquetas que impiden agrupar.
Registrar el diagnóstico¶
Nombre de la alerta:
Número de reglas similares:
Número de alertas en Prometheus:
Número de alertas en Alertmanager:
Labels:
group_by:
repeat_interval:
Causa:
Corrección:
Sesión práctica 8: probar silencios¶
Objetivo¶
Crear y comprobar un silencio temporal en Alertmanager.
Consultar silencios actuales¶
Crear un silencio mediante la interfaz¶
En Alertmanager:
- Accede a la interfaz web.
- Selecciona la alerta.
- Pulsa Silence.
- Define la duración.
- Añade el creador.
- Añade un comentario.
- Confirma.
Crear un silencio mediante API¶
Ejemplo conceptual:
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"matchers": [
{
"name": "alertname",
"value": "NodeExporterDown",
"isRegex": false
}
],
"startsAt": "2026-09-25T12:00:00Z",
"endsAt": "2026-09-25T13:00:00Z",
"createdBy": "laboratorio",
"comment": "Práctica de mantenimiento"
}' \
http://localhost:9093/api/v2/silences
Utiliza fechas adecuadas al momento de la práctica.
Comprobar el silencio¶
Preguntas de análisis¶
- ¿La alerta sigue activa?
- ¿Se ha detenido únicamente la notificación?
- ¿Qué labels coinciden con el silencio?
- ¿Cuándo expira?
- ¿Qué diferencia existe entre un silencio y una inhibición?
Sesión práctica 9: crear una alerta desde Grafana¶
Objetivo¶
Crear una regla de alerta en Grafana utilizando Prometheus.
Crear la regla¶
En Grafana:
- Abre Alerting.
- Selecciona Alert rules.
- Pulsa New alert rule.
- Introduce un nombre:
- Selecciona Prometheus.
- Añade la consulta:
Definir la condición¶
Configura una condición similar a:
Definir la evaluación¶
Ejemplo:
Añadir labels¶
Añadir anotaciones¶
Guardar¶
Guarda la regla y revisa su estado en:
Validar¶
Genera carga de laboratorio o utiliza un umbral controlado.
Sesión práctica 10: crear un informe de alertas¶
Objetivo¶
Documentar todo el flujo de una alerta.
Crear el directorio¶
Generar información de Prometheus¶
{
echo "===== INFORME DE ALERTAS ====="
echo "Fecha: $(date)"
echo "Equipo: $(hostname)"
echo
echo "===== PROMETHEUS ====="
systemctl is-active prometheus 2>/dev/null || true
echo
echo "===== ALERTMANAGER ====="
systemctl is-active alertmanager 2>/dev/null || true
echo
echo "===== REGLAS ====="
curl -s http://localhost:9090/api/v1/rules \
|| true
echo
echo
echo "===== ALERTAS PROMETHEUS ====="
curl -s http://localhost:9090/api/v1/alerts \
|| true
echo
echo
echo "===== ALERTMANAGERS ====="
curl -s http://localhost:9090/api/v1/alertmanagers \
|| true
echo
echo
echo "===== ALERTAS ALERTMANAGER ====="
curl -s http://localhost:9093/api/v2/alerts \
|| true
echo
echo
echo "===== SILENCIOS ====="
curl -s http://localhost:9093/api/v2/silences \
|| true
echo
echo
echo "===== LOGS PROMETHEUS ====="
sudo journalctl -u prometheus \
-n 50 \
--no-pager
echo
echo "===== LOGS ALERTMANAGER ====="
sudo journalctl -u alertmanager \
-n 50 \
--no-pager
} | tee informe-alertas.txt
Revisar el informe¶
Lista de comprobación de Prometheus¶
[ ] El servicio Prometheus está activo.
[ ] La configuración principal es válida.
[ ] Los ficheros de reglas son legibles.
[ ] Las reglas se validan con promtool.
[ ] Las reglas aparecen en /rules.
[ ] Las expresiones devuelven los resultados esperados.
[ ] El período for está documentado.
[ ] Las alertas aparecen en /alerts.
[ ] Prometheus conoce a Alertmanager.
[ ] El endpoint de Alertmanager responde.
[ ] No hay errores recientes en el journal.
Lista de comprobación de Alertmanager¶
[ ] Alertmanager está instalado.
[ ] El servicio está activo.
[ ] El puerto 9093 está en escucha.
[ ] La configuración es válida.
[ ] Prometheus puede conectarse.
[ ] Las alertas llegan a Alertmanager.
[ ] Las rutas coinciden con las labels.
[ ] Los receptores están configurados.
[ ] No existen silencios inesperados.
[ ] No existen inhibiciones inesperadas.
[ ] El webhook o SMTP responde.
[ ] El intervalo de repetición es adecuado.
[ ] Los registros no muestran errores.
Lista de comprobación de Grafana Alerting¶
[ ] La regla existe.
[ ] La fuente de datos es correcta.
[ ] La consulta devuelve datos.
[ ] La condición está bien definida.
[ ] El intervalo de evaluación es adecuado.
[ ] El período de permanencia es adecuado.
[ ] Las labels están configuradas.
[ ] Las anotaciones son claras.
[ ] Existe un contact point.
[ ] Existe una notification policy.
[ ] No existe un mute timing inesperado.
[ ] No existe un silencio inesperado.
[ ] El estado de la regla es conocido.
[ ] Los logs no muestran errores.
Buenas prácticas¶
- Define nombres de alerta claros y estables.
- Utiliza expresiones que puedan probarse directamente en Prometheus.
- Valida los ficheros con
promtool. - Utiliza
forpara evitar alertas transitorias. - Configura umbrales basados en el comportamiento real.
- Utiliza labels coherentes.
- Separa etiquetas de clasificación y anotaciones descriptivas.
- Incluye el recurso afectado en la anotación.
- Añade enlaces a procedimientos operativos.
- Comprueba la retención y el intervalo de evaluación.
- Evita alertar sobre métricas que no tienen datos fiables.
- No dupliques reglas entre Prometheus y Grafana sin una razón.
- Configura correctamente las rutas de Alertmanager.
- Utiliza
group_bypara evitar notificaciones repetitivas. - Ajusta
repeat_intervala la importancia de la alerta. - Revisa silencios e inhibiciones antes de cambiar reglas.
- Utiliza receptores de prueba durante las prácticas.
- No incluyas credenciales en ficheros compartidos.
- Documenta las pruebas de activación y recuperación.
- Prueba también el estado de resolución de una alerta.
- Comprueba las alertas desde la métrica
ALERTS. - Revisa los logs cuando una alerta no se comporte como se espera.
Tabla de síntomas y comprobaciones¶
| Síntoma | Primera prueba | Posible causa |
|---|---|---|
| La regla no aparece | promtool check rules |
Ruta o configuración |
La regla aparece como bad |
API de reglas | PromQL o YAML |
| La alerta nunca se activa | Probar la expresión | Filtro incorrecto |
La alerta permanece pending |
Revisar for |
Tiempo insuficiente |
| La alerta se activa constantemente | Revisar umbral | Condición inestable |
| No llega la notificación | Consultar Alertmanager | Ruta o receptor |
| Alertas duplicadas | Revisar reglas y group_by |
Duplicación |
| Alerta activa sin aviso | Consultar silencios | Silencio o inhibición |
| Webhook no funciona | curl al endpoint |
Red o autenticación |
| SMTP no funciona | Logs de Alertmanager | Servidor o credenciales |
Grafana muestra NoData |
Probar consulta | Fuente o métrica |
Regla de Grafana en Error |
Query Inspector | Consulta o permisos |
| La alerta no muestra instancia | Revisar etiquetas | Agregación incorrecta |
Cambia a inactive enseguida |
Revisar expresión | Condición intermitente |
Puntos clave¶
- Una alerta depende de métricas, expresiones, reglas y notificaciones.
- Prometheus evalúa sus propias reglas y puede enviar alertas a Alertmanager.
- Alertmanager agrupa, enruta, silencia e inhibe alertas.
- Grafana tiene su propio sistema de alertas.
- Los estados habituales son
inactive,pendingyfiring. - El período
forevita activar alertas por problemas momentáneos. promtool check rulesvalida los ficheros de reglas.- La interfaz
/rulesmuestra el estado de las reglas. - La interfaz
/alertsmuestra las alertas evaluadas por Prometheus. - La métrica
ALERTSpermite consultar estados mediante PromQL. - Una expresión que no devuelve datos no activa una alerta normal.
- Las etiquetas permiten clasificar y enrutar alertas.
- Las anotaciones explican el problema.
- Una agregación puede eliminar etiquetas necesarias para las notificaciones.
- Alertmanager debe recibir las alertas desde Prometheus.
- Una ruta de Alertmanager debe coincidir con las labels reales.
- Los silencios detienen notificaciones, pero no necesariamente la evaluación.
- Las inhibiciones pueden ocultar alertas secundarias.
- Una alerta activa no garantiza que la notificación se haya entregado.
- Toda alerta debe probarse tanto en activación como en recuperación.
Preguntas de comprobación¶
- ¿Qué diferencia existe entre una métrica y una alerta?
- ¿Qué función cumple una regla de alerta?
- ¿Qué significan los estados
inactive,pendingyfiring? - ¿Qué función cumple el campo
for? - ¿Qué comando permite validar las reglas de Prometheus?
- ¿Dónde se pueden consultar las reglas cargadas?
- ¿Dónde se pueden consultar las alertas activas?
- ¿Qué función cumple Alertmanager?
- ¿Qué diferencia existe entre una etiqueta y una anotación?
- ¿Por qué una agregación puede eliminar la etiqueta
instance? - ¿Qué comprobarías si una alerta nunca se activa?
- ¿Qué comprobarías si una alerta permanece en
pending? - ¿Qué causas pueden provocar alertas repetitivas?
- ¿Qué diferencia existe entre un silencio y una inhibición?
- ¿Qué comprobarías si Prometheus genera alertas, pero Alertmanager no las recibe?
- ¿Qué comprobarías si Alertmanager recibe una alerta, pero no envía la notificación?
- ¿Qué función cumple
group_by? - ¿Qué información debe contener una anotación útil?
- ¿Qué diferencias existen entre las alertas de Prometheus y las de Grafana?
- ¿Qué información debe incluir un informe de una incidencia de alertas?