どうも、かっぱ@inokara)です。

はじめに

sensu の検証過程で特に意識せずに設定を弄っていたらハマったのでメモです。あくまでも個人的な見解ですのでご注意くださいませ。


ハマった点

sensu check の設定を下記のように書いて監視を開始しておりました(特にエラーもなく sensu-client が起動した)。

/etc/sensu/conf.d/checks/vmstat-metrics.json
{
  "checks": {
    "vmstat-metrics": {
      "handlers": [
        "datadog",
        "graphite"
      ],
      "standalone": true,
      "subscribers": [

      ],
      "command": "/etc/sensu/plugins/system/vmstat-metrics.rb",
      "type": "metrics",
      "interval": 60
    }
  }
}

いつまでたってもメトリクスが登録されないよーと小一時間あーでもない、こーでもないしていましたが…結局…type: metric なんですよね。

/etc/sensu/conf.d/checks/vmstat-metrics.json
{
  "checks": {
    "vmstat-metrics": {
      "handlers": [
        "datadog",
        "graphite"
      ],
      "standalone": true,
      "subscribers": [

      ],
      "command": "/etc/sensu/plugins/system/vmstat-metrics.rb",
      "type": "metric",
      "interval": 60
    }
  }
}

上記のように修正して sensu-client を再起動することでメトリクスが登録され始めましたとさ…。


うーむ…

ちゃんと設定ファイルのチェック的な動作はソースコードを見るとあるようです。

さらに、sensu の本体とは別の gem で sensu-settingという gem がありこの gem で設定ファイルの validate に関する定義があるようです。

上記のこのあたりを読むと sensu の設定ファイルは各 json を deepmerge していることが解りました。(同僚の魔術師ぐっさんがそのようなことを以前から言っていた意味がやっと解りました。)

github.com/sensu/sensu-settings/blob/master/lib/sensu/settings/loader.rb#L85-L113
      def load_file(file)
        if File.file?(file) && File.readable?(file)
          begin
            warning("loading config file", :file => file)
            contents = IO.read(file)
            config = MultiJson.load(contents, :symbolize_keys => true)
            merged = deep_merge(@settings, config)
            unless @loaded_files.empty?
              changes = deep_diff(@settings, merged)
              warning("config file applied changes", {
                :file => file,
                :changes => changes
              })
            end
            @settings = merged
            @indifferent_access = false
            @loaded_files << file
          rescue MultiJson::ParseError => error
            warning("config file must be valid json", {
              :file => file,
              :error => error.to_s
            })
            warning("ignoring config file", :file => file)
          end
        else
          warning("config file does not exist or is not readable", :file => file)
          warning("ignoring config file", :file => file)
        end
      end

ということで

話はちょっと脱線してしまいましたが、以後は typo に気をつけたいと思います。それと、もう少しエラーとなる状況について調べてみたいと思います。

元記事はこちらです。
sensu の設定で value の typo は許容されて sensu が起動するようなので注意しましょう…