このエントリーをはてなブックマークに追加

サーバーのリソースを見るgostatを作りました

最近go言語を勉強し始めています。

ということで、勉強の一環として、サーバーのリソースを表示してくれるgostat というものを作成してました。

https://bitbucket.org/r_rudi/gostat

使い方

% mkdir gostat
% cd gostat
% export GOPATH=`pwd`
% go get bitbucket.org/r_rudi/gostat

で、gostat/bin/gostatという実行ファイルが出来上がります。

なにができるの?

iostatやdstatと同じように、サーバーのリソース状態を表示してくれます。

現時点では

  • load avg
  • mem
  • cpu
  • aio

が取得できます。module構造にしているので、どんどん増やせますが、今はこれぐらいです。

実行するとこんな感じです。

% ./bin/gostat
time:2013-05-30 21:35:33.781308848 +0900 JST    tag:load load1:0.00      load5:0.00      load15:0.00
time:2013-05-30 21:35:33.78152943 +0900 JST     tag:memory usage MemFree:168052  Buffers:133404  Cached:537612
time:2013-05-30 21:35:33.981724611 +0900 JST    tag:cpu usr:0.00 sys:0.00        idl:0.00        wai:83.33       hiq:0.00

-iをつけると、指定した秒数ごとに表示を繰りかえします。

出力形式

さっきの表示を見て、iostatと違うな…、と思った方も多いと思います。標準ではLTSV形式で標準出力に出します。

この他、

  • whitespace
  • csv

という表示形式に加えて、

  • http
  • mqtt

に対応しました。

これらは-oオプションで指定できます。

% ./bin/gostat -o csv
aio,load1,load5,load15,MemFree,Buffers,Cached,usr,sys,idl,wai,hiq,siq,stl
0,0.00,0.00,0.00,168176,133408,537612,0.00,0.00,0.00,125.00,0.00,0.00,0.00

http

httpを指定した場合、任意のURLにPOSTします。

% ./bin/gostat -o http http://fluentd.example.com:9880

ペイロードは、jsonというkeyでJSON形式を送ります。これはつまり、fluentdのin_httpが受け取る形式と同じです。

mqtt

MQTT (MQ Telemetry Transport)とはM2M、Machine-to-Machineでの通信のために作られたプロトコルです。オーバーヘッドがかなり小さい、publish/subscribe型のプロトコルです。

ブローカーと呼ばれるサーバーに対してpublish/subscribeを行います。gostatは指定したブローカーに対してpublishします。

% ./bin/gostat -o mqtt -i 5 test.mosquitto.org:1883 gostat/rudi/

こうしておけば、

% mosquitto_sub -h test.mosquitto.org -t "gostat/rudi/#"
{"aio":"0","tag":"aio","time":"2013-05-30 12:51:59.28449373 +0000 UTC"}
{"load1":"0.00","load15":"0.00","load5":"0.00","tag":"load","time":"2013-05-30  12:51:59.284621107 +0000 UTC"}
{"Buffers":"133424","Cached":"537616","MemFree":"167648","tag":"memory usage","time":"2013-05-30 12:51:59.28478457 +0000 UTC"}

というように、JSON形式で受け取れます。

MQTTはAWSのmidiumサイズのインスタンスで100Kの同時接続をさばいたという 話があるようにかなり大規模に使えるプロコトルです。AMQPのようなQueueとしては(名前に反して)使えませんが、大規模に通知する場合には使えるかと思います。

MQTTの話はまたの機会に。

まとめ

go言語の勉強として、リソースを取得してくれるgostatを作ってみました。単に表示するだけでは面白くないので、LTSVにしてみたり、httpやMQTTを送ってみたりといろいろ試してみました。

ちなみに中身はdstatをかなり真似しています。そしてdstatはLinuxべったりなんですよね…

あと、特色としてはMQTTに対応したところですね。MQTTは組み込みなど省リソース向けですし、go言語はクロスコンパイルが容易ですから相性はいいかもな、と思っているところです。

まだまだ実装した部分は少ないので、需要があればもっといろいろな情報を取れるように実装していきます。