cloudpack のかっぱこと 川原 洋平@inokara)です。

はじめに

sensu のプラグインを Ruby を使って書く時のメモ。あくまでも個人メモですので誤りがある場合にはご指摘頂けると幸いです。

sensu のプラグイン

sensu のプラグインと言っても以下のように分けられると思います。

  • check プラグイン
  • handler プラグイン(metrics プラグインや notification プラグインが含まれると思います)
  • mutator プラグイン
  • extensions プラグイン

今回は check プラグインを書く際について書いてみたいと思います。尚、check プラグインは以下の仕様に基いて言語を問わず書くことが可能ですたい。

  • OK は終了コードを 0 とする
  • Warning は終了コードを 1 とする
  • Critical は終了コードを 2 とする
  • 3 以上は Unknown 又カスタムの結果とする

ドキュメントにも下記のように書かれています。

Common exit status codes used are 0 for OK, 1 for WARNING, 2 for CRITICAL, and 3 or greater to indicate UNKNOWN or CUSTOM. As you may have realized, the Sensu check specification is compatible with Nagios, so you can use Nagios plugins with Sensu.

Nagios プラグインが利用出来る所以は上記の仕様に基いているからですね。

Ruby でプラグインを書いてみる

Ruby でプラグインを書く際に準備するもの

  • Ruby(何度も申し上げますが他の言語でも書けますけん)の環境
  • sensu-plugin
  • Rubocop(Community-Plugin に PR する際には必須です)
  • ネタ

ファイルの有無をチェックするプラグイン

ネタとしてホスト上のファイルの有無をチェックするプラグインをこさえてみました。

#!/usr/bin/env ruby
#
# Check file exists
# ===
#
# Yohei Kawahara 
#
# Released under the same terms as Sensu (the MIT license); see LICENSE
# for details.

require 'rubygems' if RUBY_VERSION < '1.9.0'
require "sensu-plugin/check/cli"

class CheckFileExists < Sensu::Plugin::Check::CLI

  option :path,
    short:       "-p file_path",
    long:        "--path file_path",
    description: "Define the file Path(Require)"

  def run
    if File.exist?("#{config[:path]}")
      ok "#{config[:path]} exists."
    else
      critical "#{config[:path]} does not exists."
    end
  end
end

引数の有無チェックとかはとりあえずは無しで。

重要なのが…

require "sensu-plugin/check/cli"

class CheckFileExists < Sensu::Plugin::Check::CLI

これです。Sensu::Plugin::Check::CLI を継承して CheckFileExists をこさえています。

後は…

def run 〜 end

の間に処理を記述するだけです。

今回は -p で指定したパスにファイルのが在るか無いかをチェックしています。指定したファイルがある場合には File.exist?("#{config[:path]}")true が返ってきます。true が返ってきたら…

ok "#{config[:path]} exists."

を実行してステータスコード 0 でスクリプトを終了します。true 以外が返ってきた場合(この場合には false)には…

critical "#{config[:path]} does not exists."

を実行してステータスコード 2 でスクリプトを終了します。

ok 又は ciritical を実行すれば sensu-plugin が由なしにステータスコードを吐いてくれるという段取りです。

ホントにステータスコード処理してまっか?

ファイルを作ったり削除して実験してみます。

ファイルが存在する場合…
$ touch /tmp/hoge
$ ./check-file-exists.rb -p /tmp/hoge
CheckfileExists OK: /tmp/hoge exists.
$ echo $?
0
ファイルが存在しない場合
$ rm /tmp/hoge
$ ./check-file-exists.rb -p /tmp/hoge
CheckfileExists CRITICAL: /tmp/hoge does not exists.
$ echo $?
2

ちゃんとステータスコードの処理もされているようですな。

Community-Plugin にプルリクエストしてみる前の準備

せっかくなので Community-Plugin にプルリクエストしたみたいと思います。github のプルリクエストの流儀等については別の記事にお譲りするとしてプルリクエストした後にスクリプトは Travis CI を利用して Rubocop のコーディングルールチェックが入るのでその辺りについて書きたいと思います。

怒られた図

コーディングルールに準じていない場合には以下のように怒られます。
Community-plugin にプルリクエストする前に、コーディングルールを合わせる

上記は余計な行が一行含まれているとのことで怒られています…しかも、Travis CI という公の場で厳しいご指摘です…orz。(今更気づきましたが世界の晒し者ですねw)

世界の晒し者(笑)になる前に…

世界の晒し者になる前に手元の環境でチェックを済ませてしまいましょうということで Rubocop をインストールしてチェックしてしまいましょう。

gem install rubocop --no-ri --no-rdoc -V

既に Community-Plugin を fork して手元にある場合には Community-Plugin ディレクトリ直下にコーディングルールが記述するされたファイルがあるのに気付くと思います。

.rubocop.yml

中身の詳細については割愛させて頂きますが、このルールを利用して手元の環境で以下のようにチェックを行います。

rubocop path/to/check-file-exists.rb

以下のように出力されました。
Community-plugin にプルリクエストする前に、コーディングルールを合わせる(2)

博多弁での厳しい叱責ではありませんが、コーディング規約違反を的確に指摘してくれます。冒頭の違反については実際に Travis CI では違反にはならない(あまりアテにならない過去の実績より…)ようですが、二つ目の違反については先述と同様に余計な行が入ってしまっていることによる指摘です。これは余計な行を削除することで指摘は出なくなります。やっほい。

あと気をつけておいた方が良いこと

  • スクリプトには実行権限を付与しておきましょう
  • READMEに色々と書かれてます
  • PR してもすぐには取り込まれないのでのんびりと待ちましょう(^^)※モノによっては直ぐに取り込まれたりマチマチ

最後に…

Ruby を殆ど知らない自分がこんなこと書いていいのかしらと思いますが、色々とプラグイン書くことで Ruby の勉強になったり、プルリクエストへの厳しい道ノリを学んだり、片言の英語でメンテナの方とやりとりしたりと Sensu プラグイン開発はなかなか楽しいですたい。

元記事はこちらです。
sensu のプラグインを書く時のメモ(1)