Google Stackdriverを眺める

  #gcp #monitoring

以前話題になったStackdriverをbetaのうちに触っておこうそうしよう。
AWSがCloudWatchなら、GCPはStackdriverや!!

Stackdriverの提供する機能

Documentを眺めてみると機能はこんな感じ。
正直下3つはまだ触れていないのでわりと適当。

今回はMonitoringを眺めてみようかな。

準備

監視対象のInstanceを立ち上げて、Agentを仕込むぞー。
今回はOpengrokサーバを構築してみようかな。
前段にNginx、バックエンドにTomcatがいる構成。
Stackdriverに関係ない部分はざっくり省略していく(それでも長ったらしくなってしまったあばば)。

GCE Instanceを作成する

参考:

はじめにWeb consoleからGoogle Monitoring APIを有効にしておくこと。
あとは普通に作成すればいいんだけど、Service Accountの権限だけ注意する。
最低限monitoring.writeがあれば良さそう。
Service Accountの確認方法はDocumentにある通り。

$ curl --silent -f -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/scopes
https://www.googleapis.com/auth/cloud.useraccounts.readonly
https://www.googleapis.com/auth/devstorage.read_only
https://www.googleapis.com/auth/logging.write
https://www.googleapis.com/auth/monitoring
https://www.googleapis.com/auth/service.management
https://www.googleapis.com/auth/servicecontrol

Stackdriver Agentを入れる

参考:

Documentに記載のinstall scriptを打つだけ、だと思ってました。

kobtea@opengrok:~$ curl -O https://repo.stackdriver.com/stack-install.sh
kobtea@opengrok:~$ sudo bash stack-install.sh --write-gcm
Installing agents for Debian or Ubuntu.
# ...
Setting up stackdriver-agent (5.5.0-269.trusty) ...
 * Starting Stackdriver metrics collection agent stackdriver-agent
 * Need to set STACKDRIVER_API_KEY in /etc/default/stackdriver-agent
 * not starting, configuration error
                                                                                                                                                                                          [fail]
# ...
Setting up stackdriver-extractor (92-1.trusty) ...
 * Starting Stackdriver metadata extractor stackdriver-extractor
 * Please set STACKDRIVER_API_KEY in /etc/default/stackdriver-agent
                                                                                                                                                                                          [fail]
# ...
Restarting services
 * Restarting Stackdriver metrics collection agent stackdriver-agent
 * Need to set STACKDRIVER_API_KEY in /etc/default/stackdriver-agent
 * not starting, configuration error

インストール失敗してる…
STACKDRIVER_API_KEYがないぞって、Documentでは特に言及されてないんだけどなぁ…

stack-install.shを見てみると--write-gcmオプションなんてものは書かれていない。な、なんだってー
代わりにproject metadataを使う方法は書いてある…どういうことや…

# Install and start the Google monitoring agent.
#
# Usage:
#
#   curl -O https://.../stack-install.sh
#   bash stack-install.sh [--api-key=...]
#
# The API key can be omitted on a GCE instance if it is available in the
# project metadata as the value of "stackdriver-agent-key".
#
# This script does the following:
#
#   1. Configure the required apt-get or yum repository.
#   2. Install the agent package.
#   3. Invoke /opt/stackdriver/stack-config to do the following:
#      a. Optionally configure the agent with the API key.
#      b. Start the agent services.

よくわからんので、API Keyをセットして試す。
API Keyは以下のurlから確認できる。
https://app.google.stackdriver.com/settings/accounts/agent/

kobtea@opengrok:~$ sudo bash stack-install.sh --api-key=<MY_API_KEY>
Installing agents for Debian or Ubuntu.
# ...
Restarting services
 * Restarting Stackdriver metrics collection agent stackdriver-agent

# 入った!
# stackdriver-agentはinstall時に立ち上がる
kobtea@opengrok:~$ sudo service stackdriver-agent status
 * stackdriver-agent is running

# stackdriver-extractorは手動で
kobtea@opengrok:~$ sudo service stackdriver-extractor start
 * Starting Stackdriver metadata extractor stackdriver-extractor                                                                                                                          [ OK ]

# stack-configでも問題なさそう
kobtea@opengrok:~$ /opt/stackdriver/stack-config info
Stackdriver Host Info Dump
Resource Id: xxxx
API Key: xxxx
Error talking to Stackdriver gateway No JSON object could be decoded
 * stackdriver-agent is running
Agent status:  Agent config snippets:
 * stackdriver-extractor is running
Extractor status:  Extractor sample data:
{
  "interfaces": [
    {
      "name": "lo",
      "address_families": [
# ...
      ]
    }
  ]
}

