Node.js サービスが単一のプロセスを超えて成長すると、サービス境界を越えたレイテンシーや障害の診断には分散トレーシングが必要です。Managed Service for OpenTelemetry は、アプリケーションからトレースデータを収集し、アプリケーションのトポロジー、トレース分析、アノマリーおよび低速トランザクションの検出、SQL 分析を提供します。このガイドでは、Express ベースのアプリケーション向けに、自動 (ゼロコード) と手動 (SDK レベル) の 2 つのイベントトラッキングアプローチについて説明します。
前提条件
Node.js 14 以降
重要お使いの Node.js のバージョンが 14 未満の場合は、代わりに Jaeger を使用してトレースデータをレポートしてください。 詳細については、「Node.js アプリケーションデータをレポートする」をご参照ください。
OpenTelemetry 向けマネージドサービスコンソールからのエンドポイントと認証トークン
エンドポイントの取得
OpenTelemetry 向けマネージドサービスコンソールにログインします。
左側のナビゲーションウィンドウで、[クラスター設定] をクリックします。表示されたページで、[アクセスポイント情報] タブをクリックします。
トップナビゲーションバーでリージョンを選択します。[クラスター情報] セクションで、[トークンの表示] をオンにします。
[クライアント] を [OpenTelemetry] に設定します。
[関連情報] 列で、エンドポイントをコピーします。

