どうも、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 していますの巻」