Application InsightsをPHPのシステムに組み込む ～PHP SDKの使い方編～

[Application InsightsをPHPのシステムに組み込む ～基本情報とテレメトリの整理編～ - Qiita](https://qiita.com/koujiYamada/items/c5f50aa6eb8704d1a7f0)
の続きです。

## SDKの組み込み
PHPのライブラリなのでcomposerで組み込みます。

```bash
$ composer require microsoft/application-insights
```

ちなみにGithubは以下
https://github.com/Microsoft/ApplicationInsights-PHP


今現在の最新バージョンは`v0.4.4`で、PHPのバージョンが`5.4.2`以上である必要があります。（あまりマメにメンテされているとは言い難いです…）
簡単な使い方は`README.md`にある通りなんですが、以下でもう少し細かくパラメータなどを見ていきます。

## コンテキストの種類、プロパティ一覧
### その前にコンテキストってなに
[Azure Application Insights Telemetry のデータ モデル - テレメトリ コンテキスト | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/application-insights/application-insights-data-model-context)

要は様々なテレメトリで共通的にセットしておけるProperty
調査しきれていないので、未使用部分について説明を割愛してます

- Session
    - id（セッションID）  
        省略してフレームワークに任せる
    - isFirst（*調査中*）  
        用途不明、未使用
- User
    - id（ユーザID）  
        システムのユーザIDは認証通過後にauthUserIdにセットするので今の所未使用
    - accountId（アカウントID）  
        ログインIDをセットするか未使用にするか検討中
    - authUserId（認証ユーザID）  
        認証通過後にシステムのユーザIDをセット
- Application
    - ver（バージョン情報）  
    クライアント側での工夫も必要になるが、Application.verにクライアントのバージョン情報を乗せておくとリリース後にクライアントがキャッシュのせいでうまく動いていないなどのトラブルの確認ができる
- Location
    - ip（クライアントIPアドレス）  
        省略でそのままデータが表示される
- Operation
    - id（操作ID）  
        省略しておくとAPI単位でいい感じにグルーピングされるので便利
    - parentId（親操作ID）  
        処理の入れ子を意識していないため、未使用
    - name（操作名）  
        クライアントから取得した操作の概要文字列をセットしておくと調査が捗る
    - syntheticSource（代理データのソース）  
        用途不明、未使用
    - correlationVector（*調査中*）  
        用途不明、未使用
- Device  
    使用用途なし（自動設定に任せる）
- Cloud  
    使用用途なし（自動設定に任せる）
- Internal  
    使用用途なし（自動設定に任せる）

## テレメトリ発行時のパラメーター詳細
### Trace
``` php
$telemetryClient->trackMessage($message, [$severityLevel = NULL], [$properties = NULL]);
```
- message  
    ログの内容
- severityLevel  
    ログレベル的なもの  
    定数が`\ApplicationInsights\Channel\Contracts\Message_Severity_Level`に用意されてあるのでそれを使う
    - Verbose（冗長）
    - Information（情報）
    - Warning（警告）
    - Error（エラー）
    - Critical（致命的）
- properties  
    付加情報（Array[^1]）   
    ここで追加した値はAzure PortalのFilterの条件として使える

### Request
``` php
$telemetryClient->trackRequest($name, $url, $startTime, [$durationInMilliseconds = 0], [$httpResponseCode = 200], [$isSuccessful = true], [$properties = NULL], [$measurements = NULL]);
```
もしくは以下のように呼出前後に分けてCallすることも可能

``` php
$requestData = $telemetryClient->beginRequest($name, $url, $startTime);
  // 外部API呼出処理
$telemetryClient->endRequest($requestData, [$durationInMilliseconds = 0], [$httpResponseCode = 200], [$isSuccessful = true], [$properties = NULL], [$measurements = NULL]);
```
- name  
    リクエスト名（自由につけて構わない）
- url  
    リクエストURL
- startTime  
    呼出時刻（UnixTime）
- durationInMilliseconds  
    所要時間（ミリ秒）
- httpResponseCode  
    HTTPのレスポンスコード
- isSuccessful  
    呼出の成否（httpResponseCodeでもだいたい分かるとは思うが…）
- properties  
    付加情報（Array[^1]）   
    ここで追加した値はAzure PortalのFilterの条件として使える
- measurements  
    計測情報（Array[^2]）   
    ここで追加した値はAzure PortalのFilterの条件として使える

### PageView
現状のシステムで使っていないため、割愛します

### Custom Event
``` php
$telemetryClient->trackEvent($name, [$properties = NULL], [$measurements = NULL]);
```
- name  
    テレメトリの名称  
    特に決まりはなく、文字列で自由につけられる模様
- properties  
    付加情報（Array[^1]）   
    ここで追加した値はAzure PortalのFilterの条件として使える
- measurements  
    計測情報（Array[^2]）   
    ここで追加した値はAzure PortalのFilterの条件として使える

### Exception
``` php
$telemetryClient->trackException($exception, [$properties = NULL], [$measurements = NULL]);
```
- exception  
    PHPの`Exception`を継承したinstance
- properties  
    付加情報（Array[^1]）   
    ここで追加した値はAzure PortalのFilterの条件として使える
- measurements  
    計測情報（Array[^2]）   
    ここで追加した値はAzure PortalのFilterの条件として使える

### Dependency
``` php
$telemetryClient->trackDependency(
        $name,
        [$type = ""],
        [$commandName = NULL],
        [$startTime = NULL],
        [$durationInMilliseconds = 0],
        [$isSuccessful = true],
        [$resultCode = NULL],
        [$properties = NULL]);
```
- name  
    テレメトリの名称  
    特に決まりはなく、文字列で自由につけられる模様  
    DBのクエリー情報では`"Query"`を指定している  
- type  
    テレメトリの種別  
    こちらも特に決まりはなく、文字列で自由につけられる模様  
    DBのクエリー情報では`"MySQL"`を指定している  
- commandName  
    外部システムで実行するコマンドの名称  
    DBのクエリー情報ではクエリーそのものを指定している  
- startTime  
    外部システム呼び出し時間（UnixTime）  
    Azure Portal上でタイムライン形式で表示する際に有益  
- durationInMilliseconds  
    処理時間（ミリ秒）  
    Azure Portal上でタイムライン形式で表示する際に有益  
- isSuccessful  
    呼出が成功したか（Boolean）
- resultCode  
    結果コード（Integer）
- properties  
    付加情報（Array[^1]）   
    ここで追加した値はAzure PortalのFilterの条件として使える

## メモ
- すべてのpropertiesに共通的に値を入れる場合はラッピングクラス化する

[^1]: 1次元配列で、value側は文字列を使用できる（多次元配列にするとログ自体が出力されなくなる）。Key名は英数字で大文字で始めたほうがAzure Portal上での見た目がいい。
[^2]: 1次元配列で、value側は数値（double）を使用できる（多次元配列にするとログ自体が出力されなくなる）。Key名は英数字で大文字で始めたほうがAzure Portal上での見た目がいい。