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

はじめに

serverspec の結果を sensu でチェックするという以下のの資料を読んでいて気付きました。

serverspec の結果を直接 sensu に渡すと result が正しく取得出来ないし、結果を /dev/null に捨てるとどのテストでコケたかわかんないよーという解決策として serverspec の出力結果を –format json で出力して sensu-client が listen しているポートに nc するという技で解決していたのですが…そもそも sensu-client も特定のポートで Listen していたんだ!という驚きがあったので調べてみました。


ソース

ほんまかいなそうかいなとソースを見てみたらありました。

  def setup_sockets
      options = @settings[:client][:socket] || Hash.new
      options[:bind] ||= '127.0.0.1'
      options[:port] ||= 3030
      @logger.debug('binding client tcp and udp sockets', {
        :options => options
      })
      EM::start_server(options[:bind], options[:port], Socket) do |socket|
        socket.logger = @logger
        socket.settings = @settings
        socket.transport = @transport
      end
      EM::open_datagram_socket(options[:bind], options[:port], Socket) do |socket|
        socket.logger = @logger
        socket.settings = @settings
        socket.transport = @transport
        socket.protocol = :udp
      end
    end

確認

実際に sensu-client が動いているホストで確認します。

# netstat -an | grep 3030
tcp        0      0 127.0.0.1:3030              0.0.0.0:*                   LISTEN
udp        0      0 127.0.0.1:3030              0.0.0.0:*
# ps auxww | grep sensu-client
root     17337  0.0  0.0 103208   808 pts/0    S+   00:48   0:00 grep sensu-client
sensu    17749  0.0  0.5 742828 22884 ?        Sl   Oct19   0:23 /opt/sensu/embedded/bin/ruby /opt/sensu/bin/sensu-client -b -c /etc/sensu/config.json -d /etc/sensu/conf.d -e /etc/sensu/extensions -p /var/run/sensu/sensu-client.pid -l /var/log/sensu/sensu-client.log -L info

応用

冒頭で紹介した serverspec の結果を sensu-client のポートに結果を投げることでチェックが出来るようになっていますが、その他にも sensu-users のメーリングリストでは以下のような投稿を見つけました。

完全に読み切れていない部分もありますが…

You can write something (a check executed by sensu, a daemon, etc) that writes multiple events to a local sensu-client’s socket. The sensu-client socket listens on 127.0.0.1:3030 (udp and tcp) and accepts JSON events.

とおっしゃっている方がいます。

ざっくり意訳すると…

  • sensu-client のソケットは 127.0.0.1:3030 で listen しているよ(TCP and UDP)
  • そいつは JSON イベントを受け付けるゼ
  • 例えば OK{'name': 'HOSTNAME_ping_check', status: 0, output: 'OK: HOSTNAME is up'}
  • BAD{'name': 'HOSTNAME_ping_check', status: 2, output: 'CRITICAL: HOSTNAME is down'}

という感じでしょうか。

この仕組を利用すれば複数のチェック結果を総合して OK 又は Warning 又は Critical を通知することが出来るようになりそうですね。


以上

小ネタでした!
ちょっとこれを利用したネタを引続き考えていきたいと思います。

元記事はこちらです。
sensu-client は port 3030 で listen していますの巻