独角兽超时处理

8
我想知道如何最好地从我的应用程序中跟踪独角兽超时。应用程序中有一些缓慢的部分,它们目前会在超时时默默退出。我可以增加超时时间,但这只是把问题藏起来。理想情况下,我想得到一个airbrake通知或类似的东西。我不是在寻找性能指南,只是希望能够高效、可靠地得到关于超时的通知。其他人如何处理使用独角兽的rails应用程序中的超时?扫描nginx错误日志?在独角兽配置中插入处理程序?在nginx配置中插入处理程序?[Ubuntu 12.04+nginx+unicorn+rails 3.2+ruby 1.9.3]

你找到答案了吗?我们正在使用Rack::Timeout。 - nroose
解决方法是扫描nginx日志以查找503(或某些50X,记不清了)状态,并从那里查看。以某种奇怪的方式实现了目标。 - Aditya Sanghi
3个回答

0

你可以在独角兽被杀死之前添加一个中间件来记录日志(如果中间件的处理时间比1秒的间隔时间长,那么日志不一定能够被处理,但你仍然可以获得相当数量的可见性)

# config/initializers/log_unicorn_timeout.rb
class LogUnicornTimeout
  def initialize(app)
    @app = app
  end

  def call(env)
    t = Thread.new do
      sleep(UNICORN_TIMEOUT - 1) # just before the timeout kicks in - 1
      unless Thread.current[:done]
        path = env["PATH_INFO"]
        query = env["QUERY_STRING"]
        Rails.logger.warn "Path: #{path} Query: #{query}"
      end
    end

    @app.call(env)
  ensure
    t[:done] = true
    t.run
  end
end

然后在你的application.rb中添加上面的中间件

config.middleware.use 'LogUnicornTimeout'


0

我倾向于在New Relic上创建一个帐户,使用他们的newrelic_rpm宝石,并收集与其Web应用程序中的性能问题相关的性能数据。 NR提供有用的免费帐户级别,适用于此情况。

使用这种有点懒惰的仪器方法的好处是双重的:您的应用程序中不需要自定义仪器实现;也不需要检查下游Web服务器日志以获取503服务器错误。


嗨!谢谢回答!但我目前不想介绍新的服务或应用程序。我正在寻找一种特定的方式来钩入独角兽超时捕获。 - Aditya Sanghi
也许你应该查看独角兽手册中的“配置器”和“调优”部分。 - Sasha

0
请参考独角兽手册网站的'配置器'部分。该部分包含一系列关于积压和超时的条目,这些条目应该能够给您提供所需的控制。

我已经浏览了那些页面。就我所知,它们并没有讨论如何处理超时问题。它们只是谈论控制超时时间。 - Aditya Sanghi
你是否已经为应用程序代码中超时相关的部分添加了 ensure 块? - Sasha
如果我知道所有的慢部分,我只会修复那些部分,而不关心超时等问题。我只对通过获取信息处理超时感兴趣。 - Aditya Sanghi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接