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でサクっと書きたいと思います。