2012-09-19 82 views
7

我們有一個在Heroku上運行resque workers的應用程序。我們已經安裝了New Relic插件,並且根據docs,New Relic Agent應該自動處理resque工作人員。但是,我們在New Relic儀表板的「後臺作業」選項卡上看不到任何輸出。在Heroku上運行時如何監視New Relic中的resque worker?

根據同樣的docs,我們沒有碰到newrelic.yml文件。我們不確定有什麼問題,也不知道如何有效地進行調試。我們需要做什麼?

+0

在您的Resque工作人員的日誌中,您是否看到newrelic代理連接? – jakeonrails

回答

11

原來,我們的問題是由我們自己的自定義Resque.before_forkResque.after_fork處理程序。

NewRelic的RPM gem將自動設置與Resque.before_forkResque.after_fork的鉤子來爲工作人員建立通信信道。作爲Resque的限制,它只運行最後分配的block/Proc到before_fork和after_fork鉤子。所以,如果你有自己定製的before_fork/after_fork鉤子,你必須手工設置代理的通信通道,例如。在配置/初始化/ custom_resque.rb文件:

Resque.before_fork do |job| 
    NewRelic::Agent.register_report_channel(job.object_id) 

    # extra custom stuff here 
end 

Resque.after_fork do |job| 
    NewRelic::Agent.after_fork(:report_to_channel => job.object_id) 

    # extra custom stuff here 
end 

該代碼是直接從寶石RPM的文件gems/newrelic_rpm-3.5.0/lib/new_relic/agent/instrumentation/resque.rb

RPM錯誤更新2012年12月27日採取:部署上述技術後,我們發現RPM gem在分叉模式下使用時會泄漏文件句柄(例如Resque)。我們觀察到類型爲ActiveRecord::StatementInvalid: ArgumentError: too large fdsets: SET client_min_messages TO ''的錯誤消息。經過大量的挖掘後,我們發現這些是由於ActiveRecord嘗試打開數據庫連接而導致的,並且由於文件描述符的數量已耗盡而導致的。 New Relic證實,在對解釋計劃進行抽樣時,代理中存在一個錯誤。當連接到數據庫的大量Resque作業運行時會發生這種情況。

錯誤更新2013年1月28日:多撓頭,我們發現,這個錯誤是由與使用Resque的before_perform鉤可與Resque::Job::DontPerform異常停止Resque作業resque-lonely_job創業板不支持的相互作用引起的經過。在這種情況下,RPM客戶端無法正確清理並泄漏文件描述符。 New Relic已被告知並正在進行修復。

錯誤更新2013年4月10日:已修復此問題。我們使用3.6.0.78,它處理這種情況。沒有更多的文件描述符泄漏!謝謝New Relic。

+3

我爲New Relic工作,這是完全正確的。我們將更新文檔,以便將來更清晰。感謝您找到這個工作。 – jasonrclark

+3

我們有一個文檔描述了before_fork/after_fork掛鉤在這裏:https://newrelic.com/docs/ruby/resque-instrumentation 關於文件描述符泄漏 - 它實際上與解釋計劃功能無關,只有在某些條件下發生,但我認爲我們現在瞭解它並正在修復。 – grumbler

+1

只需注意關於1/28/2013錯誤更新:我們一直在接觸New Relic對此的支持,他們說需要一段時間才能找到解決問題的新版本。與此同時,你可以在引發異常之前通過monkeypatching任何可以引發'Resque :: Job :: DontPerform'來調用'NewRelic :: Agent.shutdown'的地方來解決這個問題。 –

4

我遇到同樣的問題,因爲New Relic代理沒有在我的Resque工作人員中開始。所以,我在我的resque:setup rake任務更新爲start the agent manually

task "resque:setup" => :environment do 
    if ENV['NEW_RELIC_APP_NAME'] 
    NewRelic::Agent.manual_start :app_name => ENV['NEW_RELIC_APP_NAME'] 
    end 
end 
+0

這是否在Heroku上工作? –

+0

是的,如果您安裝New Relic Heroku插件,應該爲您自動設置ENV ['NEW_RELIC_APP_NAME']'變量。 – trliner

+0

爲我工作,謝謝! – Dakuan

1

嘗試@trliner建議,但我不斷收到此錯誤:

rake aborted! 
undefined local variable or method `establish_connection' for ActiveRecord::Base:Class 

有更簡單的方法,只需添加NEWRELIC_ENABLE ENV到您的Heroku的實例,一切應該工作:

heroku config:set NEWRELIC_ENABLE=true 
+0

奇怪的是,我的回答對你不起作用,但我認爲我更喜歡你的解決方案。出於好奇,Heroku堆棧在哪裏? – trliner

+0

我在使用Cedar – shem

+0

我很快就接受了。這並沒有訣竅。 New Relic代理還可以自動處理resque。當我們將開發機器指向與Heroku實例相同的NR憑證時,我們會看到發生的事件。但是,一旦部署代碼,它不會發送事件... –