(∩´∀`)∩ワーイ

Stackdriver Agent pluginを入れる

参考: Monitoring Agent Configuration - Supported plugins

Agent pluginは標準で色々なミドルウェアに対応している。
標準pluginはconfigを書くだけで楽ちん。

Nginx pluginを入れる

参考: Nginx Plugin

Nginx pluginはstub_statusの値を計測する。

# stub_statusの準備
kobtea@opengrok:~$ sudo touch /etc/nginx/sites-available/status
kobtea@opengrok:~$ cat /etc/nginx/sites-available/status
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;
	}
}
kobtea@opengrok:~$ sudo ln -s /etc/nginx/sites-available/status /etc/nginx/sites-enabled/
kobtea@opengrok:~$ sudo service nginx reload
kobtea@opengrok:~$ curl http://local-stackdriver-agent.stackdriver.com/nginx_status
Active connections: 2
server accepts handled requests
 315 315 3601
Reading: 0 Writing: 1 Waiting: 1

# Stackdriver Nginx pluginの設定
kobtea@opengrok:~$ sudo touch /opt/stackdriver/collectd/etc/collectd.d/nginx.conf
kobtea@opengrok:~$ cat /opt/stackdriver/collectd/etc/collectd.d/nginx.conf
LoadPlugin "nginx"
<Plugin "nginx">
  URL "http://local-stackdriver-agent.stackdriver.com/nginx_status"
</Plugin>
kobtea@opengrok:~$ sudo service stackdriver-agent restart
# ...
Created new plugin context.
                                                                                                                                                                                          [ OK ]

Tomcat pluginを入れる

参考: Tomcat Plugin

Tomcat, JVM系はJMXを使って計測する。

# JMXの設定
kobtea@opengrok:~$ diff -u /etc/default/tomcat7{.orig,}
--- /etc/default/tomcat7.orig	2016-05-12 16:50:51.872516414 +0000
+++ /etc/default/tomcat7	2016-05-12 17:02:53.180519725 +0000
@@ -19,6 +19,7 @@
 # exactly one CPU chip that contains one or two cores, you should also add
 # the "-XX:+CMSIncrementalMode" option.
 JAVA_OPTS="-Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC"
+JAVA_OPTS="${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom"

 # To enable remote debugging uncomment the following line.
 # You will then be able to use a java debugger on port 8000.
@@ -45,3 +46,7 @@
 # NOTE: authbind works only with IPv4.  Do not enable it when using IPv6.
 # (yes/no, default: no)
 #AUTHBIND=no
+CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote"
+CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.port=9012"
+CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.ssl=false"
+CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.authenticate=false"

kobtea@opengrok:~$ sudo service tomcat7 restart

# Stackdriver Tomcat pluginの設定
kobtea@opengrok:~$ cd /opt/stackdriver/collectd/etc/collectd.d/ && sudo curl -O https://raw.githubusercontent.com/Stackdriver/stackdriver-agent-service-configs/master/etc/collectd.d/tomcat-7.conf
kobtea@opengrok:~$ sudo service stackdriver-agent restart
# ...
Created new plugin context.
                                                                                                                                                                                          [ OK ]

Web consoleを眺める

IndexページはAlert周りの機能が多い印象、すぐに反応したいしね。

メニューごとにふわっと眺めようかな。

Resources

GCP/AWSのサービスや、Agent pluginごとにいい感じにグルーピングされている。
インスタンス単位ではなくリソースタイプ単位でまとめて管理する設計なんだな。

各リソースページ。
リソースグループに紐付いたIncidentやメトリックが確認できる。

Alerting

みんな大好きアラート。

メトリックの閾値などなど結構柔軟に設定できる。
通知先はEmail, Pagerduty, Webhook, Slackなど。

IncidentsではPagerduty likeに状態管理ができる。
コメントも書けたりする。

Uptime Checksは複数拠点からチェックしてくれる。

Events、「最近調子悪いけど何かしたっけかなー」とか「最近Alert減ってきていい傾向だなー」とか。

Groups

先の勝手に分類してくれるResourcesではなく、自分でグルーピングしたい!ときに使う。
項目はResourcesと同じ。

Dashboards

君だけの最強のDashboardを作ろう。
しかし残念、折れ線グラフしか使えない!
CPUとか積み上げグラフにしたいな…

Logs

ログの全文検索、リソースタイプ別、ログレベル別なんでもござれ。しゅごい。
データフォーマットはjson。

感想

まだまだbetaだなーと強く思ったのはグラフかな。折れ線グラフ以外も欲しい。
Custom Dashboardはgrafanaレベルになったら嬉しいな。
複数メトリック組み合わせて四則演算できるとかなり嬉しいけど、これはagent pluginで頑張れと言われても仕方ないかなぁ。

UIは好みの問題かもしれないけど、Resourcesのグラフは縦に並べただけでとにかく見づらい。

グラフ以外のAlert, Log周りはとても使いやすい印象。
個人サービス程度なら今の状態でも十分お世話になれると思う。

たのしかったです。