Posted at

Google Cloud MonitoringでCompute Engineインスタンスを監視する

More than 3 years have passed since last update.

Google Compute Engine のインスタンスの監視をどうするかはサーバ管理者の悩みのタネだと思います。

sensuを入れたりMackerelを入れたりDataDogを試してみたり…選択肢は色々あると思うんですが、今ならGoogle Cloud Monitoringがオススメです!!!

Cloud Monitoring.png

Google Cloud Platform 運用管理 - Cloud Monitoring 編 というブログエントリに非常によくまとまっていますが、僕の方でもいくつか補足しながら解説したいと思います。


できること



  1. CPU Usage, Memory Usage, Disk Usage, Disk I/O, Network Traffic, Open TCP Connections, Processes などの基本的なシステム情報の監視

  2. プロセスの死活監視

  3. エンドポイントにHTTPリクエストを送って正常なレスポンスを返せるか監視

  4. これらのEmail, HipChat, SMS, Slack 等を使ったアラート

  5. プラグインを使った MySQL, Nginx 等の外部プロダクトのステータスの可視化

  6. インスタンスの命名規則やタグを利用した柔軟なグルーピング

などなど。

やはり一番嬉しいのは、これらの機能が公式ツールとして無料で利用可能である点です。

Google Cloud Monitoring powered by Stackdriver とあるように、元はStackdriverという監視ツールだったようですがGoogleに買収されて公式モニタリングツールになったようです。

以下の解説でもStackdriver Agentみたいな感じでStackdriverという用語がサラッと出てきますが、本記事ではGoogle Cloud MonitoringとStackdriverは本質的に同じものとして扱っています。


Google Cloud Monitoring のセットアップ

何も考えずに以下の通りにコピペして監視用のエージェントをインストールします。



  1. https://app.google.stackdriver.com/settings/apikeys/API Key を取得

  2. shell> curl -O https://repo.stackdriver.com/stack-install.sh

  3. shell> sudo bash stack-install.sh --api-key=[API Key]

基本的にはこれだけ!

前出の公式ブログにはDebian用の解説と書いてありますが、手元のCentOS 6.7Debian 8で全く同様に利用できることを確認済みです。

早速 https://app.google.stackdriver.com/ にアクセスしてみましょう。

Instances

Infrastructure > Instancesと選んでいくとインスタンスの一覧が表示されます。

そこからCloud Monitoringをインストールしたインスタンスを選んでください。

overview.png

スクリーンショット 2015-12-07 22.39.22.png

インスタンスの情報が取得できていますね!


Group を作ってみる

複数のインスタンスをグループで管理することが出来ます。

たとえば rails, redis, db のように種類ごとに分けるもよし、production, staging, development のように用途ごとに分けるもよし。設計は自由です。

Groups > Create と選択します。

スクリーンショット 2015-12-07 22.56.07.png

ここでは rails というGroup Nameで、インスタンスタグに rails というタグがついているものを条件としてグループを作成しています。

スクリーンショット 2015-12-07 22.57.03.png

条件は、命名規則だったりセキュリティグループだったりリージョンだったり、かなり自由度高く設計することができます。


Alert を作ってみる

前述の Group は単にインスタンスを束ねて見ることができるのみならず、アラートに利用すると便利です。

ここでは Rails グループのインスタンスのどれかが CPU負荷, メモリ使用量, ディスク使用量 が高くなるとメールでアラートを送るというシナリオでアラートの設定をしてみましょう。

Alerting > Create Alerting Policy を選択します。

スクリーンショット 2015-12-07 23.00.19.png


インスタンスの状態を監視する

任意の Policy Name をつけ、Metric ThresholdNext を選択します。

スクリーンショット 2015-12-07 23.01.35.png

ここでは RESOURCE TYPE を Instances にして、APPLIEST TO を Group Rails に、CONDITION TRIGGERS IF を Any Member Violates にして、どれかひとつでもインスタンスが条件を破ればアラートを出すようにしています。

ここは無論、全インスタンスが条件を破ればともできますし、全インスタンス中のn%が、という風にも出来ます。

スクリーンショット 2015-12-07 23.02.13.png

最後にここではCPU負荷が90%以上の状態が5分つづいたら異常と設定しています。

条件はこの他にも複数設定できます。

よく使うのは Memory Used, Volume Usage などです。

スクリーンショット 2015-12-07 23.02.31.png


プロセスを死活監視する

同様に、Process Health からはプロセスの死活監視をすることが出来ます。

スクリーンショット 2015-12-07 23.18.58.png

監視するTARGETまでは同様で、CONFIGURATIONタブで deploy ユーザが実行する unicorn のプロセスが 5分以上, 1未満 になった場合に異常を検知するようにしています。

スクリーンショット 2015-12-07 23.23.00.png

条件にマッチするプロセスがリアルタイムでウェブ画面に表示されるので非常に直感的で便利です。


通知する

最後に通知先を選びます。ここではEmailを選択しています。

スクリーンショット 2015-12-07 23.12.55.png

