Compute Logging and Monitoring でメトリクスを取れるようにしてみました

Google Cloudには、Compute Engine、Kubernetes、CloudRunなどのコンピューティング関連のリソースが多数あります。
ここでは、ロギングエージェントとモニタリングエージェントをNginxサーバーを実行しているVMにインストールして、メトリックを簡単に表示できるようにします。
また、Kubernetesクラスターをセットアップし、デプロイされたアプリケーションを監視します。

# 全体の流れ

①VMとGKEクラスターをセットアップします。

②ComputeEngineのロギングおよびモニタリングエージェントをインストールして使用します。

③GKEクラスターにサービスを追加し、そのログとメトリックを調べます。

## ①VMとGKEクラスターをセットアップ

####VMをセットアップする

コンソールの左上隅で、Compute Engineのリンクをクリック。

新しいVMインスタンスを作成します。
名前をweb-server-vmにし、[Allow HTTP Taffic]チェックボックスをオンにします。作成して、次のステップに進みます。

![スクリーンショット 2021-07-10 13.40.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/9e057a13-6aff-aea4-8c0d-08d6f6b27601.png)

![スクリーンショット 2021-07-10 13.41.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/a01a01a5-830e-aa93-d733-347002ecd745.png)

####GKEクラスターを作成する

ロギングとモニタリングの方法でGoogleKubernetes Engineが提供する機能の一部を調べるために、デフォルトでロギングとモニタリングが有効になっているクラスタを追加しましょう。

[Navigation]メニューを使用して、[Kubernetes Engine] > [Cluster]ページに移動します。

![スクリーンショット 2021-07-10 13.43.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/1d0a5886-8f99-515f-b627-b35dad5f85a6.png)

[CREATE]を選択し、[Standard]ボタンをクリックします。

![スクリーンショット 2021-07-10 13.44.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/6359fdaf-5885-a1fc-87d0-99e6fb308bed.png)

![スクリーンショット 2021-07-10 13.45.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/f899edfb-99da-a08c-ba7c-d3ffb6f32178.png)

Nameをgke-clusterとし、その後、左側のFeaturesを選択します。

![スクリーンショット 2021-07-10 13.46.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/7fccdd7c-f21d-84ea-f845-d89d7806c899.png)

![スクリーンショット 2021-07-10 13.48.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/70f5df92-6dd7-4686-9189-bb4f1e34e483.png)

Enable Cloud Operations for GKEがオンになっていることと、ドロップボックスの選択肢が[System and Workload and monitoring]に設定されていることを確認してから、[CREATE]を押します。

クラスターの作成が開始されたら、次の手順に進みます。

####Nginxをインストール

Compute Engineに戻り、web-server-vmにSSHで接続します。

APTを使用してNginxをインストールします。

```
$ sudo apt-get update
$ sudo apt-get install nginx
```

Nginxがインストールされ、実行されていることを確認します。

```
$ sudo nginx -v
```

Compute Engineに戻り、HTTPアクセスファイアウォールルールを有効にした場合は、外部IPをクリックできるはずです。
そうして、Nginxサーバーが稼働していることを確認します。URLをサーバーにコピーします。

![スクリーンショット 2021-07-10 13.57.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/cd47b54e-d3f1-2ddf-1643-003ff7f538c0.png)

CloudShellターミナルウィンドウに変更します。URL環境変数を作成し、サーバーへのURLと同じに設定します。

```
$ URL=URL_to_your_server_IP
```

bashwhileループを使用して、サーバーに負荷をかけます。Welcome to nginx応答が表示されていることを確認してください。

```
$ while true; do curl -s $URL | grep -oP "<title>.*</title>"; \
sleep .1s;done
```

##②ComputeEngineのロギングおよびモニタリングエージェントをインストールして使用

####ログを調べて、含まれていないデータを確認します

Googleの標準のDebianLinuxイメージには、ロギングエージェントまたはモニタリングエージェントがインストールされていないため、googleapis.com/nginx/からの次のようなメトリックにアクセスできません。

```
connections/accepted_count
connections/current
connections/handled_count
request_count
```

Googleコンソールウィンドウに切り替えて、Monitoring-Overviewに移動します。
監視ワークスペースが作成されるのを待ってから、メトリクスエクスプローラーに移動します。

