GCP - Stack Driver Monitoringで、GCEを監視する

Assosiate Cloud Engineer 取得の勉強中にやった内容です。取得してしまうと、1ヶ月くらいで忘れてしまったので、残しておきます。
今回は通知先をSlackにしましたが、メールなど色々と選べますので、好きなものを選ぶのが良いと思います。


## Overview
GCEのインスタンスに対して、以下のような項目を監視してみます。

|項目|説明|監視内容|
|:-:|:-:|:-:|
|プロセス監視|GCEインスタンス内で実行されている<br>プロセスの稼働状態を監視します。|ntpdが実行されているか|
|リソース監視|CPU使用率やメモリ使用率といった<br>OSリソースに対して、しきい値を<br>設けて監視します。|CPU使用率が90%未満か|
|サービス監視|サービスが正常に提供されているかを<br>監視します|WebサービスがHTTP200応答を返しているか|



## ToDo
- 構築手順
  - 通知チャネルを作る。
  - プロセス監視のアラートポリシーを作る。
  - リソース監視のアラートポリシーを作る。
  - サービス監視のアラートポリシーを作る。

- 確認
  - プロセスダウン
  - リソース高騰
  - サービスダウン

## Procedure
### Create a new project
あとですぐに消せるように、一時的なプロジェクトを作成します。

1. 画面の上にある [Select a project] を選択する。
2. [NEW PROJECT] を選択する。
3. 「Project Name」に任意の名前を入れる。<br>  グローバルで一意になるように、IDには数字が付与される。
4. [Create]を選択する。

---
### Create a VM instance
GCEインスタンスを作成します。

1. ハンバーガーから、「Compute Engine - VM instances」を選択する。
2. [Create]を選択する。
3. 任意で設定値を入れる(※今回の設定値は、下表)。

    |Item|Default Value|Value|Comments|
    |:-:|:-:|:-:|:-:|
    |Name|instance-1|←|任意の名前|
    |Labels|n/a|n/a||
    |Region|us-central1(Iowa)|←|とりあえずデフォルト|
    |Zone|us-central1-a|←|同上|
    |Machine Family|General-purpose|←|同上|
    |Series|N1|←|同上|
    |Machine Type|n1-standard-1|**n1-standard-2**|2vCPUのやつにしてみます|
    |Container|No|←|今回はコンテナは使わないので|
    |Boot Disk|Debian GNU/Linux 9 (strech)|←|とりあえずDebianで。|
    |Service Account|Compute Engine default service account|←|今回はデフォルト|
    |Access scope|Allow default access|←|同上|
    |Firewall|None|**HTTP,HTTPS**|HTTP(S)通信を許可|



4. [Create]を選択する。
4. 一覧に「instance-1」が表示されて、:white_check_mark:がついていれば、OK。

---
### Configure VM instance
GCEインスタンスの設定を行います。今回は、StackDriverエージェントを入れて監視が行えるようにします。
また、リソース系の動作確認を行うために、stressを入れます。

1. ハンバーガーから、「Compute Engine」を選択する。

1. さっき作成したインスタンスの右にある[SSH]を選択する。

1. Stackdriver Monitoring Agent のインストール

    ```Shell:
    $ curl -sSO https://dl.google.com/cloudagents/install-monitoring-agent.sh
    $ sudo bash install-monitoring-agent.sh
    ```


1. Stackdriver Monitoring Agent の状態確認(active(running)ならOK)。

    ```Shell:
    $ sudo systemctl status stackdriver-agent
    ```

1. パッケージの最新化を行う。

    ```Shell:
    $ sudo apt update && sudo apt -y upgrade
    ```

1. nginxをインストールする。

    ```Shell:
    $ sudo apt -y install nginx
    ```

1. nginx の状態を確認する(active(running)ならOK)。

    ```Shell:
    $ sudo systemctl status nginx
    ```
1. HTMLファイルの書き換え

    ```Shell:
    $ echo "OK" | sudo tee /var/www/html/index.nginx-debian.html 
    ```

1. nginx 動作確認(OKと出ればOK)。

    ```Shell:
    $ curl http://localhost/
    OK
    ```

