Guía paso a paso para configurar Prometheus Alertmanager con Slack, PagerDuty, y Gmail
En mi anterior publicación del blog, «Cómo explorar Prometheus con sencillos proyectos “Hello World”», describí tres proyectos que utilicé para hacerme una mejor idea de lo que puede hacer Prometheus. En esta publicación, me gustaría compartir cómo me familiaricé con Prometheus Alertmanager y cómo configuré las notificaciones de alerta para Slack, PagerDuty, y Gmail.
(Voy a hacer bastante referencia a mi publicación anterior en el blog, así que recomiendo leerla antes de continuar).
Conceptos básicos
Puede empezar a utilizar Prometheus en cuestión de minutos gracias a Grafana Cloud. Contamos con planes gratuitos y de pago de Grafana Cloud que se adaptan a cualquier caso práctico: regístrese ahora de forma gratuita.
Configurar alertas con Prometheus es un proceso de dos pasos:
Para comenzar, debe crear sus reglas de alerta en Prometheus y especificar bajo qué condiciones desea recibir alertas (por ejemplo, cuando una instancia está caída).
En segundo lugar, debe configurar Alertmanager, que recibe las alertas especificadas en Prometheus. Alertmanager podrá entonces llevar a cabo una serie de acciones, como por ejemplo:
- Agrupar alertas similares en una sola notificación.
- Silenciar las alertas durante un tiempo determinado.
- Silenciar las notificaciones de ciertas alertas si otras alertas especificadas ya estuvieran activadas.
- Elegir qué destinatarios reciben una alerta concreta.
Paso 1: Crear reglas de alerta en Prometheus
Empezamos con cuatro subcarpetas que hemos configurado previamente para cada proyecto: server, node_exporter, github_exporter, y prom_middleware. El proceso se explica en la publicación de mi blog sobre cómo aprender Prometheus con proyectos sencillos aquí.
Nos dirigimos a la subcarpeta server y abrimos el contenido en el editor de código, luego creamos un nuevo archivo de reglas. En rules.yml, especificará las condiciones en las que desea recibir alertas.
cd Prometheus/server
touch rules.yml
Estoy segura de que todo el mundo está de acuerdo en que saber cuándo se cae alguna de sus instancias es muy importante. Por lo tanto, voy a usar esto como nuestra condición de alertado utilizando la métrica up. Al evaluar esta métrica en la interfaz de usuario de Prometheus (http://localhost:9090), observará que todas las instancias que se están ejecutando tienen un valor de 1, mientras que todas las instancias que no se están ejecutando tienen un valor de 0 (actualmente sólo ejecutamos nuestra instancia de Prometheus).
Una vez que haya decidido su condición de alerta, debe especificarla en rules.yml. Su contenido será el siguiente:
groups:
- name: AllInstances
rules:
- alert: InstanceDown
# Condition for alerting
expr: up == 0
for: 1m
# Annotation - additional informational labels to store more information
annotations:
title: 'Instance {{ $labels.instance }} down'
description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minute.'
# Labels - additional labels to be attached to the alert
labels:
severity: 'critical'
En resumen, determina que si alguna de las instancias está caída (up == 0) durante un minuto, entonces se activará la alerta. También he incluido anotaciones y etiquetas, que almacenan información adicional sobre las alertas. Para ellas, puede utilizar variables de plantilla como {{ $labels.instance }}, que luego se interpolan en instancias específicas (como localhost:9100).
(Puede leer más sobre las reglas de alerta de Prometheus aquí).
Una vez que tenga rules.yml listo, debe vincular el archivo a prometheus.yml y añadir la configuración de alertas. Su prometheus.yml tendrá el siguiente aspecto:
global:
# How frequently to scrape targets
scrape_interval: 10s
# How frequently to evaluate rules
evaluation_interval: 10s
# Rules and alerts are read from the specified file(s)
rule_files:
- rules.yml
# Alerting specifies settings related to the Alertmanager
alerting:
alertmanagers:
- static_configs:
- targets:
# Alertmanager's default port is 9093
- localhost:9093
# A list of scrape configurations that specifies a set of
# targets and parameters describing how to scrape them.
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets:
- localhost:9090
- job_name: 'node_exporter'
scrape_interval: 5s
static_configs:
- targets:
- localhost:9100
- job_name: 'prom_middleware'
scrape_interval: 5s
static_configs:
- targets:
- localhost:9091
Si ha iniciado Prometheus con la opción --web.enable-lifecycle
, puede recargar la configuración enviando una solicitud POST al punto final /-/reload: curl -X POST http://localhost:9090/-/reload
. Después, inicie la aplicación prom_middleware (node index.js
en la carpeta prom_middleware) y node_exporter (./node_exporter
en la carpeta node_exporter).
Una vez hecho esto, cada vez que quiera crear una alerta, sólo tendrá que detener la aplicación node_exporter o prom_middleware.
Paso 2: Configurar Alertmanager
Cree una subcarpeta alert_manager en la carpeta Prometheus, mkdir alert_manager
. En esta carpeta, descargará y extraerá Alertmanager del sitio web de Prometheus y sin modificar el archivo alertmanager.yml, ejecutará ./alertmanager --config.file =alertmanager.yml
y abrirá localhost:9093.
Dependiendo de si tiene o no alertas activas, Alertmanager debe estar configurado correctamente y tener un aspecto similar al de la imagen siguiente. Para ver las anotaciones que añadió en el paso anterior, haga clic en el botón +Info.
Una vez completado todo esto, podemos ver las diferentes formas de utilizar Alertmanager y enviar notificaciones de alerta.
Cómo configurar las alertas de Slack
Si desea recibir notificaciones a través de Slack, deberá formar parte de un espacio de trabajo de Slack. Si actualmente no forma parte de ningún espacio de trabajo de Slack o desea probarlo en un espacio de trabajo separado, puede crear uno rápidamente aquí.
Para configurar las alertas en su espacio de trabajo de Slack, necesitará una URL de la API de Slack. Vaya a Slack -> Administración -> Administrar aplicaciones.
En el directorio Gestionar aplicaciones, busque Webhooks entrantes y añádalo a su espacio de trabajo de Slack.
A continuación, especifique en qué canal desea recibir notificaciones de Alertmanager. (Yo he creado el canal #monitoring-infrastructure). Después de confirmar y añadir la integración de Webhooks entrantes, aparecerá la URL del webhook (que es la URL de su API de Slack). Cópiela.
A continuación, debe modificar el archivo alertmanager.yml. En primer lugar, abra la subcarpeta alert_manager en el editor de código y rellene el archivo alertmanager.yml según la siguiente plantilla. Use la URL que acaba de copiar como slack_api_url.
global:
resolve_timeout: 1m
slack_api_url: 'https://hooks.slack.com/services/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'
route:
receiver: 'slack-notifications'
receivers:
- name: 'slack-notifications'
slack_configs:
- channel: '#monitoring-instances'
send_resolved: true
Vuelva a cargar la configuración enviando una solicitud POST al punto final /-/reload
: curl -X POST http://localhost:9093/-/reload
. En un par de minutos (después de detener al menos una de sus instancias), debería recibir sus notificaciones de alerta a través de Slack de la siguiente manera:
Si quiere mejorar sus notificaciones y darles un aspecto más atractivo, puede utilizar la plantilla que aparece a continuación, o utilizar esta herramienta para crear la suya propia.
global:
resolve_timeout: 1m
slack_api_url: 'https://hooks.slack.com/services/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'
route:
receiver: 'slack-notifications'
receivers:
- name: 'slack-notifications'
slack_configs:
- channel: '#monitoring-instances'
send_resolved: true
icon_url: https://avatars3.githubusercontent.com/u/3380462
title: |-
[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .CommonLabels.alertname }} for {{ .CommonLabels.job }}
{{- if gt (len .CommonLabels) (len .GroupLabels) -}}
{{" "}}(
{{- with .CommonLabels.Remove .GroupLabels.Names }}
{{- range $index, $label := .SortedPairs -}}
{{ if $index }}, {{ end }}
{{- $label.Name }}="{{ $label.Value -}}"
{{- end }}
{{- end -}}
)
{{- end }}
text: >-
{{ range .Alerts -}}
*Alert:* {{ .Annotations.title }}{{ if .Labels.severity }} - `{{ .Labels.severity }}`{{ end }}
*Description:* {{ .Annotations.description }}
*Details:*
{{ range .Labels.SortedPairs }} • *{{ .Name }}:* `{{ .Value }}`
{{ end }}
{{ end }}
Y éste es el resultado final:
Cómo configurar las alertas de PagerDuty
PagerDuty es una de las plataformas de respuesta a incidentes más conocidas para los departamentos de informática. Para configurar las alertas a través de PagerDuty, debe crear una cuenta allí. (PagerDuty es un servicio de pago, pero puede hacer una prueba gratuita de 14 días). Una vez que haya iniciado sesión, vaya a Configuración -> Servicios -> + Nuevo servicio.
Elija Prometheus de la lista Tipos de integración y asigne un nombre al servicio. Yo he decidido llamar al mío Prometheus Alertmanager. (También puede personalizar la configuración del incidente, pero yo opté por la configuración por defecto). A continuación, haga clic en Guardar.
Se mostrará la clave de integración. Copie la clave.
Tendrá que actualizar el contenido de alertmanager.yml. Debería parecerse al siguiente ejemplo, pero use su propia service_key (clave de integración de PagerDuty). Pagerduty_url debe permanecer igual y debe establecerse en https://events.pagerduty.com/v2/enqueue. Guarde los cambios y reinicie Alertmanager.
global:
resolve_timeout: 1m
pagerduty_url: 'https://events.pagerduty.com/v2/enqueue'
route:
receiver: 'pagerduty-notifications'
receivers:
- name: 'pagerduty-notifications'
pagerduty_configs:
- service_key: 0c1cc665a594419b6d215e81f4e38f7
send_resolved: true
Detenga una de las instancias. Al cabo de un par de minutos, las notificaciones de alerta deberían aparecer en PagerDuty.
En la configuración de usuario de PagerDuty, puede decidir cómo desea que se le notifique: correo electrónico y/o llamada telefónica. Yo elegí ambos y ambos funcionaron correctamente.
Cómo configurar las alertas de Gmail
Si prefiere que sus notificaciones lleguen directamente a través de un servicio de correo electrónico, la configuración es incluso más sencilla. Alertmanager puede pasar simplemente los mensajes a su proveedor ―en este caso, yo utilicé Gmail― para que los envíe en su nombre.
No es recomendable que utilice su contraseña personal para ello, por lo que deberá crear una contraseña de aplicación. Para ello, vaya a Configuración de la cuenta -> Seguridad -> Inicio de sesión en Google -> Contraseña de aplicación (si no ve la opción Contraseña de aplicación, probablemente no haya configurado la Verificación en dos pasos y tendrá que hacerlo primero). Copie la contraseña recién creada.
Deberá actualizar de nuevo el contenido de alertmanager.yml. El contenido debería ser similar al del ejemplo siguiente. No olvide reemplazar la dirección de correo electrónico con su propia dirección de correo electrónico y la contraseña con la nueva contraseña de aplicación.
global:
resolve_timeout: 1m
route:
receiver: 'gmail-notifications'
receivers:
- name: 'gmail-notifications'
email_configs:
- to: monitoringinstances@gmail.com
from: monitoringinstances@gmail.com
smarthost: smtp.gmail.com:587
auth_username: monitoringinstances@gmail.com
auth_identity: monitoringinstances@gmail.com
auth_password: password
send_resolved: true
De nuevo, tras un par de minutos (después de detener al menos una de las instancias), deberían enviarse notificaciones de alerta a su Gmail.
Y eso es todo.