Metrics explorerを設定します。

```
Resource type=VM Instance
メトリック=CPU Utilization
Filterにインスタンス名=web-server-vm
```


大きな負荷ではないため、負荷を適用したときにスパイクが表示されない場合がありますが、メトリックにはアクセスできます。

![スクリーンショット 2021-07-10 14.02.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/c9bf01b6-9c83-2eb1-5415-b2831a0447d0.png)

![スクリーンショット 2021-07-10 14.04.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/f53469f5-a2c9-08e7-fc9f-28be324a3aff.png)

![スクリーンショット 2021-07-10 14.04.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/355ca7c5-4f92-bff5-905e-6a892e1a2e02.png)

フィルタとメトリックを削除します。

metricボックスを選択し、nginxと入力し、Requestsを選択する。

しかし、データは表示されません。なぜかは以下で追っていきます。

![スクリーンショット 2021-07-10 14.06.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/0351205c-5ced-b348-8866-7d41b3d6edee.png)


####ComputeEngineインスタンスにロギングエージェントとモニタリングエージェントをインストールします

ロギングエージェントとモニタリングエージェントがインストールされていない場合、Nginxのデータは取れません。
詳細を確認したい場合は、エージェントをインストールして有効にする必要があります。

[Navigation]メニューを使用して、[Compute Engine] > [VM Instance]に移動します。

web-server-vmのSSHリンクをクリックします

ロギングエージェントがインストール/実行されているかどうかを確認します。

```
$ sudo service google-fluentd status
$ sudo service stackdriver-agent status
```

当然のことながら、サービスは見つかりませんでした。ロギングとモニタリングを実行するために必要なスコープがあることを確認してください。

```
$ curl --silent --connect-timeout 1 -f -H "Metadata-Flavor: Google" \
http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/scopes
```

応答では、logging.writeとmonitoring.writeスコープに注意してください。

スクリプトをダウンロードし、監視エージェントリポジトリをaptに追加して、エージェントをインストールします。

```
$ curl -sSO https://dl.google.com/cloudagents/add-monitoring-agent-repo.sh
$ sudo bash add-monitoring-agent-repo.sh
$ sudo apt-get update
$ sudo apt-get install stackdriver-agent
```

監視エージェントを起動します。

```
$ sudo service stackdriver-agent start
```

ロギングエージェントをインストールします。

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

2つのエージェントを再度テストし、両方がアクティブであることを確認します。
「無限の値を取ることはできません」という警告が表示された場合は無視し、ステータスがアクティブ（実行中）の場合は、Crtl + cを押して次の手順に進みます。

```
$ sudo service google-fluentd status
$ sudo service stackdriver-agent status
```

サーバーを完全に統合するには、構成ファイルをNginx構成ディレクトリに追加して、Nginxでステータス情報ハンドラーを有効にします。

```
$ (cd /etc/nginx/conf.d/ && sudo curl -O https://raw.githubusercontent.com/Stackdriver/stackdriver-agent-service-configs/master/etc/nginx/conf.d/status.conf)
```

Nginxサービスをリロードします。

```
$ sudo service nginx reload
```

Nginxモニタリングプラグインを有効にします。

```
$ (cd /opt/stackdriver/collectd/etc/collectd.d/ && sudo curl -O https://raw.githubusercontent.com/Stackdriver/stackdriver-agent-service-configs/master/etc/collectd.d/nginx.conf)
```

監視エージェントを再起動します。

```
$ sudo service stackdriver-agent restart
```

####メトリックを再検討して、新しいデータを確認します

エージェントがインストールされ、Nginxプラグインが追加されたので、前に調べたNginxメトリックを再テストします。

Cloud Shellウィンドウをチェックして、テストループがまだ実行されていること、および応答を受信して​​いることを確認します。

metric explorerへ移動します。

Resource typeをVMインスタンスに設定し、Select a metricボックスにnginxと入力して、[リクエスト]を選択します。

数分待ってページを更新する必要があるかもしれませんが、すぐにNginxからメトリックデータが届くはずです。
監視エージェントは正常に機能しています。

![スクリーンショット 2021-07-10 14.32.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/dd75dfd0-1a7f-ccb6-a005-b2dbacf8a19b.png)

##③GKEクラスターにサービスを追加し、そのログとメトリックを調べます

