Azure App Service上のPHPにElastic APMを設定する方法

Azure App Service上で動かすPHPにElastic APMを設定する機会がありましたので、注意点など含めて紹介しようと思います。
# PHPでElastic APMを使う方法
公式ドキュメントはこちら
https://www.elastic.co/guide/en/apm/agent/php/1.x/intro.html
通常であればrpm/dpkg/apkでインストールするだけですが、今回はひと手間必要です。
## Elastic Cloud用の設定
この部分はApp Serviceでなくても必要になる部分です。

Elastic Cloudにデータを送る設定を`php.ini`に記載する必要があります。
https://www.elastic.co/guide/en/apm/agent/php/1.x/configuration.html#configure-ess
```
elastic_apm.server_url=APM_SERVER_URL
elastic_apm.secret_token=TOKEN
elastic_apm.service_name=SERVICE_NAME
```

`elastic_apm.server_url`: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 -> PHP
![スクリーンショット 2022-08-22 10.10.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/805b6d70-316b-ad40-5472-f5f74f903410.png)


URL(`elastic_apm.server_url`)を変更したい場合はElastic Agentをどこかに展開すれば可能となります。
APM Agent -> 新しく展開したElastic Agent -> Elasticsearch
というデータの流れになります。

Token(`elastic_apm.secret_token`)を変更する場合は
Fleet -> Agent Policies -> Elastic Cloud Agent Policies -> Elastic APM -> Settings -> Agent Authorization -> Secret token
に設定した文字列を入力して右下の"Save Integration"をクリックします。
![スクリーンショット 2022-08-18 14.52.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/a61d9c81-01ea-f20f-99c1-4a7bc83a3943.png)

`elastic_apm.service_name`は自由です。好きな文字列を入れてください。

Kibana UIで確認した以下の部分をコピーして`php.ini`として保存しておきましょう
(実際には\<address>と\<token>にはそれぞれの環境の文字列が入っています)

```ini
elastic_apm.server_url="https://<address>:443"
elastic_apm.secret_token="<token>"
elastic_apm.service_name="My service"
```
## App Serviceのための設定
App Serviceでは/home以外はPersistentではないため、ライブラリ/ソースコード/iniファイルを手動で用意し、/home以下に配置して環境変数でその場所を指定します。
### 必要なもの
こちらからダウンロードします。
https://github.com/elastic/apm-agent-php
apm-agent-php.tarを持ってくるのが早いです。
2022年8月現在で最新は以下のものです。
https://github.com/elastic/apm-agent-php/releases/download/v1.5.2/apm-agent-php.tar

tarを展開して`opt/elastic/apm-agent-php`に移動します。
#### extensions
PHPバージョンに応じて必要なファイルが異なります。例えばPHP8であれば`elastic_apm-20200930.so`です。
#### src
`src`配下全て必要です
#### php.ini
先ほど作成したものに以下の２行を追加します
```ini
extension=/home/site/wwwroot/extensions/elastic_apm-20200930.so
elastic_apm.bootstrap_php_part_file=/home/site/wwwroot/src/bootstrap_php_part.php
```
`extension`と`bootstrap_php_part_file`で指定しているフォルダ構成は`apm-agent-php.tar`を展開したそのままの構成をApp ServiceにDeployした場合の例です。
ディレクトリ構造を変える場合は適宜変更してください。

#### PHPファイル
表示できれば何でも良いので以下のようなものを用意しました。
```index.php
<?php phpinfo(); ?>
```

## Deployment準備
ZIPでアップロードするかGitHubを使用するかで少し方法が異なります。
### ZIPでアップロードの場合
`extensions`,`src`,`php.ini`,`index.php`をまとめてZIPに固めます。
`zip -r php.zip .`

### GitHubを使用する場合
上記をまとめてGitHubにPushしておきましょう。

## App Service 作成
ここはElastic向けのものはありませんので詳細は省きます。
こんな感じで作成すればよいでしょう。
![スクリーンショット 2022-08-17 14.28.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/bf9a3a79-78d7-4c33-420e-ece9621fdad6.png)

## iniファイル読み込みディレクトリ設定
そのままだと上記で設定した`php.ini`を読み込んでもらえません。
こちらのサイトにiniファイルを読み込むディレクトリの設定方法が記載してあります。
https://docs.microsoft.com/ja-jp/azure/app-service/configure-language-php?pivots=platform-linux

UIから行う場合は以下のように設定->構成->新しいアプリケーション設定に入力します。
これにより`/home/site/wwwroot`にあるiniファイルを読み込んでくれます。
![スクリーンショット 2022-08-17 14.36.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/296c8f10-d821-6153-b72f-1c24df52f8b9.png)

## Deploy
どの方法を使うにせよ展開先は`/home/site/wwwroot`です。
### ZIPでのDeploy
ZIPファイルをアップロードします。こちらはUIから行えず先程のZIPファイルのあるローカル環境から行います。
ローカル環境にはAzure CLIをインストールしておきます。
https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli

下記コマンドを実行すると自動的にZIPがアップロードされ`/home/site/wwwroot`に展開されます。
`az webapp deploy --resource-group <group name> --name <app name>  --src-path php.zip`
### GitHubからのDeploy
デプロイセンターの設定からソースとしてGitHubを選んでも同様に出来ます。
![スクリーンショット 2022-08-17 14.59.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/fd526c91-305e-c1ad-71c0-5b4d85a32871.png)

# 確認
## サイトにアクセス
App Serviceの概要へ戻りURLの横にあるリンクをクリックしましょう。
`https://<app name>.azurewebsites.net`
となっているはずです。
このように表示されればOKです。
![スクリーンショット 2022-08-17 15.05.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/3edb0663-459c-29d9-40db-0edafde010ee.png)

## Elastic APMでの確認
Elastic CloudのKibanaにアクセスしてObservability -> APMをクリックします。
以下のように`Name`部分に`php.ini`の`elastic_apm.service_name`で設定した値(今回だと`php8`)が表示されていれば成功です。
![スクリーンショット 2022-08-17 15.07.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/f2c38291-de7b-0a2d-fd02-5229da7764bf.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)