O Simple Log Service oferece suporte à análise multidimensional de logs de acesso do Nginx. Este tópico aborda a análise de tráfego do site, o diagnóstico de latência e a configuração de alertas com consultas de exemplo.
Pré-requisitos
Os logs de acesso do Nginx foram coletados. Coletar logs de texto usando o modo de configuração do Nginx.
O assistente de importação de dados gera automaticamente um índice com base nos campos de log. Se necessário, modifique o índice seguindo as instruções em Criar um índice.
Visão geral
Os logs do Nginx são essenciais para a operação de sites. Abordagens tradicionais, como o CNZZ, exigem a injeção de JavaScript no frontend, enquanto a computação em stream ou offline requer uma infraestrutura complexa e sacrifica o desempenho em tempo real ou a flexibilidade analítica.
O Simple Log Service coleta logs do Nginx por meio do assistente de importação de dados e cria automaticamente um índice e um painel. O painel nginx_Nginx access log exibe a distribuição de IPs de origem, status das requisições, user agents, tendências de PV/UV, estatísticas de tráfego, principais referrers e URLs mais acessadas. Com consultas personalizadas, visualize a latência e configure alertas contra erros ou anomalias de tráfego.
Analisar o tráfego do site
Faça login no console do Simple Log Service.
-
Na seção Projects, clique em um projeto desejado.

