Mackerel Advent Calendar 2015の12日目です。比較的ゆるい内容にしました。昨日はすてにゃんさんでした。



この記事について

件の通り、mackerelのチェックプラグインについて。僕自身も業務では監視システムの中核としてMackerelを採用していて、主題のgo-check-pluginsmackerel-agent-pluginsにいくつかのコントリビュートをさせていただいております。今回はgo-check-pluginsのプラグイン仕様やらお作法やらを簡単に解説します。golangでチェックプラグインを書いてみたいという人の一助になれば幸いです。

go-check-plugins

チェックプラグインの開発にはいくつかのルールとお作法があります。ざっくり言うと次のポイントを押さえるべきだと思っています。

exit code

公式HPにも解説がありますが、これが監視の結果となります。以下の値をexit codeとすることでMackerelはそれぞれ正常、警告、異常と判断します。

  • 0: OK
  • 1: WARNING
  • 2: CRITICAL
  • 0,1,2以外: UNKNOWN
なお、この仕様はnagiosやsensuの仕様と同等であり、nagiosやsensuのプラグインをmackerelに流用することもできます。逆をいうと、mackerelのプラグイン、すなわちgo-check-pluginsをnagiosやsensuに流用することもできます。golang製のツールはクロスコンパイルしてバイナリを置くだけで動くのが良いですね。

プラグインを新規追加するときはディレクトリ/ファイル名は「check-」で始まるものにする

Makefileを見てみましょう。例えばbuildターゲットを見ると「check-」で始まるディレクトリがビルドの対象になっていることがわかります。なのでもしコントリビュートを考えているようであれば、check-xxxxという名前で作りましょう。

コードを見てみる

手前味噌ですが、拙著のひとつであるcheck-ntpoffsetを見てみましょう。たかだか70行程度です。上から、package 宣言、各種パッケージのインポート、opts構造体、メイン関数、run関数…と続きます。

メイン関数

main関数はたった3行です。大抵の場合このままで良いでしょう。Nameの部分は、このcheck-ntpoffsetを実行してみるとわかると思いますが、下記、「★」の部分になります。なのでNameの箇所は自分の書くプラグインを表すものに変えると良いです。

★NTP★ OK: ntp offset is 0.290000(actual) < 50.000000(warning threshold), 100.000000(critial threshold)

閾値の指定と読み込み

opts構造体とgo-flangsで実装します。opts構造体でcritical, warningそれぞれを表すコマンドラインオプションの指定とそのデフォルト値を設定します。check-ntpoffsetの場合、コマンド実行時に -c または –critical でクリティカル閾値、 -w または –warning でワーニング閾値を指定できるようにしています。読み込みはmainから呼ばれるrunにあるように、github.com/jessevdk/go-flagsを使って、

_, err := flags.ParseArgs(&opts, args)

のように書けば良いです。使うときは opts.Crit などとします。閾値以外のコマンドラインオプションを用意したい時も同様にして使えます。

結果の出力

github.com/mackerelio/checkersを使います。このパッケージは結果出力用のユーティリティで、例えばクリティカルで終了させたいときは、return checkers.Critical(“メッセージ”)などとすることで、exit code 2, 標準出力に”メッセージ”を出力してくれます。また、checkers.NewChecker(checkers.Status, string)などとして使うこともできます。

これだけ押さえておけばあとは監視したいシステムの値を取得する部分を書くだけです。そしてその結果をopts.Critなどと比較して、超えていたらretrun checkes.Criticalなどとするだけです。簡単でしょう?

コントリビュート

以下、コントリビュートする場合です。

テスト/Lintを通す

コードを書いたら make test を実行してみましょう。テストコードがある場合はテストを実行してくれます。また、Makefileにあるように、testターゲットはlint、つまり構文チェックも実行してくれます。

ビルドする

テストが通ったらmake buildを実行してバイナリを作ってみます。linux/386なバイナリが生成されます。試しにlinuxマシンにおいてみて自分の作ったプラグインが動くか試してみましょう。

READMEを書く

自分の書いたプラグインのディレクトリにREADMEの新規作成、プロジェクト直下のREADMEに追加したプラグインの追記、と二つのREADMEを追加/編集します。READMEを書いたら書いたプラグインと一緒にプルリクエストを送ってみましょう。

以上、go-check-pluginsの簡単な解説でした。

明日は ariarijp さんです。

おわり

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Set your Twitter account name in your settings to use the TwitterBar Section.