Pular para conteúdo

graphite: Um módulo NGINX para coletar estatísticas no Graphite

Instalação

Você pode instalar este módulo em qualquer distribuição baseada em RHEL, incluindo, mas não se limitando a:

  • RedHat Enterprise Linux 7, 8, 9 e 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 e Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-graphite
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-graphite

Ative o módulo adicionando o seguinte no topo de /etc/nginx/nginx.conf:

load_module modules/ngx_http_graphite_module.so;

Este documento descreve o nginx-module-graphite v4.3 lançado em 20 de janeiro de 2023.


Um módulo nginx para coletar estatísticas de localização no Graphite.

Recursos

  • Agregação de métricas de localização, servidor ou http
  • Cálculo de percentis
  • Envio de dados para o Graphite via UDP ou TCP de forma não bloqueante
  • Envio de métricas personalizadas do Lua

Sinopse

http {
    graphite_config prefix=playground server=127.0.0.1;
    server {
        location /foo/ {
            graphite_data nginx.foo;
        }
    }
}

Descrição

Este módulo utiliza um segmento de memória compartilhada para coletar estatísticas agregadas de todos os workers e enviar os valores calculados do último minuto para o Graphite a cada 60 segundos (padrão) via UDP ou TCP de forma não bloqueante. A agregação de estatísticas é feita em tempo real em um buffer de tamanho fixo alocado na inicialização do servidor e não afeta o desempenho do servidor.

Este módulo está em uso ativo nos Mail.Ru Sites (um dos maiores serviços web na Rússia) há cerca de um ano e é considerado estável e bem testado.

Para coletar métricas dos módulos principais do nginx (ssl, gzip, upstream), um pequeno patch deve ser aplicado na árvore de código-fonte do nginx. Veja as instruções de instalação. Você pode compilar este módulo como um módulo dinâmico, mas então não será capaz de coletar métricas dos módulos principais do nginx (ssl, gzip, upstream) e funções do Lua.

Diretrizes

graphite_config

sintaxe: graphite_config key1=<value1> key2=<value2> ... keyN=<valueN>

contexto: http

Especifique configurações globais para toda a instância do servidor.

Parâmetro Obrigatório Padrão Descrição
prefixo prefixo de caminho para todos os gráficos
host gethostname() nome do host para todos os gráficos
servidor Sim endereço IP do servidor carbon-cache
protocolo udp protocolo do servidor carbon-cache (udp ou tcp)
porta 2003 porta do servidor carbon-cache
frequência 60 com que frequência enviar valores para o Graphite (segundos)
intervalos 1m intervalos de agregação, lista de intervalos de tempo, separador de barra vertical (m - minutos)
parâmetros * limite a lista de métricas a serem rastreadas, separador de barra vertical
compartilhado 2m tamanho da memória compartilhada, aumentar em caso de erro memória compartilhada muito pequena
buffer 64k tamanho do buffer de rede, aumentar em caso de erro tamanho do buffer muito pequeno
pacote 1400 tamanho máximo do pacote UDP
modelo modelo para o nome do gráfico (o padrão é $prefix.$host.$split.$param_$interval)
error_log sufixo do caminho para gráficos de logs de erro (*)

(*): funciona apenas quando o nginx_error_log_limiting*.patch é aplicado ao código-fonte do nginx

Exemplo (padrão):

http {
    graphite_config prefix=playground server=127.0.0.1;
}

Exemplo (personalizado):

http {
    graphite_config prefix=playground server=127.0.0.1 intervals=1m|5m|15m params=rps|request_time|upstream_time template=$prefix.$host.$split.$param_$interval;
}

Exemplo (error_log):

http {
    graphite_config prefix=playground server=127.0.0.1 error_log=log;
}

graphite_default_data

sintaxe: graphite_default_data <path prefix> [params=<params>] [if=<condition>]

contexto: http, server

Crie um ponto de medição em todas as localizações aninhadas. Você pode usar as variáveis "$location" ou "$server", que representam o nome da localização atual e o nome do servidor atual, com todos os caracteres não alfanuméricos substituídos por "_." Os "_" iniciais e finais são removidos.

Exemplo:

   graphite_default_data nginx.$location;

   location /foo/ {
   }

   location /bar/ {
   }

Os dados para /foo/ serão enviados para nginx.foo, os dados para /bar/ - para nginx.bar. O parâmetro <params> (1.3.0) especifica a lista de parâmetros a serem coletados para todas as localizações aninhadas. Para adicionar todos os parâmetros padrão, use *. O parâmetro <if> (1.1.0) habilita o registro condicional. Uma solicitação não será registrada se a condição avaliar para "0" ou uma string vazia.

Exemplo (com $server):

    graphite_default_data nginx.$server.$location

    server {
        server_name foo_host;

        location /foo/ {
        }
    }

    server {
        server_name bar_host;

        location /bar/ {
        }
    }

Os dados para /foo/ serão enviados para nginx.foo_host.foo, os dados para /bar/ - para nginx.bar_host.bar.

graphite_data

sintaxe: graphite_data <path prefix> [params=<params>] [if=<condition>]

contexto: http, server, location, if

Crie um ponto de medição em uma localização específica.

Exemplo:

    location /foo/ {
        graphite_data nginx.foo;
    }

O parâmetro <params> (1.3.0) especifica a lista de parâmetros a serem coletados para esta localização. Para adicionar todos os parâmetros padrão, use *. O parâmetro <if> (1.1.0) habilita o registro condicional. Uma solicitação não será registrada se a condição avaliar para "0" ou uma string vazia.

