このトピックでは、OpenTelemetry を使用して NGINX のトレーシング分析を行う方法について説明します。NGINX は、高性能で軽量なオープンソースの Web サーバーおよびリバースプロキシであり、モジュールで機能を拡張できます。ngx_otel_module は NGINX からトレースを収集し、Managed Service for OpenTelemetry に転送します。
制限事項
ngx_otel_module は、gRPC 経由でのみ NGINX のトレースデータをレポートできますが、HTTP 経由ではレポートできません。
ngx_otel_module のリリースノート:
V0.1.2 以降: NGINX トレースを Managed Service for OpenTelemetry に直接転送できます。
V0.1.1 以前: ngx_otel_module は gRPC 認証トークンの設定をサポートしていません。そのため、OpenTelemetry Collector をデプロイして、NGINX トレースを Managed Service for OpenTelemetry に転送する必要があります。
前提条件
操作手順
ステップ 1: ngx_otel_module のダウンロード
方法 1: パッケージマネージャーの使用
Alibaba Cloud Linux、Red Hat Linux、Red Hat Enterprise Linux、またはその派生製品用の ngx_otel_module をダウンロードします。
sudo yum install nginx-module-otelDebian、Ubuntu、またはその派生製品用の ngx_otel_module をダウンロードします。
sudo apt install nginx-module-otel
方法 2: ビルド済み Docker イメージの使用
NGINX V1.27.5 以降では、デフォルトで ngx_otel_module V0.1.2 が使用されます。
Docker 公式 Web サイトにアクセスし、末尾に -otel が付く NGINX イメージ (例: nginx:1.23.3-otel) を検索してプルし、Docker の標準的な起動手順に従ってサービスをデプロイします。
Supported tags and respective Dockerfile links
- 1.27.5, mainline, 1, 1.27, latest, 1.27.5-bookworm, mainline-bookworm, 1-bookworm, 1.27-bookworm, bookworm
- 1.27.5-perl, mainline-perl, 1-perl, 1.27-perl, perl, 1.27.5-bookworm-perl, mainline-bookworm-perl, 1-bookworm-perl, 1.27-bookworm-perl, bookworm-perl
- 1.27.5-otel, mainline-otel, 1-otel, 1.27-otel, otel, 1.27.5-bookworm-otel, mainline-bookworm-otel, 1-bookworm-otel, 1.27-bookworm-otel, bookworm-otel
- 1.27.5-alpine, mainline-alpine, 1-alpine, 1.27-alpine, alpine, 1.27.5-alpine3.21, mainline-alpine3.21, 1-alpine3.21, 1.27-alpine3.21, alpine3.21
- 1.27.5-alpine-perl, mainline-alpine-perl, 1-alpine-perl, 1.27-alpine-perl, alpine-perl, 1.27.5-alpine3.21-perl, mainline-alpine3.21-perl, 1-alpine3.21-perl, 1.27-alpine3.21-perl, alpine3.21-perl
- 1.27.5-alpine-slim, mainline-alpine-slim, 1-alpine-slim, 1.27-alpine-slim, alpine-slim, 1.27.5-alpine3.21-slim, mainline-alpine3.21-slim, 1-alpine3.21-slim, 1.27-alpine3.21-slim, alpine3.21-slimステップ 2: ngx_otel_module の有効化
NGINX のトレース分析機能を有効にするには、NGINX のメイン設定ファイル /etc/nginx/nginx.conf で ngx_otel_module をロードし、ngx_otel_module のパラメーターを設定する必要があります。 ngx_otel_module のパラメーターの詳細については、「ngx_otel_module の公式ドキュメント」をご参照ください。
すべての HTTP リクエストのトレーシング分析を有効にする
ngx_otel_module V0.1.2 以降
load_module modules/ngx_otel_module.so; # ngx_otel_module をロードします ... http { ... otel_exporter { endpoint "${GRPC_ENDPOINT}"; # 前提条件で取得した gRPC エンドポイント header Authentication "${GRPC_TOKEN}"; # 前提条件で取得した認証トークン } otel_trace on; # トレーシング分析を有効にします otel_service_name ${SERVICE_NAME}; # アプリケーション名 otel_trace_context propagate; # トレースコンテキストをダウンストリームサービスに挿入します ... }ngx_otel_module V0.1.1 以前
説明設定内の以下の変数を置き換えてください。
${OTEL_COLLECTOR_GRPC_RECEIVER_ENDPOINT}: デプロイした OpenTelemetry Collector の gRPC エンドポイントです (例:localhost:4317)。 このエンドポイントは、前提条件で取得した Managed Service for OpenTelemetry のエンドポイントとは異なります。${SERVICE_NAME}: アプリケーション名です。この名前は、Managed Service for OpenTelemetry コンソールに NGINX アプリケーション名として表示されます。
load_module modules/ngx_otel_module.so; # ngx_otel_module をロードします ... http { ... otel_exporter { endpoint ${OTEL_COLLECTOR_GRPC_RECEIVER_ENDPOINT}; # OpenTelemetry Collector のレポートアドレス (例: localhost:4317) } otel_trace on; # トレーシング分析を有効にします otel_service_name ${SERVICE_NAME}; # アプリケーション名 otel_trace_context propagate; # トレースコンテキストをダウンストリームサービスに挿入します ... }特定のロケーションへの HTTP リクエストのトレーシング分析を有効にする
ngx_otel_module V0.1.2 以降
load_module modules/ngx_otel_module.so; # ngx_otel_module をロードします ... http { otel_exporter { endpoint "${GRPC_ENDPOINT}"; # 前提条件で取得した gRPC エンドポイント header Authentication "${GRPC_TOKEN}"; # 前提条件で取得した認証トークン } server { listen 127.0.0.1:80; location /hello { otel_trace on; # 127.0.0.1:80/hello のみトレーシング分析を有効にします otel_service_name ${SERVICE_NAME} # アプリケーション名 otel_trace_context propagate; # トレースコンテキストをダウンストリームサービスに挿入します ... } } }ngx_otel_module V0.1.1 以前
説明設定内の 2 つの変数を置き換えてください。
${OTEL_COLLECTOR_GRPC_RECEIVER_ENDPOINT}: デプロイした OpenTelemetry Collector の gRPC エンドポイントです (例:localhost:4317)。このエンドポイントは、前提条件で取得した Managed Service for OpenTelemetry のエンドポイントとは異なります。${SERVICE_NAME}: アプリケーション名。この名前は、Managed Service for OpenTelemetry コンソールに NGINX アプリケーション名として表示されます。
load_module modules/ngx_otel_module.so; # ngx_otel_module をロードします ... http { otel_exporter { endpoint ${OTEL_COLLECTOR_GRPC_RECEIVER_ENDPOINT}; # OpenTelemetry Collector のレポートアドレス (例: localhost:4317) } server { listen 127.0.0.1:80; location /hello { otel_trace on; # 127.0.0.1:80/hello のみトレーシング分析を有効にします otel_service_name ${SERVICE_NAME} # アプリケーション名 otel_trace_context propagate; # トレースコンテキストをダウンストリームサービスに挿入します ... } } }
ステップ 3: (オプション) OpenTelemetry Collector のデプロイ
このステップは、ngx_otel_module V0.1.1 以前の場合にのみ必要です。
方法 1: ACK コンソールでのインストール
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
表示されたページで、
opentelemetry-collectorを見つけてクリックします。表示されたパネルで、右上隅にある [デプロイ] をクリックします。[デプロイ] パネルで、ターゲットクラスターを選択し、[次へ] をクリックします。
[パラメーター] ステップで、次のパラメーターを追加し、[OK] をクリックします。
説明${GRPC_ENDPOINT}と${GRPC_ENDPOINT_TOKEN}を、前提条件で取得した gPRC エンドポイントと認証トークンに置き換えます。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]
方法 2: 手動インストール
以下の例では、Docker を使用して OpenTelemetry Collector をデプロイする方法を示します。詳細については、「Install the Collector」をご参照ください。
opentelemetry-config.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。このファイルは、データの受信、処理、エクスポート方法など、OpenTelemetry Collector の動作と機能を定義および設定するために使用されます。
説明${GRPC_ENDPOINT}と${GRPC_ENDPOINT_TOKEN}を、このトピックの 前提条件 の項で取得した gRPC エンドポイントと認証トークンで置き換えます。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]次のコマンドを実行して、OpenTelemetry Collector を起動します。
docker run -v $(pwd)/opentelemetry-config.yaml:/etc/otelcol-contrib/config.yaml otel/opentelemetry-collector-contrib:0.105.0
ステップ 4: NGINX トレースの表示
前述の手順を完了して NGINX を再起動した後、NGINX にリクエストを送信してトレースを生成します。その後、Managed Service for OpenTelemetry コンソールにログインし、OpenTelemetry によって生成された NGINX トレースを表示します。
[アプリケーション] ページで、NGINX アプリケーションを見つけ、アプリケーション名をクリックします。
[トレース詳細] タブでは、リクエスト期間、クライアント IP アドレス、HTTP ステータスコードなどのトレース詳細を表示できます。 バックエンドサービスも Managed Service for OpenTelemetry に接続されている場合、NGINX とバックエンドサービスのトレースは自動的に関連付けられ、統合ビューが提供されます。 [トレース詳細] ページでは、スパンウォーターフォールに、nginx と Node.js バックエンドサービス (ot-node-demo) を通過するリクエストの完全なトレースが表示されます。 nginx はまず
/helloリクエスト (合計期間 6 ms、HTTP 200) を受信し、次にそれを ot-node-demo のGET /hello(5.76 ms) に転送します。これには、middleware-query、middleware-expressInit、request handler-/helloの 3 つの内部スパンが含まれています。 右側のスパン詳細パネルには、http.status_code=200、http.route=/hello、http.user_agent=curl/7.61.1などの nginx アプリケーションの属性が表示されます。
例
以下の例では、NGINX とバックエンドサービスのトレースデータを収集し、そのトレースデータを Managed Service for OpenTelemetry にレポートする例を示します。
ステップ 1: 準備
Git、Docker、Docker Compose をインストールします。
エンドポイントを取得します。
ステップ 2: プロジェクトディレクトリの作成
nginx-otel-demo
│
├── docker-compose.yml # Docker Compose の設定ファイル
│
├── nginx_conf/ # NGINX の設定ファイル
│ ├── default.conf
│ └── nginx.conf
│
├── otel_conf/ # OpenTelemetry Collector の設定ファイル
│ └── config.yaml
│
└── backend/ # Node.js を使用して開発されたバックエンドサービス
├── Dockerfile
├── main.js
├── package.json
└── package-lock.jsonディレクトリを作成します。
mkdir nginx-otel-demo && cd nginx-otel-demo
mkdir -p nginx_conf otel_conf backendステップ 3: NGINX の設定ファイルの作成
NGINX のメイン設定ファイル
nginx.confを作成します。ngx_otel_module V0.1.2 以降
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 以前
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; } EOFNGINX の設定ファイル
default.confを作成します。cat << 'EOF' > nginx_conf/default.conf server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } # パラメーターを設定します 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; } # サーバーエラーページを静的ページ /50x.html にリダイレクトします # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } EOF
ステップ 4: (オプション) OpenTelemetry Collector の設定ファイルの作成
このステップは、ngx_otel_module V0.1.1 以前の場合にのみ必要です。
OpenTelemetry Collector の設定ファイルを作成します。この設定ファイルは、データの受信、処理、レポート方法を定義します。
${GRPC_ENDPOINT} と ${GRPC_ENDPOINT_TOKEN} を、このトピックの前提条件セクションで取得した gRPC エンドポイントと認証トークンに置き換えます。
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ステップ 5: Node.js を使用したバックエンドサービスの作成
package.jsonファイルを作成します。このファイルには、サービス名、サービスバージョン、依存関係など、バックエンドサービスの設定情報が含まれます。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基本的な Express Web アプリケーションを定義する
main.jsファイルを作成します。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"); }); EOFDockerfileを作成します。ngx_otel_module V0.1.2 以降
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}" ENV 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 以前
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
ステップ 6: Docker Compose の設定ファイルの作成
Docker Compose の設定ファイルは、リバースプロキシとして機能する NGINX、OpenTelemetry Collector、Node.js バックエンドサービスを含むマルチコンテナアプリケーションの設定を定義します。このファイルは、コンポーネント間のネットワーク接続とポートマッピングも定義します。
ngx_otel_module V0.1.2 以降
cat << 'EOF' > docker-compose.yml
version: "3"
services:
nginx:
image: nginx:1.27.5-alpine-otel # ngx_otel_module V0.1.2 を含むデフォルトの NGINX イメージ
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
EOFngx_otel_module V0.1.1 以前
cat << 'EOF' > docker-compose.yml
version: "3"
services:
nginx:
image: nginx:1.27.2-alpine-otel # OpenTelemetry モジュールを含むデフォルトの NGINX イメージ
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 # OpenTelemetry Collector の設定ファイルをマウントします
ports:
- "4317:4317" # OTLP gRPC レシーバー
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ステップ 7: サービスの起動
nginx-otel-demo ディレクトリで次のコマンドを実行します。
docker compose up -d想定される出力:
ngx_otel_module V0.1.2 以降
[+] 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 以前
[+] 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バックエンドサービスにアクセスします。
curl http://localhost:80/hello想定される出力:
{"code":200,"msg":"success"}Managed Service for OpenTelemetry コンソールにログインして、NGINX とバックエンドサービスのトレースを表示します。
この例では、[Applications] ページで nginx が NGINX のアプリケーション名として表示され、バックエンドサービスの名前は ot-nodejs-demo です。
よくある質問
「
Unable to find a match: nginx-module-otel」というエラーメッセージが表示され、nginx-module-otel のダウンロードに失敗した場合はどうすればよいですか?NGINX パッケージリポジトリが設定されているかどうかを確認してください。設定されていない場合は、nginx-otel を参照して設定してください。
NGINX の設定ファイルで ngx_otel_module を設定した後、NGINX の起動に失敗した場合はどうすればよいですか?
nginx -tコマンドを実行して NGINX 設定が有効かどうかを確認するか、NGINX ログでエラーメッセージを確認します。sudo tail -n 50 /var/log/nginx/error.logngx_otel_module を有効にした後、Managed Service for OpenTelemetry コンソールで NGINX トレースが表示されない場合はどうすればよいですか?
NGINX の設定ファイルで、otel_exporter.endpoint パラメーターの値が有効かどうかを確認してください。このエンドポイントは、OpenTelemetry Collector がデプロイされているサーバーの IP アドレスと、gRPC 経由で報告されるデータを受信するためのポートから構成されます。例:
localhost:4317。設定が有効かどうかは、NGINX ログを表示して確認できます。次のエラーが報告されている場合、エンドポイントは無効です。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 addressesNGINX トレースが別のアプリケーションのトレースと関連付けられない場合はどうすればよいですか?
NGINX の設定ファイルに
otel_trace_context propagate;が設定されていること、およびアプリケーションがトレースコンテキストの伝播に使用するプロトコルが NGINX で使用されるプロトコルと同じであることを確認してください。ngx_otel_module は、トレースコンテキストの伝播に OpenTelemetry プロトコルと W3C 仕様を使用します。したがって、アプリケーションもトレースコンテキストの伝播に OpenTelemetry プロトコルと W3C 仕様を使用する場合にのみ、NGINX のトレースをアプリケーションのトレースと関連付けることができます。ngx_otel_module は NGINX のパフォーマンスに影響しますか?
ngx_otel_module は NGINX のネイティブモジュールです。NGINX チームによると、このモジュールが NGINX のパフォーマンスに与える影響は 10% から 15% 程度です。詳細については、「NGINX Native OpenTelemetry (OTel) Module」をご参照ください。
