Sensuではsensu/sensu-community-pluginsとしてプラグイン集が公開されています.
(今年に入ってからsensu-pluginsに整理されているようです.)
Community pluginsは9割近くがRubyで開発されています.
これは,Rubyだとプラグイン開発用のライブラリが提供されていることが要因と思われます.
しかし,Rubyは比較的動作が重い言語なため,監視にかかる負荷も高めとなっています.
そこで,動作が軽くパッケージも豊富なGo言語でプラグインを開発してみました.
sensu-plugins-go
Check,Metrics,Handler毎の処理をまとめたパッケージを作成しました.
ここでは,サンプルを使ってパッケージの使い方を紹介していきます.
Check
func main() {
	var crit  int
	c := check.New("Check")
	c.Option.IntVarP(&crit, "crit", "c", 90, "CRIT")
	c.Init()
	usage := Usage()
	switch {
	case usage >= crit:
		c.Critical(strconv.Itoa(usage)+"%")
		//=> Check CRITICAL: 100%
	}
}
New()で名前を指定,Optionでオプション(フラグ)を追加します.
これはgithub.com/spf13/pflagを流用しており,Init()でフラグをパースします.
Ok()・Warning()・Critical()にstringを渡すと,結果の出力とos.Exit()が実行されます.
Metrics
func main() {
	m := metrics.New("usage")
	usage := Usage()
	m.Print(usage)
	//=> host.usage 100.0 1434983749
}
New()でスキーマを指定,Checkと同様にオプションも利用できます.
Print()にfloat64を渡すと,ホスト名.スキーマ 値 UNIX時間の形式で出力します.
ホスト名はHostname(),スキーマはScheme()で任意のstringに変更できます.
Handler
func main() {
	h := handler.New("/etc/sensu/conf.d/handler.json")
	fmt.Printf("%s\n", h.Config.GetPath("handler", "name").MustString())
	fmt.Printf("%+v\n", h.Event)
}
New()で設定ファイルのパスを指定します.
設定はgithub.com/bitly/go-simplejsonで読み込まれ,Configに格納されます.
GetPath()でJSONの階層を指定し,MustString()などで型を指定して取り出せます.
パイプで渡ってきたEventはパースされ,構造体に格納します.
IOT研究会での発表
この内容はCommunity pluginsとの性能比較などを含めて,7月3日のIOT研究会で発表します.
「実験用仮想サーバに適したSensuプラグインの開発」
Sensuとは,Ruby製の監視フレームワークである.
監視対象の自動登録,構成管理を前提とした設定など,クラウドに適したアーキテクチャとなっている.
我々の研究室では,分散Webシステムの研究のため数十台の仮想サーバを運用している.
本稿では,Go言語を用いてプラグインを開発することで監視のオーバーヘッドを抑える手法や,サーバ停止時に自動的に監視対象から除外する手法など,実験環境特有の要件について述べる.