もちろんHipChatやSlackとも超簡単に連携できます。

スクリーンショット 2015-12-07 23.13.20.png


HTTPでエンドポイントを監視する

プロセスが生きているかだけでなく、正しいHTTPレスポンスを返せているか否かというようなことも簡単に監視できます。

Alerting > Uptime Checks を選択します。

スクリーンショット 2015-12-07 23.25.57.png

少し分かりづらいですが画面右の Add Uptime Check を選択します。

スクリーンショット 2015-12-07 23.26.25.png

ここでは http://blog.mana.bo/ を5分おきに監視しています。

スクリーンショット 2015-12-07 23.27.02.png

Advanced Options を押すことでバーチャルホストを設定している場合のホストヘッダを設定したり、レスポンスに特定の文字列が含まれているか検証したり、任意のヘッダを仕込んだりすることが可能です。

スクリーンショット 2015-12-07 23.28.26.png

また監視対象はURLだけでなく、ロードバランサやAppEngineも選択可能です。

スクリーンショット 2015-12-07 23.27.24.png

監視対象を設定したら前節と同様にアラートの設定をして異常が起こった場合に検知できるようにします。


Nginxプラグイン設定

組み込みの監視項目だけでなく、プラグインを利用することで外部のオープンソースソフトウェアの詳細なステータスを表示することが可能です。

ここではNginxプラグインを使ってNginxの色々な情報をCloud Monitoringに表示してみます。

1. Nginxの設定ファイルを追加

shell> sudo vim /etc/nginx/sites-available/monitoring

server {
listen 80;
server_name local-stackdriver-agent.stackdriver.com;
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
location / {
root /dev/null;
}
}

2. Nginx再起動

shell> ln -s /etc/nginx/sites-available/monitoring /etc/nginx/sites-enabled/monitoring

shell> sudo nginx -t
shell> sudo systemctl restart nginx.service # Debian系
shell> sudo service nginx restart # RedHat系

3. プラグイン設定

shell> sudo vim /opt/stackdriver/collectd/etc/collectd.d/nginx.conf

LoadPlugin "nginx"
<Plugin "nginx">
URL "http://local-stackdriver-agent.stackdriver.com/nginx_status"
</Plugin>

shell> sudo systemctl restart stackdriver-agent # Debian系
shell> sudo service stackdriver-agent restart # RedHat系

Infrastructure > Instances からNginxの動いているインスタンス名を起動して、以下のように NGINX タブに切り替えることができ、コネクション数等が確認できれば成功です!

スクリーンショット 2015-12-07 23.38.32.png

スクリーンショット 2015-12-07 23.38.41.png

反映には多少時差があるようです。


MySQLプラグイン設定

上述のNginx同様、MySQLプラグインも非常に便利です。

1. show statusできるだけのユーザを追加

mysql> CREATE USER 'monitoring'@'127.0.0.1' IDENTIFIED BY 'monitoring';

2. プラグインの設定

shell> vim /opt/stackdriver/collectd/etc/collectd.d/mysql.conf

LoadPlugin "mysql"
<Plugin "mysql">
<Database "your_db_name">
Host "127.0.0.1"
User "monitoring"
Password "monitoring"
Port 3306
</Database>
</Plugin>

shell> sudo systemctl restart stackdriver-agent / sudo service stackdriver-agent restart

…が、エラー発生!

Nov 18 16:42:05 staging-manabo-db-master collectd[12871]: lt_dlopen ("/opt/stackdriver/collectd/lib/collectd/mysql.so") failed: file not found. The most common cause for this problem is missing dependencies. Use ldd(1) to check the dependencies of the plugin / shared object.

Nov 18 16:42:05 staging-manabo-db-master collectd[12871]: plugin_load: Load plugin "mysql" failed with status 1.

何が足りていないか調べてみる。

shell> root@staging-manabo-db-master:~# ldd /opt/stackdriver/collectd/lib/collectd/mysql.so

linux-vdso.so.1 (0x00007ffd8b064000)
libmysqlclient.so.18 => not found
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0e6960c000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f0e693f1000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0e690f0000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f0e68eec000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0e68b43000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0e69a2f000)

この環境 (Debian 8) では libmysqlclient.so.18 が足りていないので、このライブラリを含むパッケージを検索してインストール。

なお、RedHat系では yum provides */libmysqlclient.so.18 とかすれば良い。

詳しくは Debian系 RedHat系 でのパッケージ管理コマンド対応表 を参照。

shell> apt-file search "libmysqlclient.so.18"

libmysqlclient18: /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18
libmysqlclient18: /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0

shell> sudo apt-get install libmysqlclient18
shell> sudo systemctl restart stackdriver-agent / sudo service stackdriver-agent restart
shell> sudo systemctl status stackdriver-agent / sudo service stackdriver-agent status

特にエラーも出ていないので完了!実際に確認してみると…

スクリーンショット 2015-12-07 23.47.27.png

うまくいっているようです!


まとめ

これだけの機能が標準でしかも無料で揃っているのは相当心強いと思います。

みなさんも是非使ってみてください!