1. sysstatをインストールする。

    ```Shell:
    $ sudo apt -y install sysstat
    ```

1. stressをインストールする。

    ```Shell:
    $ sudo apt -y install stress
    ```

---
### Add a slack notification channel
通知チャネルの追加を行います。

1. ハンバーガーから、「Monitoring - Settings」を選択する。
1. [NOTIFICATION CHANNELS]を選択する。
1. 「Slack」の横の[ADD NEW]を選択する。
1. Slack側の承認ページにリダイレクトされるので、[許可する]を選択する。
1. 「Add Slack Channel」のダイアログボックスが出るので、以下を入力する。

    |Item|Default Value|Value|Comments|
    |:-:|:-:|:-:|:-:|
    |Channel Name|-|#gcp|任意の名前(Slackに左記チャネルを作成済の前提です)|

1. [TEST CONNECTION]を選択する。
1. Slackのチャンネルに、Google Cloud Monitoringからの通知が出てくればOK。
 ![Screenshot 2020-03-18 at 14.17.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525959/9c704c78-93b1-7773-3f4c-f40dd315b486.png)

1. [SAVE]を選択する。
1. 「Slack」のところに、作成した内容でチャネルが存在すればOK。


---
### Create a process monitoring policy
プロセス監視のポリシーを作成します。

1. ハンバーガーから、「Monitoring - Alerting」を選択する。
1. [CREATE POLICY]を選択する。
1. 以下を入力する。

    |Item|Default Value|Value|Comments|
    |:-:|:-:|:-:|:-:|
    |Name|-|**ProcessMonitoring**|任意の名前(わかりやすいやつ)|
    |Condition|-|**ntpd**|下記参照。|
    |Notification (optional)|-|**Slack**|今回はSlackを使用|
    |Documentation (optional)|-|←||



    Condition - ntpd

    |Item|Default Value|Value|Comments|
    |:-:|:-:|:-:|:-:|
    |Type|-|**Process Health**|プロセス監視|
    |Name|-|**ntp**|任意の名前(わかりやすいやつ)|
    |Resource Type|-|**All GCE VM Instance**||
    |Command Line|-|**Contains 'ntpd'**|ntpdを監視する|
    |Condtion triggers if|Any time series violate|←|いつでもあげる|
    |Condition, Threshold, For|-|is below, **1**, 1 min|1分間でプロセス起動数が、1を下回ったら|


1. [SAVE]を選択する。

---
### Create a resource monitoring policy
リソース監視のポリシーを作成します。

1. ハンバーガーから、「Monitoring - Alerting」を選択する。
1. [CREATE POLICY]を選択する。
1. 以下を入力する。

    |Item|Default Value|Value|Comments|
    |:-:|:-:|:-:|:-:|
    |Name|-|**ResourceMonitoring**|任意の名前(わかりやすいやつ)|
    |Condition|-|下記参照||
    |Notification (optional)|-|**Slack**|今回はSlackを使用|
    |Documentation (optional)|-|←||


    Condition - GCE VM Instance - CPU utilization for idle

    |Item|Default Value|Value|Comments|
    |:-:|:-:|:-:|:-:|
    |Type|-|**Metric**|指標|
    |Name|-|**GCE VM Instance - CPU utilization for idle**|任意の名前(わかりやすいやつ)|
    |Resource Type|-|**GCE VM Instance**||
    |Metric|-|**CPU Utilization(agent.googleapis.com/cpu/utilization)**|StackDriverエージェントが取得するCPU使用率|
    |Filter|-|**cpu_state = 'idle'**|アイドルでフィルタリング|
    |Condtion triggers if|Any time series violate|←|いつでもあげる|
    |Condition, Threshold, For|-|is below, **10**, 1 min|1分間でCPU使用率のアイドル値が10%を下回ったら(＝CPU使用率90%)|

1. [SAVE]を選択する。

