サーバーのリソースを見る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言語はクロスコンパイルが容易ですから相性はいいかもな、 と思っているところです。

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

Comments

comments powered by Disqus