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

[前回](https://qiita.com/western24/items/bfd9bd9e6a20afe43376)は、Spring BootとAPM Javaエージェントのデプロイを行いました。今回は、APM Java Tracerを用いて、APMでHelidonアプリケーションの監視を行う方法を紹介します。

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

OCI APMは、OpenTelemetryに対応しており、各フレームワークのトレーシング機能を有効化することによってAPM側でそのテレメトリーデータを受信し、APM Javaエージェントの場合と同様にトレースデータして表示させることが可能です。

まずは、Helidonベースのアプリケーションをデプロイすると同時にAPM Java Tracerを有効化しAPMで動作させる設定を行います。

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

```shell
#Dockerインストール
sudo dnf install -y docker

#アプリのダウンロード&解凍
wget https://github.com/western24/apmdemo/raw/main/helidonsedemo.zip
unzip helidonsedemo.zip

#アプリケーションの定義ファイルを開き
vi /home/opc/helidonsedemo/src/main/resources/application.yaml

 ##APMのEndpointとPrivateデータキーを編集
 data-upload-endpoint: https://xxxxxx.apm-agt.us-ashburn-1.oci.oraclecloud.com
 private-data-key: xxxxxxxx

#DockerイメージのBuild&Run 
cd helidonsedemo
docker build -t helidon-quickstart-se .
docker run --rm -p 8282:8282 helidon-quickstart-se:latest

```
- アプリケーションへのアクセス(※VCNのセキュリティ・リストで8282をオープンしておく)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/30da5345-bba4-a51f-01b6-5751b8c3039d.png)

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

- APMのトレースにHelidondemoのmainとHTTP Requestのトレース・データが表示されていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/5c4e61dc-cea6-375f-b0d1-e3287f6dad8b.png)

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

APM Java Tracerの場合は、APM Java Agentのようにエージェントをダウンロードしてインストールするのではなく、フレームワークにあるトレーシング機能を有効にします。
Helidonの場合は、pom.xmlに以下の依存性を追加します。(Helidon 3 SEの場合)
※今回のアプリケーションのpom.xmlには既に追加されています。

```xml
<dependency>
    <groupId>io.helidon.tracing</groupId>
    <artifactId>helidon-tracing-opentracing</artifactId>
</dependency>         
<dependency>
    <groupId>com.oracle.apm.agent.java</groupId>
    <artifactId>apm-java-agent-helidon3</artifactId>
    <version>[1.8.3326,)</version>
</dependency>
```

そして、application.yamlには、テレメタリーデータの送信先に関する設定情報を追記します。APMのアップロードするためのAPMに表示するサービス名、エンドポイントとPrivateデータ・キーは必須項目です。

```yaml
tracing:
  service: helidondemo
  data-upload-endpoint: https://xxxxxxx.apm-agt.us-ashburn-1.oci.oraclecloud.com
  private-data-key: xxxxxxxxxxxxxxxxxx
```
上記の設定を追加することによりHelidonのAPM Java Tracerが動作します。
トレーシングを有効化することでテレメタリデータを収集することを<font color="RED">Instrumentation(計装)</font color>と呼びますが、これは<font color="RED">自動計装(Automatic Instrumentation)</font color>と<font color="RED">手動計装(Manual  Instrumentation)</font color>の２つの種類があります。
自動計装は、プログラム・コード内で実行される様々イベントにて自動的に計測されるもので、手動計装は、ユーザー自身でSpanの範囲を指定し、計測したい処理範囲を自身で決定することができます。

先ほど確認したAPMのトレースには、HelidondemoのmainとHTTP Requestの２つのトレースデータが取得されていたのですが、実はこれ、それぞれ自動計装と手動計装されたものでした。
ちょっと<b>main.java</b>のコードを見てみると

```java
//気象庁のREST APIコールの部分には、特にトレーシングに関するコードは追記していない
try {
    HttpGet request = new HttpGet("https://www.jma.go.jp/bosai/forecast/data/overview_forecast/130000.json");
    CloseableHttpClient httpClient = HttpClients.createDefault();
    CloseableHttpResponse response = httpClient.execute(request);
    res.headers().add("Content-Type", "application/json");
    res.send(EntityUtils.toString(response.getEntity()));
    } catch (Exception e) {
```
- 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/27a667ae-ddb0-8557-7bba-de4da0e05411.png)


```java
//明示的にSpanの範囲を指定している
try {
    Tracer tracer = webServer.configuration().tracer();
    Span span = tracer.spanBuilder("main").start();    // <----親Span Start
    for(int i = 0; i < 3; i++) {
        doWork(i, span);   // <----子Span
    }
    span.end(); // <---親Span End
} catch(Exception e) {
```
- APMでは指定したSpan名で親・子Spanが記録されている -> <font color="RED">手動計装(Manual  Instrumentation)</font color>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/1cb88175-c631-1eac-16bb-d60e0cc42783.png)

プログラム・コードは最小限で記述していますので、ご自身でコードをカスタマイズしながらAPMの挙動を確認するとより理解しやすいのではないかと思います。また、[ドキュメント](https://docs.oracle.com/ja-jp/iaas/application-performance-monitoring/doc/configure-apm-tracer.html)には、Helidon以外のMicronautやMavenなどのフレームワークに対する設定も記述がありますので、こちらもご参考にして下さい。
[次回](https://qiita.com/western24/items/9071df20c3dd528df94e)は、Node.jsのアプリケーションのデプロイとOpenTelemetryの設定を紹介します。