Como calcular taxa de eventos por segundo em Real-Time Analytics
Este tutorial mostra como calcular a taxa de eventos por segundo (EPS) em Real-Time Analytics para monitorizar sistemas e alertas. Saber o EPS ajuda a detetar picos, congestionamentos e regressões de desempenho de forma imediata.
Pré-requisitos
- Fonte de eventos em streaming (ex.: eventos enviados para um serviço como Azure Event Hubs ou Kafka).
- Armazenamento/consulta em tempo real compatível com KQL (ex.: Azure Data Explorer / Kusto) ou similar.
- Conhecimentos básicos de KQL e de janelas temporais (sliding, tumbling).
Passo 1: Escolher a janela temporal e o tipo de agregação
Decidir a granularidade: janelas de 1s/5s/1m são comuns. Para deteção rápida de picos use janelas curtas (1s-5s); para tendências use 1m ou mais. A agregação principal é a contagem de eventos por janela e, opcionalmente, média móvel para suavizar ruído.
Passo 2: Escrever a consulta base para contar eventos por janela (exemplo KQL)
Esta consulta conta eventos por janelas de 5 segundos usando bin(), e calcula a taxa por segundo dividindo pela duração da janela. Substitua EventTime e MyTable pelo nome real da coluna/tabela.
MyTable
| where EventTime >= ago(10m)
| summarize count_events = count() by bin(EventTime, 5s)
| extend eps = todouble(count_events) / 5.0
| order by EventTime asc
Passo 3: Calcular uma média móvel para reduzir ruído
Uma média móvel simples (rolling average) torna a visualização mais estável. Aqui usamos the series_fir ou simples moving_avg com prev e next para Kusto; se não estiver disponível, usa-se um self-join ou make-series. Exemplo com make-series para janelas regulares e moving_avg.
MyTable
| where EventTime >= ago(10m)
| make-series count_events = count() on EventTime in range(now(-10m), now(), 5s)
| mv-expand EventTime to typeof(datetime), count_events to typeof(long)
| extend eps = todouble(count_events) / 5.0
| serialize
| extend eps_ma = moving_avg(eps, 6) // média móvel de 6 pontos (~30s)
Passo 4: Tratar janelas vazias e normalizar
É comum ter intervalos sem eventos; assegure-se de que esses pontos aparecem com valor zero para não enviesar a média. No exemplo acima, make-series garante pontos com zero. Se usar summarize+bin, adiciona-se um range contínuo e faz-se left-join.
// alternativa usando summarize+bin e fill de zeros
let times = range t from ago(10m) to now() step 5s;
let counts = MyTable
| where EventTime >= ago(10m)
| summarize c = count() by bin(EventTime, 5s);
times
| join kind=leftouter (counts) on $left.t == $right.EventTime
| extend count_events = coalesce(c, 0)
| extend eps = todouble(count_events) / 5.0
Passo 5: Calcular thresholds e detetar anomalias simples
Defina thresholds estáticos (ex.: eps > 100) ou dinâmicos usando média + k*desvio. Exemplo dinâmico com desvio padrão para assinalar picos.
// calcula média e stdev sobre os últimos 10m e marca picos
let series = (
MyTable
| where EventTime >= ago(10m)
| make-series count_events = count() on EventTime in range(now(-10m), now(), 5s)
| mv-expand EventTime to typeof(datetime), count_events to typeof(long)
| extend eps = todouble(count_events) / 5.0
);
let stats = series | summarize mu = avg(eps), sigma = stdev(eps);
series
| extend mu = toscalar(stats.mu), sigma = toscalar(stats.sigma)
| extend is_spike = eps > mu + 3.0 * sigma
Verificar o resultado
Crie um dashboard/visualização com duas séries: eps e eps_ma (média móvel). Verifique que pontos com is_spike=true coincidem com picos visíveis. Confirme também que períodos sem eventos mostram eps=0. Teste com dados sintéticos: injete eventos a alta taxa para ver picos detetados.
Conclusão
Calcular a taxa de eventos por segundo (EPS) em Real-Time Analytics permite monitorizar desempenho e disparar alertas. Próximos passos: integrar esta consulta num pipeline de alertas (ex.: regras de alerta que disparem quando is_spike=true) ou correlacionar EPS com métricas de infraestruturas. Dica: experimente ajustar a duração da janela e o tamanho da média móvel para equilibrar sensibilidade e ruído.