No painel de navegação à esquerda, escolha . clique em > à esquerda do Logstore desejado.
-
Em Dashboard, clique em nginx_Nginx access log.
O painel nginx_Nginx access log inclui os seguintes gráficos:
-
O gráfico Distribution of source IP addresses apresenta a distribuição geográfica dos IPs de requisição no último dia. Consulta:
* | select count(1) as c, ip_to_province(remote_addr) as address group by address limit 100 -
Já o gráfico Distribution of request statuses exibe a porcentagem de cada código de status HTTP no último dia. Consulta:
* | select count(1) as pv, status group by status
-
Para métodos de requisição, o gráfico Distribution of request methods indica a porcentagem de cada método no último dia. Consulta:
* | select count(1) as pv ,request_method group by request_method
-
O gráfico Distribution of user agents detalha a porcentagem de diferentes navegadores no último dia. Consulta:
* | select count(1) as pv, case when http_user_agent like '%Chrome%' then 'Chrome' when http_user_agent like '%Firefox%' then 'Firefox' when http_user_agent like '%Safari%' then 'Safari' else 'unKnown' end as http_user_agent group by case when http_user_agent like '%Chrome%' then 'Chrome' when http_user_agent like '%Firefox%' then 'Firefox' when http_user_agent like '%Safari%' then 'Safari' else 'unKnown' end order by pv desc limit 10
-
As 10 principais páginas de referência por PV no último dia são destacadas no gráfico Top 10 referrers. Consulta:
* | select count(1) as pv , http_referer group by http_referer order by pv desc limit 10
-
O tráfego de entrada e saída no último dia é apresentado no gráfico Inbound and outbound traffic statistics. Consulta:
* | select sum(body_bytes_sent) as net_out, sum(request_length) as net_in ,date_format(date_trunc('hour', __time__), '%m-%d %H:%i') as time group by date_format(date_trunc('hour', __time__), '%m-%d %H:%i') order by time limit 10000
-
O gráfico PV/UV statistics exibe as contagens de PV e UV no último dia. Consulta:
*| select approx_distinct(remote_addr) as uv ,count(1) as pv , date_format(date_trunc('hour', __time__), '%m-%d %H:%i') as time group by date_format(date_trunc('hour', __time__), '%m-%d %H:%i') order by time limit 1000
-
Para previsões, o gráfico PV forecast estima o PV para as próximas 4 horas. Consulta:
* | select ts_predicate_simple(stamp, value, 6, 1, 'sum') from (select __time__ - __time__ % 60 as stamp, COUNT(1) as value from log GROUP BY stamp order by stamp) LIMIT 1000
-
Por fim, o gráfico Top 10 accessed URLs lista as 10 URLs mais requisitadas por PV no último dia. Consulta:
* | select count(1) as pv, split_part(request_uri,'?',1) as path group by path order by pv desc limit 10
-
Diagnosticar e otimizar o desempenho do site
Monitore a latência das requisições para identificar páginas lentas. Use consultas personalizadas para analisar padrões de latência. Para saber mais sobre a sintaxe de consulta, consulte Guia de início rápido para pesquisa e análise.
-
Calcule a latência média e máxima das requisições a cada 5 minutos para compreender as tendências gerais de latência.
* | select from_unixtime(__time__ -__time__% 300) as time, avg(request_time) as avg_latency , max(request_time) as max_latency group by __time__ -__time__% 300 -
Identifique as páginas com maior latência para priorizar a otimização.
* | select from_unixtime(__time__ - __time__% 60) , max_by(request_uri,request_time) group by __time__ - __time__%60 -
Agrupe os valores de latência em 10 intervalos para analisar a distribuição.
* |select numeric_histogram(10,request_time) -
Obtenha os 10 maiores valores de latência e suas respectivas requisições.
* | select max(request_time,10) -
Otimize a página com maior latência.
Por exemplo, se /url2 tiver a maior latência, otimize a página /url2 calculando seu PV, UV, métodos de requisição, códigos de status, navegadores, latência média e latência máxima para /url2.
request_uri:"/url2" | select count(1) as pv, approx_distinct(remote_addr) as uv, histogram(method) as method_pv, histogram(status) as status_pv, histogram(user_agent) as user_agent_pv, avg(request_time) as avg_latency, max(request_time) as max_latency -
Compare as visualizações de página (PV) de hoje com o PV de ontem (Debug).
* | select diff [1] as today, round((diff [3] -1.0) * 100, 2) as growth FROM ( SELECT compare(pv, 86400) as diff FROM ( SELECT COUNT(1) as pv FROM log ) ) -
Calcule a variação diária nas visualizações de página (PVs).
* | select t, diff [1] as today, diff [2] as yestoday, diff [3] as percentage from( select t, compare(pv, 86400) as diff from ( select count(1) as pv, date_format(from_unixtime(__time__), '%H:%i') as t from log group by t limit 10000 ) group by t order by t limit 10000 )
Configurar alertas
Configure alertas para picos de latência, erros de servidor e anomalias de tráfego. Para o procedimento completo, consulte Configurar um alerta.
-
Alerta de erro
Monitore as respostas 500 (erro de servidor). A consulta a seguir conta os erros (c) por unidade de tempo. Defina a condição de acionamento do alerta como c > 0.
status:500 | select count(1) as cNotaPara serviços de alto tráfego em que erros 500 ocasionais são esperados, defina o Notification Trigger Threshold como 2. Isso aciona um alerta apenas quando a condição é atendida em duas verificações consecutivas.
Na caixa de diálogo de criação de alerta, defina Alert Name como
Error Alert. Para Add to Dashboard, selecione crie e especifique o nome do painel comoNginx. Defina Chart Name comoError Alert, Query Interval como 1 Day (On the Hour) e Check Frequency como um Fixed Interval de 15 Minutes. Por fim, defina Notification Interval como 5 Minutes. -
Alerta de desempenho
Crie um alerta de latência. A consulta a seguir calcula a latência média de todas as requisições
Postpara o endpoint/adduser. Defina a condição de acionamento como l > 300000 para alertar quando a latência média exceder 300 ms.Method:Post and URL:"/adduser" | select avg(request_time) as lAlertas baseados em média podem mascarar requisições individuais com alta latência. Em vez disso, use um percentil (como P99) como condição de acionamento. A consulta a seguir calcula a latência do 99º percentil.
Method:Post and URL:"/adduser" | select approx_percentile(request_time, 0.99) as p99Para monitoramento, calcule a latência média, P50 e P99 por minuto em uma janela de um dia (1.440 minutos).
* | select avg(request_time) as l, approx_percentile(request_time, 0.5) as p50, approx_percentile(request_time, 0.99) as p99, date_trunc('minute', time) as t group by t order by t desc limit 1440
-
Alerta de pico ou queda de tráfego
Quedas ou picos repentinos de tráfego geralmente são anormais. Detecte anomalias comparando o tráfego atual com uma das seguintes linhas de base:
A janela de tempo anterior.
A mesma janela de tempo no dia anterior.
A mesma janela de tempo na semana anterior.
O exemplo a seguir usa o primeiro método para calcular a taxa de variação em um intervalo de consulta de 5 minutos.
-
Defina uma janela de cálculo.
Defina uma janela de 1 minuto para calcular o tráfego por minuto.
* | select sum(inflow)/(max(__time__)-min(__time__)) as inflow , __time__-__time__%60 as window_time from log group by window_time order by window_time limit 15O resultado contém duas colunas:
window_timeeinflow. A colunainflowmostra o valor de tráfego para cada janela de 1 minuto. -
Calcule a diferença dentro da janela.
-
Calcule a proporção do valor máximo ou mínimo em relação ao valor médio. Este exemplo usa a proporção máxima (max_ratio).
Neste exemplo,
max_ratioé 1,02. Defina a condição de alerta como max_ratio > 1.5 (taxa de variação superior a 50%) para acionar um alerta.* | select max(inflow)/avg(inflow) as max_ratio from (select sum(inflow)/(max(__time__)-min(__time__)) as inflow , __time__-__time__%60 as window_time from log group by window_time order by window_time limit 15) -
Calcule a taxa de variação do valor mais recente para verificar se o tráfego está flutuando ou se voltou ao normal.
Use a função max_by para obter o tráfego máximo na janela. Um
latest_ratiode 0,97 significa que o tráfego mais recente é 97% da média.* | select max_by(inflow, window_time)/1.0/avg(inflow) as latest_ratio from (select sum(inflow)/(max(__time__)-min(__time__)) as inflow , __time__-__time__%60 as window_time from log group by window_time order by window_time limit 15)NotaO resultado da função max_by é do tipo string e você deve convertê-lo para um tipo numérico. Se quiser calcular a taxa de variação relativa, use (1,0-max_by(inflow, window_time)/1,0/avg(inflow)) as latest_ratio.
-
Calcule a volatilidade, que é a variação entre o valor da janela atual e o da janela anterior.
Use a função de janela
lagpara calcular a diferença entre o tráfego atual inflow e o inflow "lag(inflow, 1, inflow)over() " do período anterior, dividida pelo inflow atual. Uma queda significativa (como às 11:39) mostra uma taxa de variação superior a 40%.NotaUse a função abs para calcular uma taxa de variação absoluta.
* | select (inflow- lag(inflow, 1, inflow)over() )*1.0/inflow as diff, from_unixtime(window_time) from (select sum(inflow)/(max(__time__)-min(__time__)) as inflow , __time__-__time__%60 as window_time from log group by window_time order by window_time limit 15)
-