最後は、OpenTelemetryを用いて、APMでNode.jsアプリケーションの監視を行う方法を紹介します。
OCI APMは、JaegerやZipkinなどのOpenTelemetryおよびオープンソースのトレース・ツールをサポートしています。Node.jsのアプリケーションのトレース・データをAPMにアップロードする方法としては、OpenTelemetryやZipkinトレーサなどがありますが、ここではOpenTelemetryを用いた設定方法を紹介します。
アプリケーションのデプロイ & OpenTelemetryの有効化
#node インストール
sudo dnf module install -y nodejs:18
node -v
#opentelemetry インストール
npm install --save @opentelemetry/api
npm install --save @opentelemetry/sdk-node
npm install --save @opentelemetry/auto-instrumentations-node
#module インストール
npm install request
npm install express
#アプリのダウンロード&解凍
wget https://github.com/western24/apmdemo/raw/main/opentelemetrydemo.zip
unzip opentelemetrydemo.zip
#Tracing.jsを開き
cd opentelemetrydemo/
vi tracing.js
##APMのEndpointとPrivateデータキーを編集
url: "https://xxxxx.apm-agt.ap-tokyo-1.oci.oraclecloud.com/20200101/opentelemetry/private/v1/traces",
headers: {"Authorization": "dataKey xxxxxxx"}
#APPの起動
node -r ./tracing.js app.js
OpenTelemetryに必要な設定
まずは動作させるところまでの環境を構築できたところで、実際にNode.jsのアプリケーションでAPMを使うためには、何の設定をしなければらないないかという観点で解説します。
OpenTelemetryの場合は、APM Java Agentのようなエージェントをダウンロードしてインストールするのではなく、OpenTelemetryのドキュメントに従って、OpenTelemetry用の起動スクリプトを準備し、アプリケーション起動時に一緒に読み込ませるというのがおおまかな設定の流れです。
今回のアプリケーションでは、tracing.jsというのが起動スクリプトになり、必要なパラメータを指定しています。
const process = require('process');
const opentelemetry = require('@opentelemetry/sdk-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { OTLPTraceExporter } = require("@opentelemetry/exporter-trace-otlp-http");
//serviceNameはAPMで表示するサービス名、urlとheadersはAPMのエンドポイントとデータキー
const sdk = new opentelemetry.NodeSDK({
traceExporter: new OTLPTraceExporter({
// Change url & datakey to yuor APM
url: "https://xxxxxx.apm-agt.us-ashburn-1.oci.oraclecloud.com/20200101/opentelemetry/public/v1/traces",
headers: {"Authorization": "dataKey xxxxxxxx"}
}),
serviceName: "opentelemetrydemo",
instrumentations: [getNodeAutoInstrumentations()]
});
sdk.start();
上記の設定を追加することによりNode.jsのOpenTelemetryが動作します。
OpenTelemetryでテレメタリデータを収集することをInstrumentation(計装)と呼びますが、これは自動計装(Automatic Instrumentation)と手動計装(Manual Instrumentation)の2つの種類があります。
自動計装は、プログラム・コード内で実行される様々イベントにて自動的に計測されるもので、手動計装は、ユーザー自身でSpanの範囲を指定し、計測したい処理範囲を自身で決定することができます。
このアプリケーションもHelidonの場合と同様に単純な2つの処理をしているだけです。そしてそれぞれ処理は同じように自動計装と手動計装されています。app.jsのコードをちょっと見てみると
//気象庁のREST APIコールの部分には、特にトレーシングに関するコードは追記していない
var request = require('request');
var options = {
url: 'https://www.jma.go.jp/bosai/forecast/data/overview_forecast/130000.json',
method: 'GET',
json: true
}
//明示的にSpanの範囲を指定している
const opentelemetry = require("@opentelemetry/api");
const tracer = opentelemetry.trace.getTracer('Test Span Scope');
const mainWork = () => {
tracer.startActiveSpan('main', (parentSpan) => { // <----親Span Start
for (let i = 0; i < 3; i += 1) {
doWork(i); // <----子Span
}
parentSpan.end(); // <---親Span End
});
ご覧いただいたようにHelidonとNode.jsのそれぞれのアプリケーションをAPMで監視するためのアプローチはほぼ同じで、表示されるSpanには若干の違いはあるものの、同様に自動計装、手動計装ができることが分かりました。
以上が3つのアプリケーションのデプロイとAPMの設定方法になります。
APMをちょっと試してみたいが設定手順がドキュメントだとよく分からない、わざわざアプリケーションを用意するのがちょっと大変という方に向けに、できるだけ単純なアプリケーションと設定内容にしてみました。
インフラ担当だとあまり馴染みのないアプリケーションの監視ですが、少しでもお役に立てれば幸いです。