Cloud Run functions × TypeScript 開発をしよう！【監視：Cloud Logging と Monitoring で異常にいち早く気づく】

# はじめに
この記事では以下のことについて説明しています。
- Cloud Logging でログ調査するTips
- Monitoringでエラーを検知する方法
---

Cloud Logging はエラーや異常調査の際に真っ先に確認するサービスです。Cloud Run functions の実行結果が失敗になっていた時、まず Cloud Logging で調査を始めると思います。ここで何も考えずに使っているとエラーの原因まで辿り着くのに時間がかかってしまいます。そこで Cloud Logging を使う上で効率よく情報を探す方法をシェアしたいと思います。

また、エラーが発生したこと自体に気づくことができないとサービスのダウンタイムが長くなって機会損失にもなってしまいます。ということでエラーが発生したら通知をしてくれるような設定を Monitoring にて行う手法を紹介します。

# Cloud Logging を便利に使う
Cloud Logging、開いた時の状態のまま使うといろんな情報が入り込んでいて本当に見づらいです。
とりあえず以下のチェックリストに従って情報を絞り込むことから始めましょう。

### サービスを指定する
左端のサイドパネルでログを調べたいサービスを指定しましょう。ここを選択することで結構絞り込めます。

![スクリーンショット 2024-12-24 22.29.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/537c9640-6106-521a-38b8-c2ff4238d383.png)

### ざっくり時間を絞り込んでから詳細に絞り込む
Cloud Logging のパネル右上にある時間のバーをクリックすると、時間を選択できるUIが現れます。これでざっくり「何日前」だとか「何時間前」を絞り込みましょう。

![スクリーンショット 2024-12-24 22.32.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/350cf72d-409f-fedc-a983-baca6ff679c3.png)

その後、時間のバーを操作してより詳細に調べていきます。

![output_log.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/7265f056-1161-ae94-e668-72dc9295bd0f.gif)


### ログクエリを活用して絞り込む
絞り込む時に便利な項目は以下です。

- **severity**
ログのステータスを示すフィールドです。以下のクエリを実行すると「エラーもしくは警告」のログを表示することが出来ます。
```
severity=WARNING OR severity=ERROR
```

- **textPayload**
ログの文字列を示すフィールドです。 `=` で検索すると完全一致ですが `:` （コロン）で検索すると `LIKE %文字列%` で検索できます。その他正規表現で検索できたりもします。

```bash
textPayload:"検索文字" # 部分一致
textPayload="検索文字" # 完全一致
textPayload=~"^test" # 先頭が"test"で始まるもの
textPayload!~"^test" # 先頭が"test"で始まらないもの
```

以下のようにオペランドを組み合わせて高度な検索もできます。

```bash
textPayload = ("error" OR "warning")
textPayload : ("good" AND "bad")
```

一つ目は「ログの文字列が "error" または "warning"」です。二つ目は「ログの文字列に "good" と "bad" が含まれている」です。

これらを組み合わせるだけで Log の調査がすこぶる楽になることでしょう。

### 参考
https://cloud.google.com/logging/docs/structured-logging?hl=ja

https://cloud.google.com/logging/docs/view/logging-query-language?hl=ja


# Monitoringでエラーを検知する

サービスの異常にすぐ気づけるように Monitoring サービスを使ってアラートを設定しましょう。"Monitoring" で検索した後サイドバーの「アラート」に行き、「Create Policy」をクリックしましょう。

![スクリーンショット 2024-12-24 23.04.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/9ddb4ab5-8fbe-79a6-0ea4-c14c8bd74723.png)

今回の例では Cloud Run functions のアラートを設定しようと思います。"function" で検索し、「Cloud functions > Logs-based metrics > Log entries」を選択します。

![スクリーンショット 2024-12-24 23.09.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/df2ed8e4-5e38-35f3-b418-a4823c2ce816.png)

Cloud Run functions のログにてエラーが発生した時をトリガーとして設定しましょう。


|Filter|Comparator|Value|
|---|---|---|
|severity|one_of|ERROR|

残りの設定項目はそのままにして "Next" を押します。すると三つの設定項目が出て来ると思います。

### Threshold
「しきい値（閾値）」を基準に、計測対象にしているものが一定期間にわたって上回ったり下回ったりした場合にアラートを発生させる設定

### Metric absence
定期的に収集されるはずの計測対象が、一定期間まったく存在しない（＝データが来ない）場合にアラートを発生させる設定

### Forecast preview
異常が来そうなタイミングを予想して通知してくれる設定

---

ここでは **Threshold** を設定します。アラート条件を以下のように設定します。簡単に言うと「一回でもエラーが起これば通知してくれ」という内容です。入力して "Next" を押しましょう。

|Alert trigger|Threshold position|Threshold value|
|---|---|---|
|Any time series violates|Above threshold|1/s|


すると通知先を選択する画面に遷移します。"Notification Channels" を選択して "Manage Notification Channels" を選択します。すると通知先にメールやSMSを選択できる画面が出てきます。後はノリで設定しましょう。多分いけます（雑）。

![スクリーンショット 2024-12-24 23.28.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/b6e513d5-8103-1831-dbcd-4d57e85e19aa.png)

### 注意
ログのアラートに関しては、適切な頻度とタイミングで送信するようにしましょう。あまり重要じゃないものまで含めて大量にアラートを飛ばすと、大事なものまで見逃されてしまう可能性があります。
設定する目安としては「ウザくない程度」に送るようにしましょう。

# Terraform でメトリクスを構成する
アラートの設定は Terraform でも可能です。チャレンジしたい方はどうぞ。手作業の方が早い気し Terraform 管理する必要あんまりない気がします。

https://cloud.google.com/monitoring/alerts/terraform?hl=ja

# おわりに
以上、異常（❗️）を検知する仕組みを構築する方法と効率的にログ調査をする方法を紹介しました。

余談ではありますが、コーディングが上手になることと同等に「異常調査を素早く丁寧にできる」ようになると、いろんなところで重宝されそうだなという肌感があります。そういう方が身の回りにいたら、その方のデバッグプロセスを盗んでみるといいかもしれません。

# 参考文献
https://cloud.google.com/monitoring/alerts?hl=ja