Como configurar alertas no Grafana baseados em thresholds dinâmicos

1. Fundamentos de thresholds dinâmicos em monitoramento

Thresholds estáticos — como "alerta se CPU > 80%" — são simples, mas falham em cenários reais. Uma aplicação que normalmente opera a 30% de CPU pode gerar falsos positivos se o limite for fixo em 80%, enquanto um pico legítimo de 90% em horário comercial pode passar despercebido se o limite for muito alto.

Thresholds dinâmicos resolvem esse problema ajustando-se automaticamente ao comportamento histórico dos dados. Eles são essenciais para:

  • Detecção de anomalias sazonais: tráfego que dobra todo fim de semana
  • Picos de tráfego previsíveis: black friday ou lançamentos de produtos
  • Degradação gradual: vazamento de memória que aumenta 0,5% ao dia

Os conceitos matemáticos fundamentais incluem:

  • Média móvel: suaviza variações curtas para revelar tendências
  • Desvio padrão: mede a dispersão dos dados — alertas são acionados quando o valor atual está a N desvios da média
  • Percentis: úteis para métricas assimétricas (ex: latência p99)

2. Pré-requisitos e configuração do ambiente Grafana

Para implementar thresholds dinâmicos, você precisa do Grafana 8.0 ou superior (recomendado 9.x+), com o sistema de alertas unificados ativado.

Instalação mínima (Docker):

docker run -d -p 3000:3000 --name=grafana grafana/grafana:latest

Configuração de fonte de dados (Prometheus como exemplo):

  1. Acesse Configuration > Data Sources > Add data source
  2. Selecione Prometheus
  3. Configure a URL: http://prometheus:9090
  4. Habilite "Alerting" na seção de configuração avançada

Estrutura de pastas recomendada para times:

/etc/grafana/provisioning/alerting/
├── contact_points.yaml
├── notification_policies.yaml
├── rules/
│   ├── infra-estrutura.yaml
│   ├── aplicacao.yaml
│   └── negocios.yaml

3. Construção de consultas com métricas dinâmicas

A chave para thresholds dinâmicos está no uso de funções de agregação temporal no PromQL.

Média móvel de 7 dias:

avg_over_time(http_request_duration_seconds[7d])

Desvio padrão para detecção de anomalias:

stddev_over_time(http_request_duration_seconds[24h])

Exemplo prático — alerta de latência baseado em média móvel:

# Consulta A: média atual dos últimos 5 minutos
avg(rate(http_request_duration_seconds_sum[5m]) / rate(http_request_duration_seconds_count[5m]))

# Consulta B: threshold dinâmico (média histórica + 2 desvios)
avg_over_time(http_request_duration_seconds[7d]) + 2 * stddev_over_time(http_request_duration_seconds[7d])

4. Criação de regras de alerta com thresholds dinâmicos

Siga este passo a passo no Grafana Alerting:

  1. Acesse: Alerting > Alert rules > New alert rule
  2. Nome: "Latência anômala - threshold dinâmico"
  3. Expressão: crie duas consultas (A e B) como no exemplo anterior
  4. Condição:
when avg() of A is above B
  1. Configuração avançada: use labels e anotações para enriquecer notificações
# Labels
severity: critical
team: backend

# Anotações
summary: "Latência {{ $values.A.Value }} acima do threshold dinâmico {{ $values.B.Value }}"
description: "Média atual: {{ $values.A.Value }}s | Limite dinâmico: {{ $values.B.Value }}s | Desvio: {{ $values.B.Value | subtract $values.A.Value }}"

Exemplo completo de regra (formato YAML para provisionamento):

groups:
  - name: dynamic_thresholds
    rules:
      - alert: LatenciaAnomala
        expr: |
          avg(rate(http_request_duration_seconds_sum[5m]) / 
              rate(http_request_duration_seconds_count[5m]))
          >
          (avg_over_time(http_request_duration_seconds[7d]) + 
           2 * stddev_over_time(http_request_duration_seconds[7d]))
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Latência excede threshold dinâmico"

5. Estratégias de ajuste e calibração dos thresholds

Definição de janelas de tempo:

  • 1 hora: para métricas voláteis (ex: conexões ativas)
  • 24 horas: ideal para ciclos diários (ex: usuários por hora)
  • 7 dias: para padrões semanais (ex: tráfego em e-commerce)

Tratamento de outliers:

# Filtro de ruído: ignora picos acima de 3 desvios no cálculo do threshold
quantile_over_time(0.95, http_request_duration_seconds[7d])

Simulação de alertas com dados históricos:

Use o recurso "Test rule" no Grafana Alerting para validar a sensibilidade:

  1. Selecione "Test rule" na tela de criação de alerta
  2. Escolha um período histórico (ex: últimos 30 dias)
  3. Analise quantos alertas seriam disparados
  4. Ajuste o multiplicador (1.5, 2.0, 2.5) até atingir a sensibilidade desejada

6. Integração com canais de notificação e automação

Configuração de contact points:

# Slack
type: slack
settings:
  url: https://hooks.slack.com/services/T000000/B000000/XXXXXXXX
  title: "{{ .Labels.alertname }}"
  text: "{{ .Annotations.description }}"

# Webhook para sistema de tickets
type: webhook
settings:
  url: https://seu-jira.atlassian.net/rest/api/2/issue
  httpMethod: POST
  httpHeader: "Authorization: Bearer TOKEN"
  httpBody: |
    {
      "fields": {
        "project": {"key": "MON"},
        "summary": "{{ .Labels.alertname }}",
        "description": "{{ .Annotations.description }}"
      }
    }

Políticas de silenciamento e escalonamento:

# Silenciar alertas de baixa severidade em horário noturno
matchers:
  - severity = warning
time_intervals:
  - times:
      - start: "22:00"
        end: "06:00"
    days_of_week: ["monday", "tuesday", "wednesday", "thursday", "friday"]

7. Monitoramento e evolução dos alertas dinâmicos

Crie um dashboard dedicado para métricas de alertas:

# Taxa de falsos positivos
sum(ALERTS{severity="critical"}) / sum(ALERTS)

# Tempo médio de resposta
avg(alertmanager_notification_latency_seconds)

# Alertas por severidade
count by (severity) (ALERTS)

Revisão periódica recomendada:

  • Semanal: analisar falsos positivos e ajustar multiplicadores
  • Mensal: recalibrar janelas de tempo com base em sazonalidade
  • Trimestral: revisar limites mínimos/máximos para evitar thresholds muito largos

Ferramentas complementares:

O plugin Grafana ML (Machine Learning) pode automatizar a calibração usando algoritmos como Prophet do Facebook ou ARIMA, ajustando thresholds dinamicamente sem intervenção manual.

Referências