Alertmanager: alertas do Prometheus para Slack e email
Alertmanager é o componente do Prometheus responsável por receber alertas disparados pelas regras de alerta e encaminhar para os canais corretos — Slack, email, PagerDuty, Telegram. Mais importante: ele deduplica, agrupa e inibe alertas para que você receba notificações úteis, não spam.
Instalar e configurar o Alertmanager
Adicionar Alertmanager ao stack Prometheus:
# docker-compose.yml — adicionar Alertmanager:
services:
alertmanager:
image: prom/alertmanager:latest
container_name: alertmanager
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
- alertmanager-data:/alertmanager
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
- '--storage.path=/alertmanager'
- '--web.external-url=https://alertmanager.seudominio.com.br'
ports:
- "127.0.0.1:9093:9093"
restart: unless-stopped
# prometheus.yml — apontar para o Alertmanager:
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
rule_files:
- "alerts/*.yml" # pasta com arquivos de regras de alerta
volumes:
alertmanager-data:Configurar receivers: Slack e email
alertmanager.yml com roteamento para múltiplos canais:
# alertmanager.yml:
global:
resolve_timeout: 5m
# Email (SMTP):
smtp_smarthost: 'smtp.gmail.com:587'
smtp_from: 'alertas@seudominio.com.br'
smtp_auth_username: 'alertas@seudominio.com.br'
smtp_auth_password: 'SENHA_APP_GOOGLE'
smtp_require_tls: true
route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 30s # aguardar 30s para agrupar alertas do mesmo grupo
group_interval: 5m # intervalo mínimo entre notificações do mesmo grupo
repeat_interval: 4h # reenviar alerta não resolvido a cada 4h
receiver: 'slack-critico'
routes:
# Alertas críticos → Slack #alertas-criticos + email
- match:
severity: critical
receiver: 'critico-multi'
continue: false
# Alertas de warning → Slack #alertas-warning apenas
- match:
severity: warning
receiver: 'slack-warning'
receivers:
- name: 'slack-critico'
slack_configs:
- api_url: 'https://hooks.slack.com/services/SEU/WEBHOOK/TOKEN'
channel: '#alertas-criticos'
send_resolved: true
title: '{{ if eq .Status "firing" }}🔴{{ else }}✅{{ end }} {{ .GroupLabels.alertname }}'
text: |
*Ambiente:* {{ .GroupLabels.cluster }}
*Serviço:* {{ .GroupLabels.service }}
{{ range .Alerts }}
*Descrição:* {{ .Annotations.description }}
*Desde:* {{ .StartsAt.Format "02/01/2006 15:04" }}
{{ end }}
- name: 'critico-multi'
slack_configs:
- api_url: 'https://hooks.slack.com/services/SEU/WEBHOOK/TOKEN'
channel: '#alertas-criticos'
send_resolved: true
email_configs:
- to: 'oncall@seudominio.com.br'
send_resolved: true
subject: '[CRITICO] {{ .GroupLabels.alertname }} - {{ .GroupLabels.service }}'
- name: 'slack-warning'
slack_configs:
- api_url: 'https://hooks.slack.com/services/SEU/WEBHOOK/TOKEN'
channel: '#alertas-warning'
send_resolved: trueRegras de alerta para API Node.js
Definir alertas PromQL para latência, erros e disponibilidade:
# alerts/nodejs-api.yml:
groups:
- name: nodejs-api
interval: 30s
rules:
# Alta taxa de erros 5xx:
- alert: ApiAltaTaxaErros
expr: |
sum(rate(http_request_duration_seconds_count{status_code=~"5.."}[5m]))
/
sum(rate(http_request_duration_seconds_count[5m])) > 0.05
for: 2m # disparar apenas se a condição persistir por 2 minutos
labels:
severity: critical
service: nodejs-api
annotations:
summary: "Taxa de erros acima de 5%"
description: "Taxa atual: {{ $value | humanizePercentage }}. Endpoint com mais erros pode ser visto no Grafana."
# Latência P99 alta:
- alert: ApiLatenciaAlta
expr: |
histogram_quantile(0.99,
sum by (le) (rate(http_request_duration_seconds_bucket[5m]))
) > 2
for: 5m
labels:
severity: warning
service: nodejs-api
annotations:
summary: "P99 de latência acima de 2s"
description: "P99 atual: {{ $value | humanizeDuration }}"
# API fora do ar (sem métricas):
- alert: ApiForaDoAr
expr: up{job="nodejs-api"} == 0
for: 1m
labels:
severity: critical
service: nodejs-api
annotations:
summary: "API Node.js inacessível"
description: "O endpoint de métricas da API não responde há mais de 1 minuto."
# Memória Node.js alta:
- alert: NodejsMemoriaAlta
expr: |
process_resident_memory_bytes{job="nodejs-api"}
/ 1024 / 1024 > 512
for: 10m
labels:
severity: warning
annotations:
summary: "Uso de memória acima de 512MB"
description: "Memória atual: {{ $value | humanize1024 }}B"Inibições e silêncios
Evitar notificação de alertas derivados e silenciar durante manutenção:
# alertmanager.yml — seção inhibit_rules:
inhibit_rules:
# Se API está fora do ar (critical), inibir alertas de latência (warning):
# Evita receber "latência alta" quando o problema real é "api fora do ar"
- source_match:
alertname: 'ApiForaDoAr'
severity: 'critical'
target_match:
severity: 'warning'
equal: ['service'] # mesmo serviço
# Se servidor está down, inibir alertas de aplicação no mesmo servidor:
- source_match:
alertname: 'ServidorForaDoAr'
target_match_re:
alertname: 'Api.*|Nodejs.*|Postgres.*'
equal: ['instance']
# Silêncio via API do Alertmanager (para manutenção planejada):
# POST /api/v2/silences
curl -X POST http://alertmanager:9093/api/v2/silences -H 'Content-Type: application/json' -d '{
"matchers": [{"name": "service", "value": "nodejs-api", "isRegex": false}],
"startsAt": "2026-06-08T02:00:00Z",
"endsAt": "2026-06-08T04:00:00Z",
"comment": "Manutenção programada — deploy v2.0",
"createdBy": "admin"
}'
# Listar silêncios ativos:
curl http://alertmanager:9093/api/v2/silences
# Verificar configuração do Alertmanager sem reiniciar:
curl -X POST http://alertmanager:9093/-/reloadTestar e depurar alertas
Ferramentas para validar regras e simular alertas:
# Validar arquivo de regras de alerta:
docker run --rm -v $(pwd)/alerts:/alerts prom/prometheus:latest promtool check rules /alerts/nodejs-api.yml
# Testar expressão PromQL no Prometheus:
# Acessar http://localhost:9090/graph e colar a expr do alerta
# Verificar alertas ativos no Prometheus:
# http://localhost:9090/alerts
# Forçar disparo de um alerta para testar:
# Opção 1: usar amtool (CLI do Alertmanager):
docker run --rm prom/alertmanager:latest amtool alert add alertname=TestAlerta service=nodejs-api severity=critical --alertmanager.url=http://alertmanager:9093 --annotation=summary="Teste de alerta" --annotation=description="Verificando integração Slack"
# Opção 2: criar uma regra que sempre dispara (para teste):
# - alert: TesteSempreFire
# expr: vector(1) > 0
# annotations:
# summary: "Alerta de teste — remover após verificar"
# Verificar roteamento sem enviar notificações:
amtool config routes test --alertmanager.url=http://alertmanager:9093 --config.file=alertmanager.yml severity=critical service=nodejs-api$ runstack deploy --plan starter
Não quer configurar manualmente?
Não quer configurar manualmente? Implante o VPS para Node.js em menos de 3 minutos com a Runstack. Infraestrutura da OPEN DATACENTER, com servidores no Brasil.
Perguntas frequentes
Conteúdos relacionados