Google Stackdriverを眺める
#gcp #monitoring以前話題になったStackdriverをbetaのうちに触っておこうそうしよう。
AWSがCloudWatchなら、GCPはStackdriverや!!
Stackdriverの提供する機能
Documentを眺めてみると機能はこんな感じ。
正直下3つはまだ触れていないのでわりと適当。
- Monitoring
- 監視と計測のためのサービス
- Agentをリソースに仕込んでメトリックを取得する
- Agentを使わなくても、GCP APIを使って簡単なメトリックは取得してくれる
- みんな大好きアラート発砲もできる
- GCPだけでなく、AWSにも対応している
- Logging
- syslogや任意のログを収集して管理・分析ができる
- Error Reporting
- どのエラーがいつ何回起きたか
- Debug
- コードに埋め込むあのデバッガ
- Trace
- パフォーマンスチューニングのためのサービス
- どの処理にどれだけ時間がかかっているのかが計測できる
今回は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周りはとても使いやすい印象。
個人サービス程度なら今の状態でも十分お世話になれると思う。
たのしかったです。