Guia passo a passo para configurar o Alertmanager do Prometheus com o Slack, PagerDuty, e Gmail
Em meu post anterior, “Como explorar o Prometheus com um simples projetos‘Hello World’”, descrevi três projetos, onde usei para ter uma noção melhor do que o Prometheus pode fazer. Neste post, explico como me familiarizei melhor com o Alertmanager do Prometheus e como configurei notificações de alerta para o Slack, PagerDuty, e Gmail.
Vou fazer referência ao meu post anterior um pouco, então recomendo lê-lo antes de seguir em frente.
Noções básicas
Você pode começar a usar o Prometheus em minutos com o Grafana Cloud. Temos planos gratuitos e pagos do Grafana Cloud para atender a todos os casos de uso. Inscreva-se gratuitamente agora.
A configuração de alertas com o Prometheus é um processo de duas etapas:
Para começar, você precisa criar suas regras de alerta no Prometheus e especificar sob quais condições deseja receber alertas (como quando uma instância está inativa).
Em segundo lugar, você precisa configurar o Alertmanager, que recebe os alertas do Prometheus. O Alertmanager será capaz de fazer várias coisas, incluindo:
- agrupar os alertas de natureza parecida numa única notificação
- silenciar alertas por um tempo específico
- silenciar notificações para determinados alertas, se outros alertas já estiverem disparando
- escolher quais destinos do alerta específico
Etapa 1: Crie regras de alerta no Prometheus
Vamos começar com quatro subpastas que configuramos anteriormente para cada projeto: server, node_exporter, github_exporter, e prom_middleware. Explico este processo no meu post, sobre como explorar o Prometheus com projetos simples.
Passamos para a subpasta do servidor, abrimos o conteúdo no editor de código e, em seguida, criamos um novo arquivo de regras. Em rules.yml, você especificará as condições em que gostaria de receber alertas.
cd Prometheus/server
touch rules.yml
Tenho certeza de que todos concordam que é muito importante saber quando qualquer uma de suas instâncias está inativa. Portanto, vou usar a métrica up como nossa condição. Ao avaliar essa métrica na interface do Prometheus (http://localhost:9090), você verá que todas as instâncias em execução têm valor 1, enquanto todas as instâncias que não estão em execução têm valor 0 (no momento, só executamos nossa instância do Prometheus).
Depois de decidir as condições do seu alerta, você precisa especificá-las em rules.yml O conteúdo dela será o seguinte:
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'
Para resumir, ele diz que, se alguma das instâncias ficar inativa (up == 0) por um minuto, o alerta será disparado. Também incluí anotações e etiquetas que armazenam informações adicionais sobre os alertas. Para esses, você pode usar modelos de variáveis, como {{ $labels.instance }}, que são então adicionados para identificar instâncias específicas (como localhost:9100).
Você pode ler mais sobre as regras de alerta do Prometheus aqui.
Depois de preparar o rules.yml, você precisa vincular o arquivo ao prometheus.yml e adicionar a configuração de alerta. Seu prometheus.yml vai ficar assim:
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
Se você iniciou o Prometheus com o parâmetro --web.enable-lifecycle
, você pode recarregar a configuração enviando a solicitação POST para /-/reload
no endpoint curl -X POST http://localhost:9090/-/reload
. Depois disso, inicie o aplicativo Prom_middleware (node index.js
na pasta prom_middleware) e o node_exporter (./node_exporter
na pasta node_exporter).
Depois disso, sempre que você quiser criar um alerta, basta parar o node_exporter ou o aplicativo prom_middleware.
Etapa 2: Configure o Alertmanager
Crie uma subpasta alert_manager na pasta do Prometheus, mkdir alert_manager
. Use esta pasta para baixar e extrair o Alertmanager a partir do site do Prometheus e, sem nenhuma modificação no alertmanager.yml, execute o ./alertmanager --config.file=alertmanager.yml
e abra a url localhost:9093.
Dependendo se você tem ou não algum alerta ativo, o Alertmanager deve estar configurado corretamente e ter uma aparência parecida com a imagem abaixo. Para ver as anotações que você adicionou na etapa acima, clique no botão +Info.
Com tudo concluído, agora podemos analisar as diferentes maneiras de utilizar o Alertmanager e enviar notificações.
Como configurar alertas para o Slack
Para receber notificações via Slack, você precisa fazer parte de um workspace do Slack. Se você não faz parte de nenhum ou deseja testar isso em um workspace separado, pode criar rapidamente um aqui.
Para configurar o alerta em seu workspace do Slack, você precisa URL da API do Slack. Vá para Slack -> Administração -> Gerenciar aplicativos.
No diretório Gerenciar aplicativos, pesquise WebHooks de entrada e adicione-os ao seu espaço de trabalho do Slack.
Em seguida, especifique em qual canal você deseja receber notificações do Alertmanager. Criei o canal #monitoring-infrastructure. Depois de confirmar e adicionar a integração WebHooks de entrada, a URL do webhook (que é a URL da sua API do Slack) é exibida. Copie.
Em seguida, você precisa modificar o arquivo alertmanager.yml. Primeiro, abra a subpasta alert_manager no seu editor de código e preencha seu alertmanager.yml com base no modelo abaixo. Use a URL que você acabou 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
Recarregue a configuração enviando um POST para o endpoint /-/reload
, curl -X POST http://localhost:9093/-/reload
. Em alguns minutos (depois de parar pelo menos uma de suas instâncias), você deve receber suas notificações de alerta pelo Slack dessa maneira:
Se quiser aprimorar suas notificações e torná-las mais bonitas, você pode usar o modelo abaixo ou usar esta ferramenta e criar o seu próprio template de notificação.
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 }}
E este é o resultado final:
Como configurar alertas para o PagerDuty
O PagerDuty é uma das plataformas de resposta a incidentes mais conhecidas para departamentos de TI. Para configurar os alertas através do PagerDuty, você precisa criar uma conta lá. O PagerDuty é um serviço pago, mas você pode fazer um teste gratuito de 14 dias. Depois de fazer login, vá para Configuração -> Serviços -> + Novo Serviço.
Selecione o Prometheus na lista de tipos de integração e dê um nome ao serviço. Decidi chamar o meu de Prometheus Alertmanager. Você também pode personalizar as configurações de incidentes, mas eu escolhi a configuração padrão. Em seguida, clique em Salvar.
A chave de integração será exibida. Copie a chave.
Você precisará atualizar o conteúdo do seu alertmanager.yml. Ele deve ser parecido com o exemplo abaixo, mas use sua própria service_key (chave de integração do PagerDuty). Pagerduty_url deve permanecer igual e deve ser definido como https://events.pagerduty.com/v2/enqueue. Salve e reinicie o 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
Pare uma de suas instâncias. Após alguns minutos, as notificações de alerta devem ser exibidas no PagerDuty.
Como configurar alertas do Gmail
Se preferir receber suas notificações diretamente através de um serviço de e-mail, a configuração é ainda mais fácil. O Alertmanager pode simplesmente repassar mensagens para o seu provedor (neste caso, usei o Gmail).
Não é recomendável que você use sua senha pessoal para isso, portanto, crie uma senha para o aplicativo. Para fazer isso, vá para Configurações da conta -> Segurança -> Entrar no Google -> Senha do aplicativo. Se você não vir a senha do aplicativo como opção, é possível que não tenha configurado a verificação em duas etapas, e precisará fazer isso primeiro. Copie a senha recém-criada.
Você precisará atualizar o conteúdo do seu alertmanager.yml novamente. O conteúdo deve ser parecido com o exemplo abaixo. Não se esqueça de inserir seu próprio endereço de e-mail e a senha.
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
Mais uma vez, após alguns minutos (depois de parar pelo menos uma das suas instâncias), as notificações de alerta devem ser enviadas para o seu Gmail.
É isso aí!