Este tópico descreve como usar o OpenTelemetry para analisar rastreamento no NGINX. O NGINX é um servidor web e proxy reverso open-source, leve e de alto desempenho, cuja funcionalidade pode ser estendida por módulos. O ngx_otel_module coleta rastros do NGINX e os encaminha para o Managed Service for OpenTelemetry.
Limitações
O ngx_otel_module reporta dados de rastro do NGINX apenas via gRPC e não oferece suporte ao envio desses dados via HTTP.
-
Notas de versão do ngx_otel_module:
V0.1.2 ou posterior: Encaminhe diretamente os rastros do NGINX para o Managed Service for OpenTelemetry.
V0.1.1 ou anterior: O ngx_otel_module não oferece suporte à definição de tokens de autenticação gRPC. Portanto, você deve implantar um OpenTelemetry Collector para encaminhar rastros do NGINX ao Managed Service for OpenTelemetry.
Pré-requisitos
Procedimento
Etapa 1: Baixe o ngx_otel_module
Method 1: Use the package manager
-
Baixe o ngx_otel_module para Alibaba Cloud Linux, Red Hat Linux, Red Hat Enterprise Linux ou derivados:
sudo yum install nginx-module-otel -
Para Debian, Ubuntu ou derivados, use o seguinte comando para baixar o ngx_otel_module:
sudo apt install nginx-module-otel
Method 2: Use the pre-built docker image
O NGINX V1.27.5 e versões posteriores usam o ngx_otel_module V0.1.2 por padrão.
Acesse o site oficial do docker, pesquise e baixe as imagens do NGINX com o sufixo -otel, como nginx:1.23.3-otel, e implante o service seguindo o procedimento padrão para iniciar um container docker.
Supported tags and respective Dockerfile links
- 1.27.4, mainline, 1, 1.27, latest, 1.27.4-bookworm, mainline-bookworm, 1-bookworm, 1.27-bookworm, bookworm
- 1.27.4-perl, mainline-perl, 1-perl, 1.27-perl, perl, 1.27.4-bookworm-perl, mainline-bookworm-perl, 1-bookworm-perl, 1.27-bookworm-perl, bookworm-perl
- 1.27.4-otel, mainline-otel, 1-otel, 1.27-otel, otel, 1.27.4-bookworm-otel, mainline-bookworm-otel, 1-bookworm-otel, 1.27-bookworm-otel, bookworm-otel
- 1.27.4-alpine, mainline-alpine, 1-alpine, 1.27-alpine, alpine, 1.27.4-alpine3.21, mainline-alpine3.21, 1-alpine3.21, 1.27-alpine3.21, alpine3.21
- 1.27.4-alpine-perl, mainline-alpine-perl, 1-alpine-perl, 1.27-alpine-perl, alpine-perl, 1.27.4-alpine3.21-perl, mainline-alpine3.21-perl, 1-alpine3.21-perl, 1.27-alpine3.21-perl, alpine3.21-perl
- 1.27.4-alpine-slim, mainline-alpine-slim, 1-alpine-slim, 1.27-alpine-slim, alpine-slim, 1.27.4-alpine3.21-slim, mainline-alpine3.21-slim, 1-alpine3.21-slim, 1.27-alpine3.21-slim, alpine3.21-slim
Etapa 2: Ative o ngx_otel_module
Para habilitar a análise de rastreamento no NGINX, carregue o ngx_otel_module e configure seus parâmetros no arquivo de configuração principal /etc/nginx/nginx.conf do NGINX. Para mais informações sobre os parâmetros do ngx_otel_module, consulte a documentação oficial do ngx_otel_module.
-
Ative a análise de rastreamento para todas as requisições HTTP
ngx_otel_module V0.1.2 or later
load_module modules/ngx_otel_module.so; # Load ngx_otel_module ... http { ... otel_exporter { endpoint "${GRPC_ENDPOINT}"; # The gRPC endpoint obtained in the prerequisites. header Authentication "${GRPC_TOKEN}"; # The authentication token obtained in the prerequisites. } otel_trace on; # Enable Tracing Analysis. otel_service_name ${SERVICE_NAME}; # The application name. otel_trace_context propagate; # Inject the trace context into downstream services. ... }ngx_otel_module V0.1.1 or earlier
NotaSubstitua as seguintes variáveis na configuração:
${OTEL_COLLECTOR_GRPC_RECEIVER_ENDPOINT}: O endpoint gRPC do OpenTelemetry Collector implantado, por exemplo,localhost:4317. Este endpoint difere daquele obtido nos pré-requisitos do Managed Service for OpenTelemetry.${SERVICE_NAME}: O nome da aplicação. Este nome aparece como o nome da aplicação NGINX no console do Managed Service for OpenTelemetry.
load_module modules/ngx_otel_module.so; # Load the ngx_otel_module. ... http { ... otel_exporter { endpoint ${OTEL_COLLECTOR_GRPC_RECEIVER_ENDPOINT}; # The reporting address of the OpenTelemetry Collector, such as localhost:4317. } otel_trace on; # Enable Tracing Analysis. otel_service_name ${SERVICE_NAME}; # The application name. otel_trace_context propagate; # Inject the trace context into downstream services. ... } -
Habilite a análise de rastreamento para requisições HTTP enviadas a uma única localização
ngx_otel_module V0.1.2 or later
load_module modules/ngx_otel_module.so; # Load the ngx_otel_module. ... http { otel_exporter { endpoint "${GRPC_ENDPOINT}"; # The gRPC endpoint obtained in the prerequisites. header Authentication "${GRPC_TOKEN}"; # The authentication token obtained in the prerequisites. } server { listen 127.0.0.1:80; location /hello { otel_trace on; # Enable Tracing Analysis only for 127.0.0.1:80/hello. otel_service_name ${SERVICE_NAME} # The application name. otel_trace_context propagate; # Inject the trace context into downstream services. ... } } }ngx_otel_module V0.1.1 or earlier
NotaSubstitua as duas variáveis na configuração:
${OTEL_COLLECTOR_GRPC_RECEIVER_ENDPOINT}: O endpoint gRPC do OpenTelemetry Collector implantado, por exemplo,localhost:4317. Este endpoint difere daquele obtido nos pré-requisitos do Managed Service for OpenTelemetry.${SERVICE_NAME}: O nome da aplicação. Este nome aparece como o nome da aplicação NGINX no console do Managed Service for OpenTelemetry.
load_module modules/ngx_otel_module.so; # Load the ngx_otel_module. ... http { otel_exporter { endpoint ${OTEL_COLLECTOR_GRPC_RECEIVER_ENDPOINT}; # The reporting address of the OpenTelemetry Collector, for example, localhost:4317. } server { listen 127.0.0.1:80; location /hello { otel_trace on; # Enable Tracing Analysis only for 127.0.0.1:80/hello. otel_service_name ${SERVICE_NAME} # The application name. otel_trace_context propagate; # Inject the trace context into downstream services. ... } } }
Etapa 3: (Opcional) Implantar um OpenTelemetry Collector
Esta etapa é necessária apenas para o ngx_otel_module V0.1.1 ou anterior.
Method 1: Installation in the ACK console
Faça login no console do ACK. No painel de navegação à esquerda, clique em .
Na página exibida, localize e clique em
opentelemetry-collector. No painel aberto, clique em Deploy no canto superior direito.No painel Deploy, selecione o cluster de destino e clique em Next.
-
Na etapa Parameters, adicione os seguintes parâmetros e clique em OK.
NotaSubstitua
${GRPC_ENDPOINT}e${GRPC_ENDPOINT_TOKEN}pelo endpoint gRPC e token de autenticação obtidos em Prerequisites.receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 exporters: otlp: endpoint: ${GRPC_ENDPOINT} tls: insecure: true headers: "Authentication": "${GRPC_ENDPOINT_TOKEN}" processors: batch: service: pipelines: traces: receivers: [otlp] processors: [batch] exporters: [otlp]
Method 2: Manual installation
O exemplo a seguir mostra como implantar o OpenTelemetry Collector usando docker. Para mais detalhes, consulte Install the Collector.
-
Crie um arquivo chamado
opentelemetry-config.yamle copie o conteúdo abaixo para ele.Este arquivo define e configura os comportamentos e recursos do OpenTelemetry Collector, incluindo a forma de receber, processar e exportar dados.
NotaSubstitua
${GRPC_ENDPOINT}e${GRPC_ENDPOINT_TOKEN}pelo endpoint gRPC e token de autenticação obtidos na seção Prerequisites deste tópico.receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 exporters: otlp: endpoint: ${GRPC_ENDPOINT} tls: insecure: true headers: "Authentication": "${GRPC_ENDPOINT_TOKEN}" processors: batch: service: pipelines: traces: receivers: [otlp] processors: [batch] exporters: [otlp] -
Execute o comando a seguir para iniciar o OpenTelemetry Collector:
docker run -v $(pwd)/opentelemetry-config.yaml:/etc/otelcol-contrib/config.yaml otel/opentelemetry-collector-contrib:0.105.0
Etapa 4: Visualize rastros do NGINX
Após concluir as etapas anteriores e reiniciar o NGINX, envie requisições ao NGINX para gerar rastros. Em seguida, faça login no console do Managed Service for OpenTelemetry para visualizar os rastros do NGINX gerados pelo OpenTelemetry.
Na página Applications, localize a aplicação NGINX e clique no nome dela.
Na aba Trace details, visualize os detalhes do rastro, incluindo duração da requisição, endereço IP do cliente e código de status HTTP. Se o service de backend também estiver conectado ao Managed Service for OpenTelemetry, os rastros do NGINX e dos services de backend serão associados automaticamente para fornecer uma visão integrada. Na página Trace details, o gráfico em cascata de spans mostra o rastro completo de uma requisição que passa pelo nginx e pelo service de backend Node.js (ot-node-demo). O nginx recebe primeiro a requisição
/hello(duração total de 6 ms, HTTP 200) e depois a encaminha paraGET /hellono ot-node-demo (5,76 ms), que contém três spans internos:middleware-query,middleware-expressIniterequest handler-/hello. O painel Span details à direita exibe os atributos da aplicação nginx, incluindohttp.status_code=200,http.route=/helloehttp.user_agent=curl/7.61.1.
Exemplo
O exemplo a seguir demonstra como coletar dados de rastro do NGINX e de um service de backend e reportá-los ao Managed Service for OpenTelemetry.
Etapa 1: Preparar o ambiente
Instale Git, docker e docker Compose.
Etapa 2: Crie diretórios do projeto
nginx-otel-demo
│
├── docker-compose.yml # The configuration file of Docker Compose.
│
├── nginx_conf/ # The configuration files of NGINX.
│ ├── default.conf
│ └── nginx.conf
│
├── otel_conf/ # The configuration file of the OpenTelemetry Collector.
│ └── config.yaml
│
└── backend/ # The backend service developed by using Node.js.
├── Dockerfile
├── main.js
├── package.json
└── package-lock.json
Crie os diretórios.
mkdir nginx-otel-demo && cd nginx-otel-demo
mkdir -p nginx_conf otel_conf backend
Etapa 3: Crie os arquivos de configuração do NGINX
-
Crie o arquivo de configuração principal
nginx.confdo NGINX.ngx_otel_module V0.1.2 or later
cat << 'EOF' > nginx_conf/nginx.conf load_module modules/ngx_otel_module.so; user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; otel_exporter { endpoint "${GRPC_ENDPOINT}"; header Authentication "${GRPC_TOKEN}"; } otel_trace on; otel_trace_context propagate; otel_service_name nginx; include /etc/nginx/conf.d/*.conf; } EOFngx_otel_module V0.1.1 or earlier
load_module modules/ngx_otel_module.so; user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; otel_exporter { endpoint otel-collector:4317; } otel_trace on; otel_trace_context propagate; otel_service_name nginx; include /etc/nginx/conf.d/*.conf; } EOF -
Crie o arquivo de configuração
default.confdo NGINX.cat << 'EOF' > nginx_conf/default.conf server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } # Configure parameters. location /hello { proxy_pass http://backend-api:7001/hello; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } EOF
Etapa 4: (Opcional) Crie o arquivo de configuração do OpenTelemetry Collector
Esta etapa é necessária apenas para o ngx_otel_module V0.1.1 ou anterior.
Crie o arquivo de configuração do OpenTelemetry Collector. Este arquivo define os métodos para receber, processar e reportar dados.
Substitua ${GRPC_ENDPOINT} e ${GRPC_ENDPOINT_TOKEN} pelo endpoint gRPC e token de autenticação obtidos na seção Prerequisites deste tópico.
cat << 'EOF' > otel_conf/config.yaml
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
exporters:
otlp:
endpoint: ${GRPC_ENDPOINT}
tls:
insecure: true
headers:
"Authentication": "${GRPC_ENDPOINT_TOKEN}"
processors:
batch:
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlp]
EOF
Etapa 5: Crie um service de backend usando Node.js
-
Crie o arquivo package.json. Ele contém as informações de configuração do service de backend, incluindo nome, versão e dependências.
cat << 'EOF' > backend/package.json { "name": "backend", "version": "1.0.0", "main": "index.js", "scripts": {}, "keywords": [], "author": "", "license": "ISC", "description": "", "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.52.0", "axios": "^1.7.7", "express": "^4.21.1" } } EOF -
Crie o arquivo main.js, que define uma aplicação web básica em Express.
cat << 'EOF' > backend/main.js "use strict"; const axios = require("axios").default; const express = require("express"); const app = express(); app.get("/", async (req, res) => { const result = await axios.get("http://localhost:7001/hello"); return res.status(201).send(result.data); }); app.get("/hello", async (req, res) => { console.log("hello world!") res.json({ code: 200, msg: "success" }); }); app.use(express.json()); app.listen(7001, () => { console.log("Listening on http://localhost:7001"); }); EOF -
Crie o Dockerfile.
ngx_otel_module V0.1.2 or later
cat << 'EOF' > backend/Dockerfile FROM node:20.16.0 WORKDIR /app COPY package*.json ./ RUN npm install COPY . . ENV OTEL_TRACES_EXPORTER="otlp" ENV OTEL_LOGS_EXPORTER=none ENV OTEL_METRICS_EXPORTER=none ENV OTEL_EXPORTER_OTLP_TRACES_PROTOCOL=grpc ENV OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="${GRPC_ENDPOINT}" export OTEL_EXPORTER_OTLP_HEADERS=Authentication=${GRPC_TOKEN} ENV OTEL_NODE_RESOURCE_DETECTORS="env,host,os" ENV OTEL_SERVICE_NAME="ot-nodejs-demo" ENV NODE_OPTIONS="--require @opentelemetry/auto-instrumentations-node/register" EXPOSE 7001 CMD ["node", "main.js"] EOFngx_otel_module V0.1.1 or earlier
cat << 'EOF' > backend/Dockerfile FROM node:20.16.0 WORKDIR /app COPY package*.json ./ RUN npm install COPY . . ENV OTEL_TRACES_EXPORTER="otlp" ENV OTEL_LOGS_EXPORTER=none ENV OTEL_METRICS_EXPORTER=none ENV OTEL_EXPORTER_OTLP_TRACES_PROTOCOL=grpc ENV OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="http://otel-collector:4317" ENV OTEL_NODE_RESOURCE_DETECTORS="env,host,os" ENV OTEL_SERVICE_NAME="ot-nodejs-demo" ENV NODE_OPTIONS="--require @opentelemetry/auto-instrumentations-node/register" EXPOSE 7001 CMD ["node", "main.js"] EOF
Etapa 6: Crie o arquivo de configuração do docker Compose
O arquivo de configuração do docker Compose define as configurações de uma aplicação multi-container, incluindo o NGINX atuando como proxy reverso, o OpenTelemetry Collector e um service de backend em Node.js. Este arquivo também estabelece as conexões de rede e mapeamentos de portas entre os componentes.
ngx_otel_module V0.1.2 or later
cat << 'EOF' > docker-compose.yml
version: "3"
services:
nginx:
image: nginx:1.27.5-alpine-otel # The default NGINX image that contains the ngx_otel_module V0.1.2.
volumes:
- ./nginx_conf/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx_conf/default.conf:/etc/nginx/conf.d/default.conf:ro
ports:
- "80:80"
networks:
- nginx-otel-demo
backend-api:
build:
context: ./backend
dockerfile: Dockerfile
environment:
- NODE_ENV=production
ports:
- "7001:7001"
networks:
- nginx-otel-demo
networks:
nginx-otel-demo:
driver: bridge
EOF
ngx_otel_module V0.1.1 or earlier
cat << 'EOF' > docker-compose.yml
version: "3"
services:
nginx:
image: nginx:1.27.2-alpine-otel # The default NGINX image that contains the OpenTelemetry module.
volumes:
- ./nginx_conf/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx_conf/default.conf:/etc/nginx/conf.d/default.conf:ro
ports:
- "80:80"
networks:
- nginx-otel-demo
otel-collector:
image: otel/opentelemetry-collector-contrib:latest
volumes:
- ./otel_conf/config.yaml:/etc/otelcol-contrib/config.yaml # Mount the configuration file for the OpenTelemetry Collector.
ports:
- "4317:4317" # OTLP gRPC receiver
networks:
- nginx-otel-demo
backend-api:
build:
context: ./backend
dockerfile: Dockerfile
environment:
- NODE_ENV=production
ports:
- "7001:7001"
networks:
- nginx-otel-demo
networks:
nginx-otel-demo:
driver: bridge
EOF
Etapa 7: Iniciar o service
-
Execute o seguinte comando no diretório nginx-otel-demo:
docker compose up -dSaída esperada:
ngx_otel_module V0.1.2 or later
[+] Running 4/4 ✔ Network nginx-otel-demo_nginx-otel-demo Created ✔ Container nginx-otel-demo-nginx-1 Started ✔ Container nginx-otel-demo-backend-api-1 Startedngx_otel_module V0.1.1 or earlier
[+] Running 4/4 ✔ Network nginx-otel-demo_nginx-otel-demo Created ✔ Container nginx-otel-demo-nginx-1 Started ✔ Container nginx-otel-demo-backend-api-1 Started ✔ Container nginx-otel-demo-otel-collector-1 Started -
Acesse o service de backend.
curl http://localhost:80/helloSaída esperada:
{"code":200,"msg":"success"} -
Faça login no console do Managed Service for OpenTelemetry para visualizar os rastros do NGINX e do service de backend.
Neste exemplo, nginx aparece como o nome da aplicação NGINX na página Applications, e o nome do service de backend é ot-nodejs-demo.
Perguntas frequentes
-
O que fazer se eu não conseguir baixar o nginx-module-otel com a mensagem de erro "
Unable to find a match: nginx-module-otel"?Verifique se você configurou o repositório de pacotes do NGINX. Caso não tenha feito isso, configure-o consultando o nginx-otel.
-
Como proceder se o NGINX falhar ao iniciar após configurar o ngx_otel_module no arquivo de configuração?
Execute o comando
nginx -tpara verificar se as configurações do NGINX são válidas ou visualize a mensagem de erro nos logs do NGINX.sudo tail -n 50 /var/log/nginx/error.log -
Por que não há rastros do NGINX disponíveis no console do Managed Service for OpenTelemetry após ativar o ngx_otel_module?
Verifique se o valor do parâmetro otel_exporter.endpoint é válido no arquivo de configuração do NGINX. Esse endpoint consiste no endereço IP do servidor onde o OpenTelemetry Collector está implantado e na porta que o Collector usa para receber dados reportados via gRPC. Exemplo:
localhost:4317. É possível validar as configurações visualizando os logs do NGINX. Se os erros abaixo forem reportados, o endpoint é inválido.2024/11/01 15:21:48 [notice] 137091#137091: worker process 137093 exited with code 0 2024/11/01 15:21:48 [notice] 137091#137091: signal 29 (SIGIO) received 2024/11/01 15:22:02 [error] 137644#137653: OTel export failure: failed to connect to all addresses 2024/11/01 15:22:07 [error] 137645#137652: OTel export failure: failed to connect to all addresses 2024/11/01 15:22:42 [error] 137644#137653: OTel export failure: failed to connect to all addresses 2024/11/01 15:22:47 [error] 137644#137653: OTel export failure: failed to connect to all addresses 2024/11/01 15:23:37 [error] 137644#137653: OTel export failure: failed to connect to all addresses 2024/11/01 15:25:23 [error] 137644#137653: OTel export failure: failed to connect to all addresses 2024/11/01 15:25:28 [error] 137644#137653: OTel export failure: failed to connect to all addresses -
O que fazer se os rastros do NGINX não puderem ser associados aos de outra aplicação?
Confira se
otel_trace_context propagate;está configurado no arquivo do NGINX e se o protocolo usado pela aplicação para propagação de contexto de rastro é o mesmo utilizado pelo NGINX. O ngx_otel_module utiliza o protocolo OpenTelemetry e a especificação W3C para propagação de contexto de rastro. Logo, os rastros do NGINX só poderão ser associados aos da aplicação se ela também usar o protocolo OpenTelemetry e a especificação W3C para essa finalidade. -
O ngx_otel_module afeta o desempenho do NGINX?
O ngx_otel_module é um módulo nativo do NGINX. Segundo a equipe do NGINX, o impacto deste módulo no desempenho limita-se a 10% a 15%. Para mais informações, consulte NGINX Native OpenTelemetry (OTel) Module.

