Alertas no Grafana: e-mail, Slack e Telegram

Alertas transformam dashboards passivos em monitoramento ativo, você recebe notificação quando CPU está alta, disco está cheio ou serviço caiu, antes do usuário reportar o problema. O Grafana Alerting unificado (disponível desde a versão 9) suporta múltiplos canais de notificação e regras baseadas em PromQL.

Configurar contact points (canais de notificação)

Contact points definem para onde os alertas são enviados. Configure Telegram (mais prático para equipes pequenas):

bash
# 1. Criar bot no Telegram:
#    - Converse com @BotFather no Telegram
#    - /newbot → nome → username
#    - Guarde o TOKEN gerado

# 2. Obter o chat_id:
#    - Envie uma mensagem para o bot
#    - Acesse: https://api.telegram.org/botTOKEN/getUpdates
#    - Pegue o "id" dentro de "chat"

# 3. Configurar no Grafana via API:
curl -X POST http://localhost:3000/api/v1/provisioning/contact-points \
  -H "Content-Type: application/json" \
  -u admin:senha \
  -d '{
    "name": "Telegram Prod",
    "type": "telegram",
    "settings": {
      "bottoken": "SEU_TOKEN_BOT",
      "chatid": "SEU_CHAT_ID",
      "message": "{{ template \"default.message\" . }}"
    }
  }'

Configurar alerta via interface do Grafana

O processo completo para criar uma regra de alerta no Grafana:

bash
# Via interface Grafana (Alerting → Alert rules → New alert rule):

# 1. Nome: "CPU Alta — VPS Prod"

# 2. Query A (PromQL):
100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 3. Condição:
#    WHEN: last() OF query(A, 5m, now)
#    IS ABOVE: 80

# 4. Pending period: 5m
#    (aguardar 5 minutos acima do threshold antes de disparar)

# 5. Labels: severity=warning, team=ops

# 6. Annotations:
#    Summary: "CPU alta em {{ $labels.instance }}"
#    Description: "CPU em {{ $values.A.Value | printf \"%.1f\" }}% por 5+ minutos"

# 7. Folder: Infrastructure
#    Evaluation group: node-alerts (15s interval)

Notification policies: rotear alertas

Notification policies definem qual contact point recebe qual alerta baseado em labels:

bash
# Política de roteamento via API:
curl -X PUT http://localhost:3000/api/v1/provisioning/policies \
  -H "Content-Type: application/json" \
  -u admin:senha \
  -d '{
    "receiver": "telegram-prod",
    "group_by": ["alertname", "instance"],
    "group_wait": "30s",
    "group_interval": "5m",
    "repeat_interval": "4h",
    "routes": [
      {
        "receiver": "telegram-prod",
        "matchers": ["severity=critical"],
        "group_wait": "10s",
        "repeat_interval": "1h"
      },
      {
        "receiver": "email-oncall",
        "matchers": ["severity=warning"],
        "repeat_interval": "6h"
      }
    ]
  }'

Configurar e-mail como contact point

Configure SMTP no Grafana para envio de e-mails:

yaml
# docker-compose.yml — variáveis de ambiente do Grafana
services:
  grafana:
    environment:
      GF_SMTP_ENABLED: "true"
      GF_SMTP_HOST: "smtp.sendgrid.net:587"
      GF_SMTP_USER: "apikey"
      GF_SMTP_PASSWORD: ${SENDGRID_API_KEY}
      GF_SMTP_FROM_ADDRESS: "grafana@seudominio.com.br"
      GF_SMTP_FROM_NAME: "Grafana Monitoring"

# Adicionar contact point de e-mail:
curl -X POST http://localhost:3000/api/v1/provisioning/contact-points \
  -H "Content-Type: application/json" \
  -u admin:senha \
  -d '{
    "name": "Email Oncall",
    "type": "email",
    "settings": {
      "addresses": "oncall@seudominio.com.br;dev@seudominio.com.br",
      "subject": "[{{ .Status | toUpper }}] {{ .GroupLabels.alertname }}"
    }
  }'

Silenciar alertas durante manutenção

Silenciamentos evitam notificações desnecessárias durante deploys e manutenções planejadas:

bash
# Criar silenciamento via API (duração: 2 horas)
STARTS_AT=$(date -u +%Y-%m-%dT%H:%M:%SZ)
ENDS_AT=$(date -u -d "+2 hours" +%Y-%m-%dT%H:%M:%SZ)

curl -X POST http://localhost:3000/api/alertmanager/grafana/api/v2/silences \
  -H "Content-Type: application/json" \
  -u admin:senha \
  -d "{
    \"matchers\": [{
      \"name\": \"instance\",
      \"value\": \"vps-prod-01\",
      \"isRegex\": false
    }],
    \"startsAt\": \"$STARTS_AT\",
    \"endsAt\": \"$ENDS_AT\",
    \"comment\": \"Manutenção programada — deploy v2.0\",
    \"createdBy\": \"deploy-script\"
  }"

# Listar silenciamentos ativos
curl http://localhost:3000/api/alertmanager/grafana/api/v2/silences -u admin:senha

Não quer configurar manualmente?

Implante o VPS em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

Grafana Alerting (unificado, v9+): gerencia regras e notificações dentro do Grafana, mais simples para equipes que já usam Grafana. AlertManager: componente separado do Prometheus, mais poderoso para roteamento complexo, inibições e silenciamentos programáticos. Para VPS única: Grafana Alerting é suficiente. Para múltiplos Prometheus: AlertManager.

Pending period evita "flapping", alertas que disparam e se resolvem rapidamente, gerando notificações desnecessárias. Para CPU: 5 minutos garante que é realmente alta e não um pico temporário. Para disco cheio: 0 ou 1 minuto (cresce lentamente, qualquer aviso é válido). Para serviço down: 1-2 minutos (um restart rápido não deve gerar alarme).

Via interface: Alerting → Contact points → Test. Via API: POST /api/v1/provisioning/contact-points/TEST_ID/test. Para testar o alerta completo: crie uma regra com threshold que será imediatamente violado (ex: CPU > 1%) para ver o fluxo completo. Delete após o teste.

Checklist: (1) Contact point testado diretamente? (2) Notification policy rota corretamente para o contact point? (3) Há um silenciamento ativo? (4) O alerta está em Pending (não firing) ainda? (5) Logs do Grafana: docker compose logs grafana | grep -i "alert|notification".

Com cAdvisor: container_last_seen{name="minha_api"} + 60 < time(), alerta quando o container não foi visto há mais de 60 segundos. Ou via systemd (se usar docker compose com restart: always + systemd): node_systemd_unit_state{name="docker.service",state="active"} == 0.