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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/068a7775-72f3-e13c-18bd-4153b5633704.png)

OCI APMは、JaegerやZipkinなどのOpenTelemetryおよびオープンソースのトレース・ツールをサポートしています。Node.jsのアプリケーションのトレース・データをAPMにアップロードする方法としては、OpenTelemetryやZipkinトレーサなどがありますが、ここではOpenTelemetryを用いた設定方法を紹介します。


## アプリケーションのデプロイ & OpenTelemetryの有効化

```shell
#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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/1459c37b-254d-3a15-ef22-49d5e1b5c47c.png)

- 気象庁のAPIにアクセスした結果が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/569f6783-62d0-9056-bee3-09dbddf207ed.png)

- APMのトレースにopentelemetrydemoのトレース・データが表示されていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/22ca4ff0-855c-d06d-89fc-3e0a8935ea00.png)

## OpenTelemetryに必要な設定
まずは動作させるところまでの環境を構築できたところで、実際にNode.jsのアプリケーションでAPMを使うためには、何の設定をしなければらないないかという観点で解説します。

OpenTelemetryの場合は、APM Java Agentのようなエージェントをダウンロードしてインストールするのではなく、OpenTelemetryの[ドキュメント](https://opentelemetry.io/docs/instrumentation/js/getting-started/nodejs/)に従って、OpenTelemetry用の起動スクリプトを準備し、アプリケーション起動時に一緒に読み込ませるというのがおおまかな設定の流れです。
今回のアプリケーションでは、tracing.jsというのが起動スクリプトになり、必要なパラメータを指定しています。

```javascript
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でテレメタリデータを収集することを<font color="RED">Instrumentation(計装)</font color>と呼びますが、これは<font color="RED">自動計装(Automatic Instrumentation)</font color>と<font color="RED">手動計装(Manual  Instrumentation)</font color>の２つの種類があります。
自動計装は、プログラム・コード内で実行される様々イベントにて自動的に計測されるもので、手動計装は、ユーザー自身でSpanの範囲を指定し、計測したい処理範囲を自身で決定することができます。

このアプリケーションもHelidonの場合と同様に単純な２つの処理をしているだけです。そしてそれぞれ処理は同じように自動計装と手動計装されています。app.jsのコードをちょっと見てみると


```javascript
 //気象庁の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として記録がされている -> <font color="RED">自動計装(Automatic Instrumentation)</font color>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/40c8c95c-e92f-1b7d-b87f-ebde441bfd16.png)

```javascript
//明示的に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が記録されている -> <font color="RED">手動計装(Manual  Instrumentation)</font color>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/a33a7691-d85c-0119-8275-5199d18fb50b.png)


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

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