OpenTelemetry を使用してアプリケーションをインストルメントし、トレースデータを Managed Service for OpenTelemetry に送信すると、Managed Service for OpenTelemetry はアプリケーションの監視を開始します。アプリケーショントポロジー、トレース、異常トランザクション、低速トランザクション、SQL分析データなど、アプリケーションの監視データを表示できます。このトピックでは、OpenTelemetry を使用して Express ベースの Node.js アプリケーションを自動または手動でインストルメントし、データを送信する方法について説明します。
前提条件
Node.js のバージョンは 14 以降である必要があります。それ以外の場合は、Jaeger を使用して Node.js アプリケーションのトレースデータを送信することをお勧めします。詳細については、Node.js アプリケーションデータの送信 を参照してください。
背景情報
OpenTelemetry は、一般的なフレームワークのスパンを自動的に作成するために使用できる複数の自動インストルメンテーションプラグインを提供しています。次の表に、サポートされているフレームワークを示します。詳細については、OpenTelemetry のドキュメントを参照してください。
サンプルコード
opentelemetry-nodejs-demo からサンプルコードをダウンロードできます。
方法 1: 自動インストルメンテーション (推奨)
プロジェクトの実行に必要な依存関係をダウンロードします。
cd auto-instrumentation npm init -y npm install express npm install axios
OpenTelemetry 自動インストルメンテーションに必要な依存関係をダウンロードします。
npm install --save @opentelemetry/api npm install --save @opentelemetry/auto-instrumentations-node
アプリケーションコードを作成します。
次のコードは、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"); });
環境変数を使用して OpenTelemetry パラメーターを設定し、アプリケーションを実行します。
${httpEndpoint}
を、前提条件 で取得した HTTP エンドポイントに置き換えます。${serviceName}
をアプリケーション名に置き換えます。export OTEL_TRACES_EXPORTER="otlp" export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="${httpEndpoint}" export OTEL_NODE_RESOURCE_DETECTORS="env,host,os" export OTEL_SERVICE_NAME="${serviceName}" export NODE_OPTIONS="--require @opentelemetry/auto-instrumentations-node/register" node main.js
説明OpenTelemetry 環境変数の詳細については、Automatic Instrumentation Configuration を参照してください。
アプリケーションにアクセスします。
次のコマンドを実行するか、ブラウザを使用してアプリケーションにアクセスします。その後、トレースを生成し、トレースデータを Managed Service for OpenTelemetry に送信できます。
curl localhost:7001/hello
方法 2: 手動インストルメンテーション
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" }
プロバイダーを作成します。
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(), [SemanticResourceAttributes.SERVICE_NAME]: "opentelemetry-express", // opentelemetry-express を実際のサービス名に置き換えることができます。 }), });
プロバイダーを使用して HTTP および Express フレームワークを登録します。これらのフレームワークのアプリケーションは自動的に監視およびインターセプトされます。
説明他のフレームワークの Node.js アプリケーションを監視する方法については、OpenTelemetry のドキュメントを参照してください。
const { registerInstrumentations } = require("@opentelemetry/instrumentation"); const { HttpInstrumentation } = require("@opentelemetry/instrumentation-http"); const { ExpressInstrumentation, } = require("@opentelemetry/instrumentation-express"); registerInstrumentations({ tracerProvider: provider, instrumentations: [new HttpInstrumentation(), ExpressInstrumentation], });
Managed Service for OpenTelemetry にデータをエクスポートするエクスポーターを構成します。
次のコードの
<ENDPOINT>
および<AUTHENTICATION>
を、前提条件で取得したエンドポイントとトークンに置き換えます。const metadata = new grpc.Metadata(); metadata.set("Authentication", "<AUTHENTICATION>"); const exporter = new OTLPTraceExporter({ url: "<ENDPOINT>", metadata }); provider.addSpanProcessor(new SimpleSpanProcessor(exporter)); provider.register();
オプション。 カスタムイベントと属性を追加します。
説明OpenTelemetry API の使用方法については、OpenTelemetry のドキュメントを参照してください。
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");
ARMS コンソールでトレースデータを表示する
Managed Service for OpenTelemetry コンソール の Applications ページで、アプリケーションの名前をクリックします。表示されるページで、トレースデータを表示します。