これまでNagiosのプラグインはPythonで書くことが多かったのですが、クロスプラットフォームのバイナリを比較的容易に作れるGo言語で書くのも良いかなぁと思い、勉強がてら簡単なものを作ってみました。
はじめに
Nagios Pluginの仕様については説明を省きます。
Nagios Core Plugin API · Nagios Core Documentation を参照してください。
作ったプラグイン
作ったプラグインはGitHubに上げています。
main.go
main_linux.go
main_windows.go
check_memory_used
という名前でOSのメモリ使用率(%)をチェックするプラグインにしました。
対象プラットフォームはWindowsとLinuxにしています。
この程度であれば公式プラグインのcheck_memory
で十分なのですが、まあ、練習に丁度よかったのでそこはご容赦ください。
ちなみに開発環境はWindows 10上のVisual Studio Codeになります。
パッケージ olorin/nagiosplugin
ゼロからゴリゴリソースを書くのもアレですし、誰かがパッケージ位作っているだろうと調べたところ、
が良さげだったのでこれを採用しました。
GitHubの"Usage example"に基本的な使い方が書いていますが、nagiosplugin.NewCheck
メソッドでcheck
structを作り、この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の他に以下のパッケージを使いました。
- 引数解析 : go-flags
- Windowsのメモリ使用量取得(WMI) : StackExchange/wmi
- Linuxのメモリ使用量取得(/proc/meminfo) : go.procmeminfo
実行結果
プラグインの実行結果はこんな感じです。
Windows、Linux両方で良い感じに動いてくれています。
最後に
パッケージの使い勝手が良かったのでサクッとプラグインを書くことができました。
いまさらNagiosなのかという感じも若干ありますが、Nagios Pluginの仕様に互換のあるSensu Pluginにも使えるかもしれません。