Goでcheck_smtpを書き直した go-check-smtp をリリースしました
nagios-pluginsに含まれている check_smtp
でSMTPコマンドの結果込みで監視できるように
Goで書き直してリリースしました。
https://github.com/nabeken/go-check-smtp
check_smtpの -C と -R が動いていない…?
MAIL
コマンドと RCPT
コマンドの実行結果を含めて監視する要件がありました。
つまり、コマンドの戻り値が200番台以外であればWARNINGあるいはCRITICALにする必要があります。
check_smtpのmanを見ると
まさにこのためのオプションとして -C
と -R
が用意されています。しかし、STARTTLSと同時
に使うとこのオプションは使えないことが判明しました。
今回の監視対象はSTARTTLSが必須なため、既存のプラグインは使えませんでした。
監視プラグインとGo
いろいろ理由は付けましたが、要はGoでプラグインを書く口実が欲しかった。 Sensuを触っているとRubyインタプリタが毎分forkしているのを見て微妙な気持ちになりませんか? Goと監視プラグインの相性はとてもよいはずです。
そこで、 go-check-smtpを書きました。
オリジナルの check_smtp
にあった-Cと-Rは微妙なのでなくしました。代わりにMAILとRCPTコマンドをきちんとチェックするようにしました。こんな感じ。
$ go-check-smtp \
-S \
-F localhost \
-H 127.0.0.1 \
-p 10025 \
-w 1s \
-c 2s \
-f sender@example.com \
-r recipient@example.com
SMTP CRITICAL: RCPT command was not accepted: 554 5.7.1 <recipient@example.com>: Relay access denied
細かい点としては時間間隔の指定がGoのtime.ParseDurationを使うようになるので書きやすくなっています(これは後述するgo-flagsの仕事)。
Travis CIではGithub Releasesに成果物を簡単にデプロイできます。
https://github.com/nabeken/go-check-smtp/blob/master/.travis.yml
手元でtagを切り、Githubへpushすると自動的にリリースされます。便利。
go-flagsとnagiosplugin
今回のプラグイン作成ではgo-flagsパッケージを使い、 コマンドライン引数をパースしました。カジュアルに書いてもちゃんと動くのがよいです。
nagios pluginsのAPIについては nagiospluginパッケージを手元にフォークしたバージョンを使いました。 フォークしたのはチェック名をプラグインの実行結果に反映させたかったためです。
<オリジナル版>
OK: 11.733648ms response time
<フォーク版>
SMTP OK: 11.733648ms response time
プラグインは複数のメトリクスから最終的な結果を返す必要があるため、状態を管理する 必要があります。プラグインを使うとその部分を自分で何度も書く必要がないため、便利です。
go-check-smtpがいい感じなので今後新規にプラグインを書く場合は Go + go-flags + nagiosplugin + TravisCIでサクっと書きたいと思います。