1. その他、標準的なリソース監視項目もConditionに追加しておきます。
    Condition - GCE VM Instance - CPU utilization for user

    |Item|Default Value|Value|Comments|
    |:-:|:-:|:-:|:-:|
    |Type|-|**Metric**|指標|
    |Name|-|**GCE VM Instance - CPU utilization for user**|任意の名前(わかりやすいやつ)|
    |Resource Type|-|**GCE VM Instance**||
    |Metric|-|**CPU Utilization(agent.googleapis.com/cpu/utilization)**|StackDriverエージェントが取得するCPU使用率|
    |Filter|-|**cpu_state = 'user'**|ユーザ時間でフィルタリング|
    |Condtion triggers if|Any time series violate|←|いつでもあげる|
    |Condition, Threshold, For|-|is above, **80**, 1 min|1分間でCPU使用率のuser値が80%を上回ったら|


    Condition - GCE VM Instance - CPU utilization for system

    |Item|Default Value|Value|Comments|
    |:-:|:-:|:-:|:-:|
    |Type|-|**Metric**|指標|
    |Name|-|**GCE VM Instance - CPU utilization for system**|任意の名前(わかりやすいやつ)|
    |Resource Type|-|**GCE VM Instance**||
    |Metric|-|**CPU Utilization(agent.googleapis.com/cpu/utilization)**|StackDriverエージェントが取得するCPU使用率|
    |Filter|-|**cpu_state = 'system'**|カーネル時間でフィルタリング|
    |Condtion triggers if|Any time series violate|←|いつでもあげる|
    |Condition, Threshold, For|-|is above, **40**, 1 min|1分間でCPU使用率のsystem値が40%を上回ったら|


    Condition - GCE VM Instance - CPU load (15m)

    |Item|Default Value|Value|Comments|
    |:-:|:-:|:-:|:-:|
    |Type|-|**Metric**|指標|
    |Name|-|**GCE VM Instance - CPU load (15m)**|任意の名前(わかりやすいやつ)|
    |Resource Type|-|**GCE VM Instance**||
    |Metric|-|**CPU load (15m)(gent.googleapis.com/cpu/load_15m)**|ロードアベレージ|
    |Filter|-|**cpu_state = 'system'**|カーネル時間でフィルタリング|
    |Condtion triggers if|Any time series violate|←|いつでもあげる|
    |Condition, Threshold, For|-|is above, **4**, 1 min|CPU数の2倍を超えたら|


    Condition - GCE VM Instance - Memory utilization

    |Item|Default Value|Value|Comments|
    |:-:|:-:|:-:|:-:|
    |Type|-|**Metric**|指標|
    |Name|-|**GCE VM Instance - Memory utilization**|任意の名前(わかりやすいやつ)|
    |Resource Type|-|**GCE VM Instance**||
    |Metric|-|**Memory utilization(agent.googleapis.com/memory/percent_used)**|StackDriverエージェントが取得するMemory使用率|
    |Filter|-|←||
    |Condtion triggers if|Any time series violate|←|いつでもあげる|
    |Condition, Threshold, For|-|is above, **90**, 1 min|1分間でMemory使用率のused値が90%を上回ったら|


    Condition - GCE VM Instance - Disk utilization

    |Item|Default Value|Value|Comments|
    |:-:|:-:|:-:|:-:|
    |Type|-|**Metric**|指標|
    |Name|-|**GCE VM Instance - Disk utilization**|任意の名前(わかりやすいやつ)|
    |Resource Type|-|**GCE VM Instance**||
    |Metric|-|**Disk utilization(agent.googleapis.com/disk/percent_used)**|StackDriverエージェントが取得するDisk使用率|
    |Filter|-|←||
    |Condtion triggers if|Any time series violate|←|いつでもあげる|
    |Condition, Threshold, For|-|is above, **80**, 1 hour|1時間でDisk使用率のused値が80%を上回ったら|




---
### Create a uptime check
稼働時間チェックのポリシーを作成します。

