0
0

More than 1 year has passed since last update.

Application Performance MonitoringでWEBアプリを監視する③

Last updated at Posted at 2023-08-24

最後は、OpenTelemetryを用いて、APMでNode.jsアプリケーションの監視を行う方法を紹介します。

image.png

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
  • アプリケーションへのアクセス (※VCNのセキュリティ・リストで8383をオープンしておく)
    image.png

  • 気象庁のAPIにアクセスした結果が表示される
    image.png

  • APMのトレースにopentelemetrydemoのトレース・データが表示されていればOK
    image.png

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
  }
  • APMには、HTTP RequestのSpanとして記録がされている -> 自動計装(Automatic Instrumentation)
    image.png
//明示的に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
    });
  • APMでは指定したSpan名で親・子Spanが記録されている -> 手動計装(Manual Instrumentation)
    image.png

ご覧いただいたようにHelidonとNode.jsのそれぞれのアプリケーションをAPMで監視するためのアプローチはほぼ同じで、表示されるSpanには若干の違いはあるものの、同様に自動計装、手動計装ができることが分かりました。

以上が3つのアプリケーションのデプロイとAPMの設定方法になります。
APMをちょっと試してみたいが設定手順がドキュメントだとよく分からない、わざわざアプリケーションを用意するのがちょっと大変という方に向けに、できるだけ単純なアプリケーションと設定内容にしてみました。
インフラ担当だとあまり馴染みのないアプリケーションの監視ですが、少しでもお役に立てれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0