Help us understand the problem. What is going on with this article?

Sensuプラグイン開発用のGo言語パッケージを作った

More than 3 years have passed since last update.

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言語を用いてプラグインを開発することで監視のオーバーヘッドを抑える手法や,サーバ停止時に自動的に監視対象から除外する手法など,実験環境特有の要件について述べる.

参考文献

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away