生産性向上ブログ

継続的な生産性向上を目指すエンジニアのためのブログ

sensuのログに "No such file or directory @ rb_sysopen - /tmp/sensu_server_loaded_files (Errno::ENOENT)" と出力されてhandlerが実行されない問題の対処法

環境

  • OS: Ubuntu 16.04
  • sensu: 0.26.5

内容

sensuでkeepaliveが落ちてるのにslackへの通知が飛ばなくなっていたので調査したところ、 /var/log/sensu/sensu-server.log にhandlerのoutputとして以下のようなエラーが記録されていた。

/opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-plugin/utils.rb:9:in `read': No such file or directory @ rb_sysopen - /tmp/sensu_server_loaded_files (Errno::ENOENT)
    from /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-plugin/utils.rb:9:in `config_files'
    from /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-plugin/utils.rb:22:in `settings'
    from /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-handler.rb:123:in `api_settings'
    from /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-handler.rb:131:in `api_request'
    from /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-handler.rb:179:in `stash_exists?'
    from /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-handler.rb:191:in `block (2 levels) in filter_silenced'
    from /opt/sensu/embedded/lib/ruby/2.3.0/timeout.rb:91:in `block in timeout'
    from /opt/sensu/embedded/lib/ruby/2.3.0/timeout.rb:33:in `block in catch'
    from /opt/sensu/embedded/lib/ruby/2.3.0/timeout.rb:33:in `catch'
    from /opt/sensu/embedded/lib/ruby/2.3.0/timeout.rb:33:in `catch'
    from /opt/sensu/embedded/lib/ruby/2.3.0/timeout.rb:106:in `timeout'
    from /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-handler.rb:190:in `block in filter_silenced'
    from /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-handler.rb:188:in `each'
    from /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-handler.rb:188:in `filter_silenced'
    from /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-handler.rb:36:in `filter'
    from /opt/sensu/embedded/lib/ruby/gems/2.3.0/gems/sensu-plugin-1.4.2/lib/sensu-handler.rb:80:in `block in <class:Handler>'
    warning: event filtering in sensu-plugin is deprecated, see http://bit.ly/sensu-plugin

調べてみると、↓のissueが見つかった。

github.com

どうやら、sensuはデフォルトだと /tmp 下にファイルを置いてhandler実行時にそのファイルを見に行くけど、なんらかの理由でファイルが削除されているとエラーになる様子。

自分の環境の場合、定期的に/tmp 下を削除する tmpreaper を入れているので、継続的に使用するファイルを /tmp 下に置かれるのは困る。

回避策としては、 /etc/default/sensu に以下の1行を入れてsensu-serverを再起動すればOK。

export SENSU_LOADED_TEMPFILE_DIR=/var/run/sensu

これで /tmp じゃなくて /var/run/sensu 下に該当のファイルが置かれるようになるので、勝手に削除されたりしない。しかし、一時ファイルじゃないものをデフォルトで /tmp に置くのは勘弁してほしい気がする。