Azure App Service上のJava + TomcatにElastic APMを設定する方法

Azure App Service上で動かすTomcatにElastic APMを設定する機会がありましたので、注意点など含めて紹介しようと思います。
# Java+TomcatでElastic APMを使う方法
公式ドキュメントはこちら
https://www.elastic.co/guide/en/apm/agent/java/current/setup.html
手順は変わりませんがApp Serviceで設定する上で少し注意する点があります。

## App Serviceのための設定
### 必要なもの
APM AgentとWARファイルだけです。
APM Agentはこちらからダウンロードできます。
https://search.maven.org/search?q=g:co.elastic.apm%20AND%20a:elastic-apm-agent

WARファイルはTomcatのサンプルファイルを使用します。
https://tomcat.apache.org/tomcat-9.0-doc/appdev/sample/sample.war
### App Service作成
ここはElastic向けのものはありませんので詳細は省きます。
こんな感じで作成すればよいでしょう。
![スクリーンショット 2022-08-17 22.48.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/843bbbba-5d9c-71ce-7178-828f67fba47e.png)

### 環境変数CATALINA_OPTS設定
#### 設定情報
以下を設定する必要があります。
- javaagent
    - Elastic Java APM Agentへのパス
    - `/home/site/libs`で固定されています
- elastic.apm.server_urls
    - APMデータの送付先。Elastic APM Agentがデータを送信する先は、Elastic Cloudに自動的に建てられているElastic Agent(APM Agentとは別)です。
- elastic.apm.secret_token
    - アクセストークン
- elastic.apm.service_name
    - Elastic APMのUIに表示する文字列

これらの設定は以下から確認できます。
Fleet -> Agent Policies -> Elastic Cloud Agent Policies -> Elastic APM -> APM Agents -> Java
![スクリーンショット 2022-08-22 17.58.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/88ecc576-3f0d-28b9-b59d-3644198f4dd9.png)

`server_url`,`secret_token`の変更方法についてはこちらの記事に記載しております。
https://qiita.com/takeo-furukubo/items/1b2d7825927a8defe147#elastic-cloud%E7%94%A8%E3%81%AE%E8%A8%AD%E5%AE%9A

#### 設定方法
実際にApp Serviceに設定する際には、設定->構成->新しいアプリケーション設定で設定を行います。
(実際には\<address>と\<token>にはそれぞれの環境の文字列が入っています)

`CATALINA_OPTS`
`-javaagent:/home/site/libs/elastic-apm-agent-1.33.0.jar -Delastic.apm.service_name=tomcat-test -Delastic.apm.server_urls=https://<address>:443  -Delastic.apm.secret_token=<token>`

`elastic.apm.service_name`には識別しやすい文字列を入れておきましょう(今回であれば`tomcat-test`)
![スクリーンショット 2022-08-17 22.51.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/d94341b0-49aa-0c7c-cdfa-9fe39de06c5d.png)


### App ServiceへのDeploy方法
Tomcatを使用する場合はこちらのドキュメントの方法で行います。
https://docs.microsoft.com/ja-jp/azure/app-service/deploy-zip?tabs=cli#deploy-warjarear-packages

ローカル環境にはAzure CLIをインストールしておきます。
https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli

#### WARファイルのDeploy
`az webapp deploy --resource-group <group name> --name <app name> --src-path sample.war --type war`

`/home/site/wwwroot`に`app.war`という名前で展開されます。
#### APM Agent(jar)ファイルのDeploy
`az webapp deploy --resource-group <group name> --name <app name> --src-path elastic-apm-agent-1.33.0.jar --type lib --target-path elastic-apm-agent-1.33.0.jar`

ドキュメントにはtarget-pathの記載が有りませんが、記載しないと
```
An error occured during deployment. Status Code: 400, Details: Path must be defined for type='Lib'
```
というエラーになります。

target pathと言いながら`/home/site/wwwroot`とか書くとうまくいきません。
このコマンドでは`/home/site/libs`に`--target-path`で指定した名前で配置されます。ですので上記のようにそのままjarファイル名を記述しています。

# 確認
## サイトにアクセス
App Serviceの概要へ戻りURLの横にあるリンクをクリックしましょう。
`https://<app name>.azurewebsites.net`
となっているはずです。
このように表示されればOKです。
![スクリーンショット 2022-08-23 15.01.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/c59367d5-ed20-9106-247f-477439335e49.png)
## Elastic APMでの確認
Elastic CloudのKibanaにアクセスしてObservability -> APMをクリックします。
以下のようにName部分に`elastic.apm.service_name`で設定した値(今回だと`tomcat-test`)が表示されていれば成功です。
![スクリーンショット 2022-08-23 15.21.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/2b0730a0-26e5-f84d-c953-db0c99f63e22.png)

# まとめ
Elastic APMは様々な環境で簡単にAPMデータを取得することが可能です。ぜひお試しください。

### Elastic Cloud 無料トライアル
こちらからElastic Cloudの14日間無料トライアルを是非お試しください
[Elastic Cloud 無料トライアル](https://cloud.elastic.co/)

手順は下記リンクをご参照ください
[Elastic Cloud について　〜実際にデプロイメントを作ってみよう〜](https://qiita.com/tomo_s_el/items/3584d0b1fabb0bafa4fa)