GAS と Stackdriver(Logging, Error Reporting) を連携させる

[Apps Script Advent Calendar 2017](https://qiita.com/advent-calendar/2017/gas)に App Maker 記事ばっかり書いてきたけど最後の日なので GAS ネタを書く。

以前 GAS のログ出力方法について記事を書いたのだけれど、このときは Stackdriver についてよく知らなかったので、Googleドキュメントに出力するというやり方で書いた。
 [Google Apps Scriptのログ設計 #gasja - Qiita](https://qiita.com/howdy39/items/4dc11af7b1c74c17f7f7)

上記記事を書いた後に Stackdriver を使う機会があって、**こいつはかなり便利** というのがわかったので Stackdriver と連携させるとどんな感じなるのかを解説する。



## Stackdriver
Stackdriver には3種類ある。

* Stackdriver Logging
* Stackdriver Error Reporting
* Stackdriver Monitoring

本記事では Logging を使ったログ出力と、Error Reporting を使ったエラー報告（通知）について記述する。[^1]
[^1]: GAS で Monitoring までつかうことはあんまりないかと

# Stackdriver Logging
## console を使ってログを出力
ログを出力するには [console](https://developers.google.com/apps-script/reference/base/console) を使う。

### 動作確認用コード
次のような `logTest` function を作成する。
※異なる log level 出力と、時間計測用の time, timeEnd が用意されている。

```javascript:Code.gs
function logTest() {
  console.time('LABELA');
  console.log('log');
  console.info('info:%s', 'フォーマットを指定することも可能');
  console.warn('warn');
  console.error('error');
  console.timeEnd('LABELA');
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/a387b12f-c8eb-57d7-f054-7adbd8aad8c8.png)


### 実行&ログを確認
Run > Run Function で `logTest` 実行し、次の手順でログを確認する。


#### View > Stackdriver Logging
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/3da20ef9-df97-8355-a899-fc7ffef06c1c.png)

すると次のようなログを確認できる画面が表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/0efaa6ee-66b0-f33f-ad25-cd5c84bbdf72.png)

### Stackdriver Logging 基本のキ

本記事は Stackdriver Logging の説明をするのが主旨ではないので最低限の事だけ記載しておく。[^2]
[^2]: ログを Cloud Storage に出力したりとか本当に色々出来る(色々手を出すとお金もかかってくるが）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/8e13a8be-a0d0-a5fd-ac30-cf655d436931.png)

1. ログを更新（再取得）
2. ログを自動で更新（自動で再取得）
3. 簡易フィルター
4. 高度なフィルター
5. ログレベルでフィルター
6. 時間でフィルター
7. ログ表示方法を変える（自動で展開/降順昇順）
8. 展開




# Stackdriver Error Reporting

## 動作確認用コード
次のような `errorReportTest` function を作成する。
※catch されなかった throw が Error Reporting に入ってくる。

```javascript:Code.gs
function errorReportTest() {
  throw 'エラーのテスト';
}

```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/65af3314-1228-489b-eb1e-cc1dad3b9dca.png)



## 実行&ログを確認
Run > Run Function で `errorReportTest` 実行し、次の手順でエラーを確認する。

### View > Stack Driver Error Reporting

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/38f33e75-5289-2f66-d7ae-3c8a43b862c3.png)

すると次のようなエラーを確認できる画面が表示される。

|![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/1bffe943-67db-bc2e-225b-ded63c17989e.png)|
|:-:|



## Stackdriver Error Reporting 基本のキ

本記事は Stackdriver Error Reporting の説明をするのが主旨ではないので最低限の事だけ記載しておく。

|![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/f2492f1f-28d7-fa24-d089-245d28a09651.png)|
|:-:|

1. ステータスでフィルター(6と関連）
2. エラーレポートを自動で更新（自動で再取得）
3. エラーをメールで通知する
4. フィルター
5. 時間でフィルター
6. ステータスを変更

ステータスは、解決したら `Resolved` に変更して一覧から消す、みたいな使い方をする。



# Logging と Error Reporting を利用したコード例とキャプチャ
それぞれを利用したコード例を記載する。
※[Google Apps Scriptのログ設計 #gasja - Qiita](https://qiita.com/howdy39/items/4dc11af7b1c74c17f7f7#%E3%82%B3%E3%83%BC%E3%83%89)で書いたコードと比較して圧倒的にスッキリしているのがわかるかと思う。

## コード
```javascript:Code.gs
function myFunction() {
  console.info('myFunctionStart');
  
  // ここにメインの処理
  
  throw 'エラーが発生1';
  console.info('myFunctionEnd');
}

```

|![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/bd6eedf0-2974-9705-70f5-5f57eda3a6ba.png)|
|:-:|


## 画面キャプチャ

### Stackdriver Logging

|![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/df6d5919-1e19-03b3-b809-102bc7b0dff7.png)|
|:-:|

### Stackdriver Error Reporging

|![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/52459630-682b-f40e-ca6e-62a7a0816121.png)|
|:-:|


ちなみにメール通知をONにするとこんな感じ

|![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/d7190ed1-5abb-6037-206a-8c2f7674f692.png)|
|:-:|



# 参考サイト
[Class console  |  Google Apps Script](https://developers.google.com/apps-script/reference/base/console)
[Stackdriver Logging  |  Google Cloud Platform](https://cloud.google.com/logging/?hl=ja)
[Stackdriver Error Reporting  |  Google Cloud Platform](https://cloud.google.com/error-reporting/?hl=ja)