PHPからStackDriver ErrorReportingに書き込む

今回はGKEを使っている場合にStackDriver Error Reportに書き込みたくてやっていたのですが、思いの外ドキュメントが少なかったので、備忘録として残します。

ちなみにPHPのErrorReport書き込みはまだベータ版です(2019/09/06現在)ですので
使用する際は公式のドキュメントを一読することをお勧めいたします。

公式ドキュメント[PHP 用 Error Reporting の設定](https://cloud.google.com/error-reporting/docs/setup/php?hl=ja)

# 出来上がるとこんな感じになります
![190904-0001-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/2aaae8b7-256d-26c6-e3b7-9c242ba06979.png)

# GoogleConsoleをいれておけば携帯にも通知が届きます。

<img width="375" alt="IMG_FFB379BA6589-1.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/9d6e280b-7b35-bcb2-076c-a385de266117.jpeg">

# では早速

## まずはサービスアカウントを作成します
<img width="1554" alt="190906-0001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/60072874-c149-0172-2269-2a1be0336db5.png">

APIとサービス > 認証情報 > 認証情報を作成 > サービスアカウントキーを選択します

## 必要な権限を割り当てる

![190906-0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/e97d6b05-1a4c-099e-623d-8a0510b52a61.png)

新しいサービスアカウントを選択して、アカウント名を任意でつけます
役割は 
・Logging > ログ書き込み
・ErrorReporting > エラー書き込み

この2つの権限が必要です。

作成するとJSONファイルがダウンロードされますので、それを保持しておきます。
ローカル環境のdokcer-composeなどで試す場合はプロジェクトが参照できるパスにおいてください


# JSONをセキュアに扱いたい場合はこちら

## Secret作成

JSONファイルはGitリポジトリにあげずにk8sにSecretファイルとしてあげてコンテナにマウントします。

```
kubectl create secret generic [secretName] --from-file credentials.json=./************.json
```

secretNameは任意です。credential.jsonは変更しても大丈夫です。
この名前でUPされます、先ほど保持しておいたjsonファイルのパスを指定します。

![190807-0001-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/9017087e-e0eb-f4f3-9761-6c0e4871a8d1.png)

## Podにマウントする

DeploymentYAMLに記載します

```
        - containerPort: 9000
        # ボリュームマウント
        volumeMounts:
        - mountPath: /etc/gcp
          name: gcp-sercret
          readOnly: true

~ skip
      #一番下に追加
      # シークレットを入れる
      volumes:
      - name: gcp-sercret
        secret:
          secretName: [SecretName]
```

これでdeployするとpodの/etc/gcp/credentials.jsonにマウントされます。

# Composerから必要なパッケージをインストール

```
$ composer require google/cloud-logging google/cloud-error-reporting
```

Google/Authのバージョンが古いと怒られると思うのでその場合はアップデートしてください

# FWのExceptionを管理している場所に組み込む

```php
use Google\Cloud\Logging\LoggingClient;
use Google\Cloud\ErrorReporting\Bootstrap;
use Google\Cloud\Core\Report\SimpleMetadataProvider;

{
~skip
    //FWのexceptionを拾える場所で実行する

    //jsonのパス
    putenv('GOOGLE_APPLICATION_CREDENTIALS=' . '/etc/gcp/credentials.json');

    $logPsr = (new LoggingClient())->psrLogger('app-error', [
        'batchEnabled' => true,
        'batchEnabled' => true,
        'batchOptions' => ['numWorkers' => 2],
        'metadataProvider' => new SimpleMetadataProvider(
            [], '', [サービス名]
        )
    ]);
    Bootstrap::init($logPsr);
    Bootstrap::exceptionHandler($exception);
```

ここで注意したいのが、　**サービス名がないとログが書き込まれません。**
これを利用してローカルやテスト環境は空文字、検証環境や本番環境はサービス名を環境差分として入れたりすると環境ごとに別れた形でレポートしてくれます。
実際はlogPsrの作成はラップしても良いでしょう。

参考：[Stackdriver Error Reporting for PHPをGCE上で使ってみる](https://qiita.com/mshibuya/items/8600d41f8928f18de76a)

# SimpleMetadataProviderの引数はドキュメントを参照

[ドキュメント](https://github.com/googleapis/google-cloud-php/blob/master/Core/src/Report/SimpleMetadataProvider.php)

```
     public function __construct(
         $monitoredResource = [],
         $projectId = '', 
         $serviceId = '', 
         $versionId = '', 
         $labels = [] 
      )
```

バージョンIDや、ラベルを使う場合は引数を利用します。

# まとめ
参考記事にも記載がありましたが、まだベータ版ということもあり、参考記事が少ないので少しハマりましたが、現状正常にエラーレポートを作成してくれています。

ErrorReportをSlackにもおくりたいのですが、、メニューがきえた..？
やり方がわかる方は教えてください
早くGAすることを願っております。