Como detetar anomalias em Real-Time Analytics: passo a passo
Aprende a detetar anomalias em Real-Time Analytics aplicando uma técnica simples de z-score sobre janelas temporais. Detetar anomalias em Real-Time Analytics é útil para identificar falhas, picos de tráfego ou comportamento suspeito de imediato e disparar alertas.
Pré-requisitos
- Conta e acesso a uma plataforma que suporte consultas em tempo real (por exemplo, Azure Data Explorer / Kusto ou similar).
- Stream de dados com timestamp e uma métrica numérica (ex.: latency, cpu, requests).
- Noções básicas de KQL (Kusto Query Language) ou SQL de streaming.
Passo 1: Entender por que usar z-score em Real-Time Analytics
O z-score normaliza valores em relação à média e ao desvio padrão da janela. Serve para detetar valores que se afastam muito do comportamento normal. Em Real-Time Analytics é simples, eficiente e fácil de interpretar: valores com z-score acima de um limiar (ex.: 3) são considerados anómalos.
Passo 2: Agregar a métrica por janelas temporais
Primeiro, calcula-se a média e o desvio padrão numa janela deslizante (ex.: 5 minutos) para ter contexto temporal. Em KQL usa-se bin() com summarize por sliding_window ou make-series; aqui mostramos um exemplo com summarize por 1 minuto e um windowing simples.
// Exemplo KQL: agregação por 1 minuto
let WindowSize = 1m;
StreamingTable
| where Timestamp >= ago(30m)
| summarize avg_value = avg(MetricValue), stdev_value = stdev(MetricValue), count = count() by bin(Timestamp, WindowSize)
| order by Timestamp asc
Passo 3: Calcular o z-score para cada ponto em tempo real
Para cada evento ou valor agregado, calcula-se z = (valor - média) / desvio. Se estiveres a processar evento a evento, junta ao contexto da janela correspondente. Usando as agregações do passo anterior, aplica a fórmula.
// Exemplo KQL: calcular z-score por janela
let WindowSize = 1m;
let Threshold = 3.0;
StreamingTable
| where Timestamp >= ago(30m)
| summarize avg_value = avg(MetricValue), stdev_value = stdev(MetricValue), last_value = max(MetricValue) by bin(Timestamp, WindowSize)
| extend z_score = iff(stdev_value == 0, 0.0, (last_value - avg_value) / stdev_value)
| extend is_anomaly = abs(z_score) > Threshold
| order by Timestamp asc
Passo 4: Tratar janelas com poucos dados e evitar falsos positivos
Se a janela tiver poucos eventos, a média e o desvio não são fiáveis. Define um mínimo de count e ignora janelas pequenas. Também podes suavizar a média usando EWMA para reduzir a sensibilidade ao ruído.
// Exemplo KQL: ignorar janelas com poucos pontos
let WindowSize = 1m;
let MinCount = 5;
let Threshold = 3.0;
StreamingTable
| where Timestamp >= ago(30m)
| summarize avg_value = avg(MetricValue), stdev_value = stdev(MetricValue), cnt = count(), last_value = max(MetricValue) by bin(Timestamp, WindowSize)
| where cnt >= MinCount
| extend z_score = (last_value - avg_value) / stdev_value
| extend is_anomaly = abs(z_score) > Threshold
| order by Timestamp asc
Passo 5: Gerar alertas em tempo real
Quando is_anomaly é true, cria uma ação: regista numa tabela de alertas, envia para um webhook ou para um sistema de notificação. Muitos sistemas de Real-Time Analytics permitem ligar uma query a um alerta. Guarda informações úteis: Timestamp, valor, z_score, janela.
// Exemplo KQL: resultados de anomalia para exportar
let WindowSize = 1m;
let MinCount = 5;
let Threshold = 3.0;
StreamingTable
| where Timestamp >= ago(30m)
| summarize avg_value = avg(MetricValue), stdev_value = stdev(MetricValue), cnt = count(), last_value = max(MetricValue) by bin(Timestamp, WindowSize)
| where cnt >= MinCount
| extend z_score = (last_value - avg_value) / stdev_value
| where abs(z_score) > Threshold
| project AlertTime = Timestamp, Value = last_value, z_score, cnt, avg_value
Verificar o resultado
Confirma que tens linhas com is_anomaly = true ou que a query de alertas retorna eventos. Valida manualmente alguns eventos: compara o valor e o contexto (média e stdev) para garantir que são de facto anomalias. Verifica também janelas com cnt < MinCount para não perder casos importantes.
Conclusão
Detetar anomalias em Real-Time Analytics com z-score é uma abordagem rápida e interpretável para identificar desvios. Próximos passos: experimentar EWMA, modelos de aprendizagem automática (ex.: Isolation Forest) ou combinar múltiplas métricas para reduzir falsos positivos. Dica: começa com thresholds conservadores e ajusta com base em falsos positivos/negativos — qual é a métrica que mais te preocupa?