普段はサーバのメトリクス可視化のためにcloudforecastを使っていますが、某案件用に数秒単位で数十台のサーバのメトリクスを表示したいので、記事タイトルのような構成を作ってみた。
dstatでとった各種値の他に、nginxとmemcachedの情報も合わせて表示させています。
セットアップ
もろもろのセットアップのメモ
監視サーバ
まず、監視サーバにElasticsearchとkibanaをいれる。環境はCentOS6
$ sudo yum install java-1.7.0-openjdk
$ sudo rpm -Uvh https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.x.x.noarch.rpm
Elasticsearchは特に設定なく起動
$ sudo service elasticsearch start
次、kibanaとkibanaをhostingするwebサーバの設定
$ cd /path/to
$ wget https://download.elasticsearch.org/kibana/kibana/kibana-3.x.x.tar.gz
$ tar zxf kibana-3.x.x.tar.gz
して、webサーバのドキュメントルートに、/path/to/kibana-3.x.x
を指定。
データをいれ始める前に、Elasticsearchにmappingのヒントを与える
$ curl -XPUT localhost:9200/_template/template_1 -d '
{
"template" : "logstash-*",
"mappings" : {
"dstat": {
"properties": {
"host" : { "type" : "string", "index" : "not_analyzed" },
"value" : {"type" : "double"}
}
}
}
}
'
監視対象サーバの設定
モニタリング対象となるサーバにはfluentdをいれる
$ sudo yum install td-agent
弊社環境だとモリス作成のtd-agentがyum repositoryにあるのでこれを使った。一般的にはtreasuredata社のrepositoryを使うと思う。
pluginを追加
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-map fluent-plugin-dstat fluent-plugin-elasticsearch
fluent-plugin-elasticsearchのインストールで依存性解決ができなくて失敗することがなんどかあった。
/etc/td-agent/td-agent.conf
を次のようにしてみた。dstatの情報をそれぞれ別のログにするところは、「dstatをkibanaで可視化+3.0.0milestone5新機能
を参考にさせて頂きました。
<source>
type exec
command sh /etc/td-agent/stats.sh
format tsv
keys hostname,nginx,memcached
tag stats
run_interval 5
</source>
<match stats>
type copy
<store>
type map
tag "map.dstat.nginx-req"
time time
record {"value" => record["nginx"], "stat" => "nginx-req", "host" => record["hostname"]}
</store>
<store>
type map
tag "map.dstat.memcached-incr"
time time
record {"value" => record["memcached"], "stat" => "memcached-incr", "host" => record["hostname"]}
</store>
</match>
<source>
type dstat
tag dstat
option -lcn
delay 5
</source>
<match dstat>
type copy
<store>
type map
tag "map.dstat.loadavg-short"
time time
record {"value" => record["dstat"]["load avg"]["1m"], "stat" => "loadavg-short", "host" => record["hostname"]}
</store>
<store>
type map
tag "map.dstat.cpu-usr"
time time
record {"value" => record["dstat"]["total cpu usage"]["usr"], "stat" => "cpu-usr", "host" => record["hostname"]}
</store>
<store>
type map
tag "map.dstat.cpu-sys"
time time
record {"value" => record["dstat"]["total cpu usage"]["sys"], "stat" => "cpu-sys", "host" => record["hostname"]}
</store>
<store>
type map
tag "map.dstat.cpu-hiq"
time time
record {"value" => record["dstat"]["total cpu usage"]["hiq"], "stat" => "cpu-hiq", "host" => record["hostname"]}
</store>
<store>
type map
tag "map.dstat.cpu-siq"
time time
record {"value" => record["dstat"]["total cpu usage"]["siq"], "stat" => "cpu-siq", "host" => record["hostname"]}
</store>
<store>
type map
tag "map.dstat.net-recv"
time time
record {"value" => record["dstat"]["net/total"]["recv"], "stat" => "net-recv", "host" => record["hostname"]}
</store>
<store>
type map
tag "map.dstat.net-send"
time time
record {"value" => record["dstat"]["net/total"]["send"], "stat" => "net-send", "host" => record["hostname"]}
</store>
</match>
<match map.dstat.*>
type elasticsearch
type_name dstat
host 監視サーバのIP
port 9200
logstash_format true
logstash_prefix logstash
flush_interval 5s
</match>
nginxとmemcachedの統計情報をとるstats.shは
#!/bin/sh
set -e
HOST=$(hostname)
NREQ=$(curl -s http://localhost/nginx_status|head -3|tail -1|awk '{print $3}')
MREQ=$(echo stats | nc localhost 11211| grep incr_hits | awk '{print $3}')
echo -e "$HOST\t$NREQ\t$MREQ"
のような簡単なshellscriptです。
設定をいれたら、fluentdを起動
$ sudo service td-agent start
kibanaをぽちぽち設定
データが入りはじめたら、kibanaでぽちぽちやって可視化。
nginxのリクエスト数なら、topNクエリを使い、
Histgramグラフの設定で、Transform Series
のSeconds、Derivativeを両方とも有効にして秒間のリクエスト数に直し、stackグラフにします。
あとはグラフによって、秒で割るかどうか、stackするかどうかを選びつつ可視化して行きます。すると最終的にこんなのが出来上がりました。
あとは本番を待つのみ。。
KADOKAWA/アスキー・メディアワークス
売り上げランキング: 2,398