1. ハンバーガーから、「Monitoring - Uptime checks」を選択する。
1. [CREATE UPTIME CHECK]を選択する。
1. 以下を入力する。

    |Item|Default Value|Value|Comments|
    |:-:|:-:|:-:|:-:|
    |Title|-|**TestUptimeCheck**|任意の名前(わかりやすいやつ)|
    |Check Type|HTTP|←||
    |Resource Type|URL|←||
    |Hostname|-|**上で作成したGCEインスタンスの外部IP**|チェックするURL|
    |Path|-|**/**|同上|
    |Check every|1 minute|←||

1. [TEST]を選択する。
1. 「:white_check_mark: Responded with 200 (OK) in xxx ms.」と返ってくればOK。

1. [SAVE]を選択する。
1. [CREATE ALERT POLICY]を選択する。
1. 以下を入力する。

    |Item|Default Value|Value|Comments|
    |:-:|:-:|:-:|:-:|
    |Name|-|**ServiceMonitoring**|任意の名前(わかりやすいやつ)|
    |Condition|-|下記参照||
    |Notification (optional)|-|**Slack**|今回はSlackを使用|
    |Documentation (optional)|-|←||


    Condition - Uptime Health Check

    |Item|Default Value|Value|Comments|
    |:-:|:-:|:-:|:-:|
    |Type|-|**UPTIME CHECK**|**稼働時間チェック**|
    |Name|-|**Uptime Health Check**|任意の名前(わかりやすいやつ)|
    |Metric|check passed|←||
    |Resource Type|All|←||
    |Uptime check id|**TestUptimeCheck**|←||
    |Condtion triggers if|Any time series violate|←|いつでもあげる|
    |Condition, Threshold, For|-|is above, **1**, 1 min|1分間でアカンのが1つ以上あったら|

1. [SAVE]を選択する。









## Confirmation

### Process monitoring
プロセス監視の動作チェックをしてみます。

1. ハンバーガーから、「Compute Engine」を選択する。

1. さっき作成したインスタンスの右にある[SSH]を選択する。

1. ntpd の停止

    ```Shell:
    $ sudo systemctl stop ntp
    ```

1. ntpd のダウンを検知して、Slackに通知が来ます。
![Screenshot 2020-03-18 at 14.20.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525959/4bde349b-f464-71e8-1184-60a4838ee57f.png)

1. ntpd の起動

    ```Shell:
    $ sudo systemctl start ntp
    ```

1. ntp ダウンのインシデントが解消したことを告げる通知が、Slackに来ます。
![Screenshot 2020-03-18 at 14.23.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525959/a756bb62-cded-2eea-c4ac-b96b110b8fa1.png)


---
### Resource monitoring
リソース監視の動作チェックをしてみます。

1. ハンバーガーから、「Compute Engine」を選択する。
1. さっき作成したインスタンスの右にある[SSH]を選択する。
1. ストレスかける(-cはCPU、2はストレスかけるコア数)

    ```Shell:
    $ stress -c 2
    ```

1. CPU使用率がすごくなってることを検知して、Slackに通知が来ます。
![Screenshot 2020-03-18 at 14.47.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525959/f7fa87f2-fc16-557c-0d6e-0187c322099e.png)

1. [Ctrl]+[C]でストレスかけるのを止める。
1. CPU使用率のインシデントが解消したことを告げる通知が、Slackに来ます。
![Screenshot 2020-03-18 at 14.59.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525959/3367fb7f-f23c-5fd0-a534-77bc0c86a948.png)


---
### Service monitoring
稼働時間チェックの動作チェックをしてみます。

1. ハンバーガーから、「Compute Engine」を選択する。

1. さっき作成したインスタンスの右にある[SSH]を選択する。

1. nginx の停止

    ```Shell:
    $ sudo systemctl stop nginx
    ```

1. 稼働時間チェックの異常を検知して、Slackに通知が来ます。
![無題のプレゼンテーション (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525959/aec08094-1e1b-6af5-32a0-aff9b483f182.png)

1. nginx の起動

    ```Shell:
    $ sudo systemctl start nginx
    ```

1. 稼働時間チェック異常のインシデントが解消したことを告げる通知が、Slackに来ます。
![無題のプレゼンテーション (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525959/157ad8d0-56ac-0483-505c-65f6b6a65c45.png)


## よくわからない点
1分間隔で監視しているのに、通知が来るのが数分たった後だったりします。
なんでだろう。