Cette rubrique explique comment utiliser OpenTelemetry pour analyser les traces sur NGINX. NGINX est un serveur web et un proxy inverse open source, léger et performant, dont les fonctionnalités sont extensible via des modules. Le module ngx_otel_module collecte les traces de NGINX et les transfère vers le service Managed Service for OpenTelemetry.
Limitations
Le module ngx_otel_module transmet les données de trace de NGINX uniquement via gRPC. La transmission via HTTP n'est pas prise en charge.
-
Notes de version du module ngx_otel_module :
V0.1.2 ou version ultérieure : vous pouvez transférer directement les traces NGINX vers le service Managed Service for OpenTelemetry.
V0.1.1 ou version antérieure : le module ngx_otel_module ne prend pas en charge la configuration des jetons d'authentification gRPC. Vous devez donc déployer un collecteur OpenTelemetry pour acheminer les traces NGINX vers le service Managed Service for OpenTelemetry.
Prérequis
Procédure
Étape 1 : Télécharger le module ngx_otel_module
Method 1: Use the package manager
-
Téléchargez le module ngx_otel_module pour Alibaba Cloud Linux, Red Hat Linux, Red Hat Enterprise Linux ou leurs dérivés :
sudo yum install nginx-module-otel -
Téléchargez le module ngx_otel_module pour Debian, Ubuntu ou leurs dérivés :
sudo apt install nginx-module-otel
Method 2: Use the pre-built Docker image
NGINX V1.27.5 et versions ultérieures utilisent par défaut le module ngx_otel_module V0.1.2.
Accédez au site officiel de Docker, recherchez et récupérez les images NGINX suffixées par -otel, telles que nginx:1.23.3-otel, puis déployez le service en suivant la procédure standard de démarrage d'un conteneur Docker.

Étape 2 : Activer le module ngx_otel_module
Pour activer l'analyse de traçage pour NGINX, chargez le module ngx_otel_module et configurez ses paramètres dans le fichier de configuration principal /etc/nginx/nginx.conf de NGINX. Pour plus d'informations sur les paramètres du module ngx_otel_module, consultez la documentation officielle du module ngx_otel_module.
-
Activer l'analyse de traçage pour toutes les requêtes 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
RemarqueRemplacez les variables suivantes dans la configuration :
${OTEL_COLLECTOR_GRPC_RECEIVER_ENDPOINT}: endpoint gRPC du collecteur OpenTelemetry que vous avez déployé, par exemplelocalhost:4317. Cet endpoint diffère de celui du service Managed Service for OpenTelemetry obtenu dans les prérequis.${SERVICE_NAME}: nom de l'application. Ce nom s'affiche comme nom d'application NGINX dans la console 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. ... } -
Activer l'analyse de traçage pour les requêtes HTTP envoyées à un emplacement unique
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
RemarqueRemplacez les deux variables dans la configuration :
${OTEL_COLLECTOR_GRPC_RECEIVER_ENDPOINT}: endpoint gRPC du collecteur OpenTelemetry que vous avez déployé, par exemplelocalhost:4317. Cet endpoint diffère de celui du service Managed Service for OpenTelemetry obtenu dans les prérequis.${SERVICE_NAME}: nom de l'application. Ce nom s'affiche comme nom d'application NGINX dans la console 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. ... } } }
Étape 3 : (Facultatif) Déployer un collecteur OpenTelemetry
Cette étape est requise uniquement pour le module ngx_otel_module V0.1.1 ou une version antérieure.
Method 1: Installation in the ACK console
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur .
Sur la page qui s'affiche, recherchez et cliquez sur
opentelemetry-collector. Dans le panneau qui s'ouvre, cliquez sur Deploy en haut à droite.Dans le panneau Deploy, sélectionnez le cluster cible et cliquez sur Next.
-
À l'étape Parameters, ajoutez les paramètres suivants et cliquez sur OK.
RemarqueRemplacez
${GRPC_ENDPOINT}et${GRPC_ENDPOINT_TOKEN}par l'endpoint gPRC et le jeton d'authentification récupérés dans la section Prérequis.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]Exemple :

Method 2: Manual installation
L'exemple suivant montre comment déployer le collecteur OpenTelemetry à l'aide de Docker. Pour plus d'informations, consultez la page Install the Collector.
-
Créez un fichier nommé
opentelemetry-config.yamlet copiez-y le contenu suivant.Ce fichier sert à définir et configurer les comportements et fonctionnalités du collecteur OpenTelemetry, y compris les méthodes de réception, de traitement et d'exportation des données.
RemarqueRemplacez
${GRPC_ENDPOINT}et${GRPC_ENDPOINT_TOKEN}par l'endpoint gRPC et le jeton d'authentification obtenus dans la section Prérequis de cette rubrique.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] -
Exécutez la commande suivante pour démarrer le collecteur OpenTelemetry :
docker run -v $(pwd)/opentelemetry-config.yaml:/etc/otelcol-contrib/config.yaml otel/opentelemetry-collector-contrib:0.105.0
Étape 4 : Consulter les traces NGINX
Une fois les étapes précédentes terminées et NGINX redémarré, envoyez des requêtes à NGINX pour générer des traces. Connectez-vous ensuite à la console Managed Service for OpenTelemetry pour afficher les traces NGINX générées par OpenTelemetry.
Sur la page Applications, localisez l'application NGINX et cliquez sur son nom.