アプリケーションが Alibaba Cloud 本番環境で実行されている場合は、Virtual Private Cloud (VPC) エンドポイントを使用します。その他のすべての環境では、パブリックエンドポイントを使用します。
サンプルコード
完全なサンプルプロジェクトは、opentelemetry-nodejs-demo からダウンロードできます。
自動イベントトラッキング (推奨)
自動イベントトラッキングにより、コードの変更を加えずにアプリケーションにトレースを追加できます。OpenTelemetry 自動イベントトラッキングパッケージは、起動時にサポートされているフレームワークを検出し、自動的にスパンを作成します。
使用するタイミング: ほとんどのユースケースでは、ここから開始します。自動イベントトラッキングは、Express、Fastify、Koa、および 30 以上の他のフレームワークをサポートしています。カスタムスパンプロセッサ、高度なサンプリング、または SDK の初期化に対する詳細な制御が必要な場合にのみ、手動イベントトラッキングに切り替えます。
ステップ 1: 依存関係のインストール
cd auto-instrumentation
npm init -y
npm install express axiosステップ 2: OpenTelemetry パッケージのインストール
npm install --save @opentelemetry/api @opentelemetry/auto-instrumentations-nodeステップ 3: アプリケーションの作成
次の例では、2 つのルートを持つ基本的な Express サーバーを作成します。
"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");
});ステップ 4: 環境変数の設定とアプリケーションの起動
次の環境変数を設定し、アプリケーションを起動します。
export OTEL_TRACES_EXPORTER="otlp"
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="<your-endpoint>"
export OTEL_NODE_RESOURCE_DETECTORS="env,host,os"
export OTEL_SERVICE_NAME="<your-service-name>"
export NODE_OPTIONS="--require @opentelemetry/auto-instrumentations-node/register"
node main.js次のプレースホルダーを実際の値に置き換えます。
| プレースホルダー | 説明 | 例 |
|---|---|---|
<your-endpoint> | エンドポイントの取得 | https://tracing-analysis-dc-hz.aliyuncs.com/... |
<your-service-name> | コンソールでアプリケーションを識別する名前 | my-express-app |
次の表は、各環境変数について説明しています。
| 変数 | 説明 |
|---|---|
OTEL_TRACES_EXPORTER | エクスポートプロトコル。OpenTelemetry プロトコルの場合は otlp に設定します。 |
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT | トレースデータを受信する HTTP エンドポイント。 |
OTEL_NODE_RESOURCE_DETECTORS | 起動時に実行するリソース検出器。env,host,os は、環境、ホスト、および OS のメタデータを収集します。 |
OTEL_SERVICE_NAME | OpenTelemetry 向けマネージドサービスコンソールに表示されるサービス名。 |
NODE_OPTIONS | アプリケーションの起動前に自動イベントトラッキングモジュールをロードします。 |
利用可能なすべての OpenTelemetry 環境変数の詳細については、「自動イベントトラッキング構成」をご参照ください。
ステップ 5: トレースデータの生成
トレースを生成するためにリクエストを送信します。
curl localhost:7001/helloリクエストが完了すると、SDK はトレースデータを Managed Service for OpenTelemetry にエクスポートします。
手動イベントトラッキング
手動イベントトラッキングでは、カスタムスパンプロセッサ、高度なサンプリング、アプリケーション固有の構成など、SDK の初期化を完全に制御できます。このアプローチは自動イベントトラッキングを置き換えるものです。両方を同時に使用しないでください。
手動イベントトラッキングパスはエクスポートプロトコルに gRPC を使用しますが、自動パスは HTTP を使用します。ファイアウォールポリシーが gRPC をサポートしていない場合は、HTTP を使用した自動イベントトラッキングを使用するか、代わりに HTTP エクスポーター (@opentelemetry/exporter-trace-otlp-http) を構成します。
ステップ 1: OpenTelemetry 依存関係の追加
次の依存関係を package.json ファイルに追加します。
"dependencies": {
"@opentelemetry/api": "^1.0.4",
"@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0",
"@opentelemetry/instrumentation": "^0.27.0",
"@opentelemetry/instrumentation-express": "^0.27.0",
"@opentelemetry/instrumentation-http": "^0.27.0",
"@opentelemetry/resources": "^1.0.1",
"@opentelemetry/sdk-trace-base": "^1.0.1",
"@opentelemetry/sdk-trace-node": "^1.0.1"
}ステップ 2: トレーサープロバイダーの作成
トレーサープロバイダーは、他のアプリケーションのインポートよりも前に、エントリファイルの先頭でインポートおよび初期化します。OpenTelemetry は、フレームワークライブラリがロードされる前にパッチを適用する必要があります。初期化順序の誤りは、スパン欠落の最も一般的な原因です。
const { Resource } = require("@opentelemetry/resources");
const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node");
const {
SemanticResourceAttributes,
} = require("@opentelemetry/semantic-conventions");
const provider = new NodeTracerProvider({
resource: new Resource({
[SemanticResourceAttributes.HOST_NAME]: require("os").hostname(),
// "opentelemetry-express" をご利用のサービス名に置き換えます
[SemanticResourceAttributes.SERVICE_NAME]: "opentelemetry-express",
}),
});ステップ 3: フレームワークイベントトラッキングの登録
HTTP および Express イベントトラッキングを登録して、受信および送信リクエストを自動的にトレースします。
const { registerInstrumentations } = require("@opentelemetry/instrumentation");
const { HttpInstrumentation } = require("@opentelemetry/instrumentation-http");
const {
ExpressInstrumentation,
} = require("@opentelemetry/instrumentation-express");
registerInstrumentations({
tracerProvider: provider,
instrumentations: [new HttpInstrumentation(), ExpressInstrumentation],
});他のNode.jsフレームワークをインストゥルメントするには、利用可能なプラグインについては、OpenTelemetry auto-instrumentations-nodeパッケージを参照してください。
ステップ 4: エクスポーターの構成
gRPC 経由で OTLP エクスポーターを構成し、トレースデータを Managed Service for OpenTelemetry に送信します。
const metadata = new grpc.Metadata();
metadata.set("Authentication", "<your-token>");
const exporter = new OTLPTraceExporter({ url: "<your-endpoint>", metadata });
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));
provider.register();次のプレースホルダーを実際の値に置き換えます。
| プレースホルダー | 説明 |
|---|---|
<your-endpoint> | エンドポイントの取得 |
<your-token> | [トークンの表示] |
ステップ 5 (オプション): カスタムイベントと属性の追加
アプリケーション固有のコンテキストのために、現在のスパンにイベントと属性をアタッチします。
const api = require("@opentelemetry/api");
const currentSpan = api.trace.getSpan(api.context.active());
// タイムスタンプ付きイベントを追加
currentSpan.addEvent("timestamp", { value: Date.now() });
// カスタム属性を追加
currentSpan.setAttribute("tagKey-01", "tagValue-01");OpenTelemetry トレース API の詳細については、「OpenTelemetry JS 入門ガイド」をご参照ください。
ARMS コンソールでのトレースデータの表示
OpenTelemetry 向けマネージドサービスコンソールにログインします。
左側のナビゲーションウィンドウで、[アプリケーション] をクリックします。
ご利用のアプリケーション名をクリックして、トレース、トポロジー、およびパフォーマンスデータを表示します。
トラブルシューティング
アプリケーションがコンソールに表示されない
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT(自動) またはOTLPTraceExporter(手動) のurlパラメーターがコンソールからのエンドポイントと一致することを確認します。エンドポイントへのネットワーク接続を確認します。アプリケーションが Alibaba Cloud の外部で実行されている場合は、VPC エンドポイントの代わりにパブリックエンドポイントを使用します。
ご利用のアプリケーションが少なくとも 1 つのリクエストを受信していることを確認します。OpenTelemetry は、スパンをエクスポートする前にバッファーします。
手動イベントトラッキングの場合、トレーサープロバイダーが他のアプリケーションのインポートよりも前に初期化されていることを確認します。初期化順序の誤りは、スパン欠落の原因となります。
デバッグログの有効化
SDK の動作を検査するために、OpenTelemetry ログレベルを debug に設定します。
export OTEL_LOG_LEVEL=debugアプリケーションを再起動し、スパンエクスポートログとエラーについてコンソール出力を確認します。エクスポートが成功すると、次のようなログエントリが生成されます。
@opentelemetry/api: Registered a global for diag v1.x.x
...
items to be sent [{"traceId":"...","spanId":"...","name":"GET /hello",...}]スパンエントリが表示されない場合は、ご利用のアプリケーションが少なくとも 1 つのリクエストを処理しており、エンドポイントに到達可能であることを確認します。
サポートされている Node.js フレームワーク
OpenTelemetry は、次のフレームワーク用の自動イベントトラッキングプラグインを提供します。完全なリストについては、OpenTelemetry JS contrib リポジトリをご参照ください。
すべてのサポートされているフレームワークを表示
完全なサンプルコード
次のコードは、すべての手動イベントトラッキング手順を単一の実行可能な Express アプリケーションに結合します。この例では、gRPC ベースの OTLPTraceExporter を使用して、トレースデータを Managed Service for OpenTelemetry に送信します。
"use strict";
const { Resource } = require("@opentelemetry/resources");
const {
OTLPTraceExporter,
} = require("@opentelemetry/exporter-trace-otlp-grpc");
const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node");
const { SimpleSpanProcessor } = require("@opentelemetry/sdk-trace-base");
const {
ExpressInstrumentation,
} = require("@opentelemetry/instrumentation-express");
const { registerInstrumentations } = require("@opentelemetry/instrumentation");
const { HttpInstrumentation } = require("@opentelemetry/instrumentation-http");
const {
SemanticResourceAttributes,
} = require("@opentelemetry/semantic-conventions");
const grpc = require("@grpc/grpc-js");
// 1. サービスメタデータを持つトレーサープロバイダーの作成
const provider = new NodeTracerProvider({
resource: new Resource({
[SemanticResourceAttributes.HOST_NAME]: require("os").hostname(),
[SemanticResourceAttributes.SERVICE_NAME]: "opentelemetry-express",
}),
});
// 2. HTTP および Express イベントトラッキングの登録
registerInstrumentations({
tracerProvider: provider,
instrumentations: [new HttpInstrumentation(), ExpressInstrumentation],
});
// 3. 認証付き gRPC エクスポーターの構成
const metadata = new grpc.Metadata();
metadata.set("Authentication", "<your-token>");
const exporter = new OTLPTraceExporter({ url: "<your-endpoint>", metadata });
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));
provider.register();
// 4. アプリケーションコード (プロバイダー登録後に記述する必要があります)
const api = require("@opentelemetry/api");
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/api");
return res.status(201).send(result.data);
});
app.get("/api", async (req, res) => {
const currentSpan = api.trace.getSpan(api.context.active());
currentSpan.addEvent("timestamp", { value: Date.now() });
currentSpan.setAttribute("tagKey-01", "tagValue-01");
res.json({ code: 200, msg: "success" });
});
app.use(express.json());
app.listen(7001, () => {
console.log("Listening on http://localhost:7001");
});<your-token> と <your-endpoint> を、エンドポイントの取得で取得したトークンと gRPC エンドポイントに置き換えます。