Exemplo:

    map $scheme $is_http { http 1; }
    map $scheme $is_https { https 1; }

    ...

    location /bar/ {
        graphite_data nginx.all.bar;
        graphite_data nginx.http.bar if=$is_http;
        graphite_data nginx.https.bar if=$is_https;
        graphite_data nginx.arg params=rps|request_time;
        graphite_data nginx.ext params=*|rps|request_time;
    }

graphite_param

sintaxe: graphite_param name=<path> interval=<time value> aggregate=<func>

contexto: location

Parâmetro Obrigatório Descrição
name Sim prefixo de caminho para todos os gráficos
interval Sim* intervalo de agregação, formato do valor do intervalo de tempo (m - minutos)
aggregate Sim* função de agregação sobre os valores
percentile Sim* nível de percentil

funções de agregação

func Descrição
sum soma dos valores por intervalo
persec soma dos valores por segundo (sum dividido pelos segundos no interval)
avg valor médio no intervalo
gauge valor de medição

Exemplo: veja abaixo.

Nginx API para Lua

sintaxe: ngx.graphite.param(<name>)

Obtenha um link para um nome de parâmetro graphite, para usá-lo no lugar do nome para as funções abaixo. O link é válido até o recarregamento do nginx. Após obter o link de um parâmetro, você ainda pode passar o nome do parâmetro para as funções abaixo. Você pode obter o link de um parâmetro várias vezes, sempre receberá o mesmo objeto pelo mesmo nome (um lightuserdata). A função retorna false se o parâmetro especificado pelo nome não existir. A função retorna nil em caso de erros ao obter o link. As funções acessam informações dos parâmetros por link mais rapidamente do que por nome.

Disponível após aplicar o patch ao lua-nginx-module. O recurso está presente no patch para o módulo lua v0.10.12. Veja as instruções de instalação.

sintaxe: ngx.graphite(<name_or_link>,<value>[,<config>])

Escreva o valor da estatística na função agregadora. Números de ponto flutuante são aceitos em value.

Disponível após aplicar o patch ao lua-nginx-module. Veja as instruções de instalação.

ngx.graphite(name, value, config)

Exemplo:

location /foo/ {
    graphite_param name=lua.foo_sum aggregate=sum interval=1m;
    graphite_param name=lua.foo_rps aggregate=persec interval=1m;
    graphite_param name=lua.foo_avg aggregate=avg interval=1m;
    graphite_param name=lua.foo_gauge aggregate=gauge;

    content_by_lua '
        ngx.graphite("lua.foo_sum", 0.01)
        ngx.graphite("lua.foo_rps", 1)
        ngx.graphite("lua.foo_avg", ngx.var.request_uri:len())
        local foo_gauge_link = ngx.graphite.param("lua.foo_gauge")
        ngx.graphite(foo_gauge_link, 10)
        ngx.graphite(foo_gauge_link, -2)
        ngx.graphite("lua.auto_rps", 1, "aggregate=persec interval=1m percentile=50|90|99")
        ngx.say("hello")
    ';
}

Você deve especificar o comando graphite_param ou passar o argumento config. Se você escolher a segunda opção, os dados para este gráfico não serão enviados até a primeira chamada para ngx.graphite.

Aviso: Se você não declarar o gráfico usando o comando graphite_param, a memória para o gráfico será alocada dinamicamente na memória compartilhada do módulo. Se a memória compartilhada do módulo se esgotar enquanto o nginx estiver em execução, novos gráficos não serão criados e uma mensagem de erro será registrada.

sintaxe: ngx.graphite.get(<name_or_link>)

Obtenha o valor do parâmetro gauge com o name_or_link especificado.

sintaxe: ngx.graphite.set(<name>,<value>)

Defina value para o parâmetro gauge com o name_or_link especificado.

Parâmetros

Parâmetro Unidades Função Descrição
request_time ms avg tempo total gasto no atendimento da solicitação
bytes_sent bytes avg comprimento da resposta http
body_bytes_sent bytes avg comprimento do corpo da resposta http
request_length bytes avg comprimento da solicitação http
ssl_handshake_time ms avg tempo gasto na handshake ssl
ssl_cache_usage % last quanto do cache SSL foi usado
content_time ms avg tempo gasto gerando conteúdo dentro do nginx
gzip_time ms avg tempo gasto comprimindo conteúdo on-the-fly
upstream_time ms avg tempo gasto conversando com upstream
upstream_connect_time ms avg tempo gasto na conexão upstream (nginx >= 1.9.1)
upstream_header_time ms avg tempo gasto no cabeçalho upstream (nginx >= 1.9.1)
rps rps sum número total de solicitações por segundo
keepalive_rps rps sum número de solicitações enviadas através de uma conexão keepalive previamente aberta
response_2xx_rps rps sum número total de respostas com código 2xx
response_3xx_rps rps sum número total de respostas com código 3xx
response_4xx_rps rps sum número total de respostas com código 4xx
response_5xx_rps rps sum número total de respostas com código 5xx
response_[0-9]{3}_rps rps sum número total de respostas com o código dado
upstream_cache_(miss bypass expired stale
lua_time ms avg tempo gasto no código lua

Percentis

Para calcular o valor do percentil para qualquer parâmetro, defina o nível do percentil via /. Exemplo: request_time/50|request_time/90|request_time/99.

patch para adicionar API para enviar métricas do código lua (opcional)

patch -p1 < /path/to/graphite-nginx-module/lua_module_v0_9_11.patch cd ..

wget 'http://nginx.org/download/nginx-1.9.2.tar.gz' tar -xzf nginx-1.9.2.tar.gz cd nginx-1.9.2/

GitHub

Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório GitHub do nginx-module-graphite.