Dans l'onglet Trace details, consultez les détails de la trace, notamment la durée de la requête, l'adresse IP du client et le code d'état HTTP. Si votre service backend est également connecté au service Managed Service for OpenTelemetry, les traces de NGINX et des services backend sont automatiquement associées pour offrir une vue intégrée.

Exemple
L'exemple suivant montre comment collecter les données de trace de NGINX et d'un service backend, puis les envoyer au service Managed Service for OpenTelemetry.
Étape 1 : Préparatifs
Installez Git, Docker et Docker Compose.
Étape 2 : Créer les répertoires du projet
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
Créez les répertoires.
mkdir nginx-otel-demo && cd nginx-otel-demo
mkdir -p nginx_conf otel_conf backend
Étape 3 : Créer les fichiers de configuration de NGINX
-
Créez le fichier de configuration principal
nginx.confde 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 -
Créez le fichier de configuration
default.confde 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
Étape 4 : (Facultatif) Créer le fichier de configuration du collecteur OpenTelemetry
Cette étape est requise uniquement pour le module ngx_otel_module V0.1.1 ou une version antérieure.
Créez le fichier de configuration du collecteur OpenTelemetry. Ce fichier définit les méthodes de réception, de traitement et d'envoi des données.
Remplacez ${GRPC_ENDPOINT} et ${GRPC_ENDPOINT_TOKEN} par l'endpoint gRPC et le jeton d'authentification obtenus dans la section Prérequis de cette rubrique.
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
Étape 5 : Créer un service backend avec Node.js
-
Créez le fichier package.json. Ce fichier contient les informations de configuration du service backend, notamment le nom du service, la version du service et les dépendances.
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 -
Créez le fichier main.js qui définit une application web Express basique.
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 -
Créez le 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
Étape 6 : Créer le fichier de configuration de Docker Compose
Le fichier de configuration de Docker Compose définit les configurations d'une application multi-conteneurs, incluant NGINX servant de proxy inverse, le collecteur OpenTelemetry et un service backend Node.js. Ce fichier définit également les connexions réseau et les mappages de ports entre les composants.
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
Étape 7 : Démarrer le service
-
Exécutez la commande suivante dans le répertoire nginx-otel-demo :
docker compose up -dRésultat attendu :
ngx_otel_module V0.1.2 or later

ngx_otel_module V0.1.1 or earlier

-
Accédez au service backend.
curl http://localhost:80/helloRésultat attendu :
{"code":200,"msg":"success"} -
Connectez-vous à la console Managed Service for OpenTelemetry pour afficher les traces de NGINX et du service backend.
Dans cet exemple, nginx s'affiche comme nom d'application pour NGINX sur la page Applications, et le nom du service backend est ot-nodejs-demo.
FAQ
-
Que faire si le téléchargement de nginx-module-otel échoue avec le message d'erreur «
Unable to find a match: nginx-module-otel» ?Vérifiez si vous avez configuré le dépôt de packages NGINX. Si ce n'est pas le cas, configurez-le en suivant les instructions de la page nginx-otel.
-
Que faire si NGINX ne démarre pas après avoir configuré le module ngx_otel_module dans le fichier de configuration de NGINX ?
Exécutez la commande
nginx -tpour vérifier la validité des configurations NGINX, ou consultez le message d'erreur dans les journaux NGINX.sudo tail -n 50 /var/log/nginx/error.log -
Que faire si aucune trace NGINX n'est disponible dans la console Managed Service for OpenTelemetry après avoir activé le module ngx_otel_module ?
Vérifiez si la valeur du paramètre otel_exporter.endpoint est valide dans le fichier de configuration de NGINX. Cet endpoint se compose de l'adresse IP du serveur sur lequel le collecteur OpenTelemetry est déployé et du port utilisé par le collecteur OpenTelemetry pour recevoir les données envoyées via gRPC. Exemple :
localhost:4317. Vous pouvez vérifier la validité des configurations en consultant les journaux NGINX. Si les erreurs illustrées dans la figure suivante sont signalées, l'endpoint n'est pas valide.
-
Que faire si les traces NGINX ne peuvent pas être associées à celles d'une autre application ?
Vérifiez si
otel_trace_context propagate;est configuré dans le fichier de configuration de NGINX, et si le protocole utilisé par l'application pour la propagation du contexte de trace est identique à celui utilisé par NGINX. Le module ngx_otel_module utilise le protocole OpenTelemetry et la spécification W3C pour la propagation du contexte de trace. Par conséquent, les traces NGINX ne peuvent être associées à celles de l'application que si cette dernière utilise également le protocole OpenTelemetry et la spécification W3C pour la propagation du contexte de trace. -
Le module ngx_otel_module affecte-t-il les performances de NGINX ?
Le module ngx_otel_module est un module natif de NGINX. Selon l'équipe NGINX, l'impact de ce module sur les performances de NGINX est limité à 10 % à 15 %. Pour plus d'informations, consultez la page NGINX Native OpenTelemetry (OTel) Module.

