Node.js アプリケーションを実行する際には、パフォーマンスの問題を診断するために、リクエストのレイテンシ、エラー率、およびサービス間の依存関係を可視化する必要があります。OpenTelemetry 向けマネージドサービス (トレーシング分析) は、アプリケーションから収集した分散トレースを可視化し、マイクロサービス全体におけるボトルネックを特定するのに役立ちます。
このトピックでは、Jaeger クライアントライブラリを用いて Node.js アプリケーションをインストルメント化し、トレースデータをトレーシング分析にレポートする手順について説明します。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
ご利用のマシンに Node.js がインストールされていること
プロジェクトに
jaeger-clientの依存関係が追加されていること:"dependencies": { "jaeger-client": "^3.12.0" }Jaeger または Zipkin コレクターのエンドポイント(下記の「コレクターのエンドポイントを取得する」セクションを参照)
コレクターのエンドポイントを取得する
OpenTelemetry 向けマネージドサービスコンソールにログインします。
左側のナビゲーションウィンドウで、クラスター設定 をクリックします。その後、アクセスポイント情報 タブをクリックします。
上部のナビゲーションバーでリージョンを選択します。クラスター情報 セクションで、トークンを表示 を有効にします。
クライアント セクションで、Jaeger または Zipkin をクリックします。
関連情報 列からエンドポイントをコピーします。

ご利用のアプリケーションが Alibaba Cloud の本番環境で実行される場合は、仮想プライベートクラウド (VPC) エンドポイントを使用してください。それ以外の場合は、パブリックエンドポイントを使用します。Zipkin の場合、特別な理由がない限り v2 エンドポイントをご利用ください。
アプリケーションのインストルメント化
ステップ 1:トレーサーの初期化
サービス名、サンプリング戦略、およびコレクターのエンドポイントを指定して Jaeger クライアントを設定します。
<endpoint> を、前のセクションで取得したエンドポイントに置き換えてください。このエンドポイントは、トレーシング分析コンソールの 概要 ページでもご確認いただけます。
const initTracer = require("jaeger-client").initTracer;
const config = {
serviceName: 'node-service',
sampler: {
type: "const",
param: 1
},
reporter: {
collectorEndpoint: "<endpoint>"
},
};ステップ 2:トレーサーインスタンスの作成
const tracer = initTracer(config);ステップ 3:スパンの作成と完了
スパンは単一の作業単位を表します。スパンを開始し、任意でタグおよびログをアタッチした後、完了することでデータが送信されます。
const span = tracer.startSpan("say-hello");
// メタデータをキーと値のペアとしてタグとしてアタッチ(トレース詳細ビューに表示されます)
span.setTag("tagKey-01", "tagValue-01");
// タイムスタンプ付きのログエントリを記録(スパンのログタイムラインに表示されます)
span.log({event: "timestamp", value: Date.now()});
// スパンを完了してコレクターに送信します
span.finish();ステップ 4:コンソールでのトレースの確認
トレーシング分析コンソールにログインし、トレースを確認します。
Express を使用した完全な例
この例では Express アプリケーションをインストルメント化します。すべての着信リクエストがスパンでラップされ、/api ルートに対してログエントリが記録されます。
const express = require("express");
const initTracer = require("jaeger-client").initTracer;
const app = express();
const config = {
serviceName: 'node-service',
sampler: {
type: "const",
param: 1
},
reporter: {
collectorEndpoint: "<endpoint>"
},
};
const tracer = initTracer(config);
// ミドルウェア:すべての着信リクエストに対してスパンを開始
app.all('*', function (req, res, next) {
req.span = tracer.startSpan("say-hello");
next();
});
// ルートハンドラ:タイムスタンプをログに記録し、スパンを完了
app.get("/api", function (req, res) {
const span = req.span;
span.log({event: "timestamp", value: Date.now()});
req.span.finish();
res.send({code: 200, msg: "success"});
});
app.listen(3000, '127.0.0.1', function () {
console.log('start');
});<endpoint> をご利用のコレクターのエンドポイントに置き換え、アプリケーションを実行します:
node app.jsテストリクエストを送信します:
curl http://127.0.0.1:3000/api期待される応答:
{"code":200,"msg":"success"}プレースホルダー
コードを実行する前に、以下のプレースホルダーを実際の値に置き換えてください。
| プレースホルダー | 説明 |
|---|---|
<endpoint> | OpenTelemetry 向けマネージドサービスコンソールから取得した Jaeger コレクターのエンドポイントです。「コレクターのエンドポイントを取得する」セクションを参照してください。 |

