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):
- Acesse Configuration > Data Sources > Add data source
- Selecione Prometheus
- Configure a URL:
http://prometheus:9090 - 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:
- Acesse: Alerting > Alert rules > New alert rule
- Nome: "Latência anômala - threshold dinâmico"
- Expressão: crie duas consultas (A e B) como no exemplo anterior
- Condição:
when avg() of A is above B
- 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:
- Selecione "Test rule" na tela de criação de alerta
- Escolha um período histórico (ex: últimos 30 dias)
- Analise quantos alertas seriam disparados
- 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
- Documentação oficial do Grafana Alerting — Guia completo sobre criação e gerenciamento de alertas no Grafana, incluindo expressões avançadas e notificações.
- PromQL: funções de agregação temporal — Referência detalhada das funções
avg_over_time,stddev_over_timee outras para cálculos dinâmicos. - Tutorial: Alertas dinâmicos com Grafana e Prometheus — Artigo prático mostrando implementação de thresholds adaptáveis em cenários reais.
- Grafana ML: Machine Learning para anomalias — Plugin oficial que integra modelos preditivos para detecção automática de anomalias.
- Best practices for alerting on dynamic thresholds — Guia de boas práticas da Prometheus sobre configuração e calibração de thresholds dinâmicos.
- Configuração de contact points no Grafana — Documentação oficial sobre integração com Slack, PagerDuty, e-mail e webhooks.