しばたテックブログ

気分で書いている技術ブログです。

Go言語でNagios Pluginを書いてみた

これまでNagiosのプラグインはPythonで書くことが多かったのですが、クロスプラットフォームのバイナリを比較的容易に作れるGo言語で書くのも良いかなぁと思い、勉強がてら簡単なものを作ってみました。

はじめに

Nagios Pluginの仕様については説明を省きます。
Nagios Core Plugin API · Nagios Core Documentation を参照してください。

作ったプラグイン

作ったプラグインはGitHubに上げています。

github.com

main.go

main_linux.go

main_windows.go

check_memory_usedという名前でOSのメモリ使用率(%)をチェックするプラグインにしました。
対象プラットフォームはWindowsとLinuxにしています。

この程度であれば公式プラグインのcheck_memoryで十分なのですが、まあ、練習に丁度よかったのでそこはご容赦ください。

ちなみに開発環境はWindows 10上のVisual Studio Codeになります。

パッケージ olorin/nagiosplugin

ゼロからゴリゴリソースを書くのもアレですし、誰かがパッケージ位作っているだろうと調べたところ、

github.com

が良さげだったのでこれを採用しました。

GitHubの"Usage example"に基本的な使い方が書いていますが、nagiosplugin.NewCheckメソッドでcheckstructを作り、このstructにチェックした結果を設定する形になります。
Fihishメソッドで終了処理を行います。

// main.goより
// 初期化処理と終了処理
check := nagiosplugin.NewCheck()
defer check.Finish()

チェックした結果はAddResultまたはAddResultfメソッドで設定します。
細かい説明はしませんが、見て直感的にわかるかと思います。

// main.goより
// チェック結果の設定(AddResultfメソッド)

// Critical
check.AddResultf(nagiosplugin.CRITICAL, "Memory used %d%%", used)
// Warning
check.AddResultf(nagiosplugin.WARNING, "Memory used %d%%", used)
// OK
check.AddResultf(nagiosplugin.OK, "Memory used %d%%", used)

なお、AddResultまたはAddResultfメソッドを呼び忘れた場合はnagiosplugin.UNKNOWNが返されます。

そしてパフォーマンスデータを設定する場合はAddPerfDatumメソッドを使います。

// main.goより
// パフォーマンスデータの設定

// ラベル, 単位(ルールあり), 設定値, Warning, Critical, min, max
err = check.AddPerfDatum(opts.Label, opts.Unit, float64(used), float64(opts.Min), float64(opts.Max), float64(opts.Warning), float64(opts.Critical))

引数は順にラベル単位設定値Warningの閾値Criticalの閾値最小値最大値となります。
単位についてはNagiosで有効な単位に制限されていますので注意してください。
数値についてはすべてfloat64型なのでキャストがちょっと面倒ですが仕方ない感じです。

その他パッケージ

nagiospluginの他に以下のパッケージを使いました。

実行結果

プラグインの実行結果はこんな感じです。

f:id:stknohg:20160727122558p:plain

Windows、Linux両方で良い感じに動いてくれています。

最後に

パッケージの使い勝手が良かったのでサクッとプラグインを書くことができました。

いまさらNagiosなのかという感じも若干ありますが、Nagios Pluginの仕様に互換のあるSensu Pluginにも使えるかもしれません。