前半で、ロギングとモニタリングを有効にしてGKEクラスターを作成しました。
次に、HelloLoggingNodeJSアプリケーションをロードし、ロードバランサーサービスの背後に配置して、クラスターのいくつかのメトリックを表示します。

Cloud Shellコンソールに切り替えるか、再度開きます。CTRL + Cで実行中のテストループを解除します。

Cloud BuildAPIを有効にします。

```
https://github.com/haggman/HelloLoggingNodeJS.gitリポジトリのクローンを作成します。
```

```
$ gcloud services enable cloudbuild.googleapis.com 
$ git clone https://github.com/haggman/HelloLoggingNodeJS.git
```

このリポジトリには、テストに使用される基本的なNode.jsWebアプリケーションが含まれています。

```
$ cd HelloLoggingNodeJS
$ less index.js
$ less package.json
```

依存関係を含むことと、Dockerfileを生成してGKEにデプロイするんだなあということも確認してください。

DockerfileをGoogleのクラウドビルドに送信してコンテナを生成し、コンテナレジストリに保存します。

```
$ gcloud builds submit --tag gcr.io/$DEVSHELL_PROJECT_ID/hello-logging-js .
$ less k8sapp.yaml
```

k8sapp.yamlファイルを開き、Kubernetesへ3つのhello-loggingポッドを作成させ、LoadBalancerサービスを介してそれらを公開することを内容から確認してください。

```
$ vi k8sapp.yaml
```

k8sapp.yamlの中の、$GCLOUD_PROJECTを実際のプロジェクトIDと入れ替えてください。

ナビゲーションメニューを使用して、KubernetesEngineに移動します。
クラスタのトリプルドットアイコンをクリックして、[Connect]を選択します。kubectl~というコマンドラインをコピーして構成します。

![スクリーンショット 2021-07-10 15.17.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/92fcf231-28a7-bd37-04d7-6144e214af10.png)

Cloud Shellに戻り、コマンドを実行します。

kubectlk8sapp.yamlを使用します。

```
$ kubectl apply -f k8sapp.yaml
```

サービスのリストを取得します。
hello-logging-serviceが表示され、外部IPを取得するまでに1〜2分かかる場合があります。

```
$ kubectl get services
```

サービスが外部IPとともに表示されたら、外部IP値をコピーします。

ブラウザでタブを開き、IPを貼り付けます。Hello Worldメッセージが表示されていることを確認してください。

ブラウザからページのURLをコピーし、CloudShellに切り替えます。
URL環境変数を更新し、whileループを再開します。Hello World応答が表示されていることを確認してください。

```
$ URL=url_to_k8s_app
$ while true; do curl -s $URL -w "\n"; sleep .1s;done
```

Monitoring-Dashboadsへ移動し、GKEのダッシュボードを表示します。

上のGKEダッシュボードのためのGKE-クラスタの水平スクロールやチャートを参照してください。
すべての小さなグラフがデータなしを読み取っている場合は、CPUとメモリ使用率の読み取り値が表示されるまでページを更新します。データの自動更新を有効にするには、オフからオンに切り替えることもできます。


![スクリーンショット 2021-07-10 15.25.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/77a3f39e-cbce-40d5-3b93-7d90b7453dc0.png)

さまざまなクラスターノードを調べる場合は、[Node]タブを水平方向にスクロールして、3つのhello-logging-js-deploymentsがノード全体に分散していることを確認できます。このタブは、クラスターからノード、ポッドまで、どこで実行されているかに焦点を当てています。

![スクリーンショット 2021-07-10 15.27.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/1bf473c6-d702-c0eb-45c1-ba687f01ce10.png)

[Workload]タブに切り替えます。これは、名前空間ごとにグループ化された、デプロイされたワークロードに焦点を当てています。

最後に、[ Kubernetes service]タブまでスクロールして、hello-logging-serviceを展開します。
このビューは、サービスがポッドにどのように関連しているかについての詳細です。

いずれのビューでも、hello-logging-js-containersのいずれかに行くと、右側のウィンドウに詳細が表示されます。
インシデント、メトリクス、およびログを調査します。

![スクリーンショット 2021-07-10 15.27.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/77f5bc78-7f13-4153-5c13-0998dae02b2c.png)