2012-09-19 32 views
7

हमारे पास एक ऐसा ऐप है जो हरोकू पर रिस्क श्रमिकों को चलाता है। हमने न्यू रिलीलिक ऐड-ऑन स्थापित किया है, और docs के अनुसार नए रिलिक एजेंट को ऑटो-वाद्ययंत्र कार्यकर्ताओं को रोकना चाहिए। हालांकि, हम नए रिलिक डैशबोर्ड पर "पृष्ठभूमि नौकरियां" टैब पर कोई आउटपुट नहीं देख रहे हैं।हेरोकू पर चलते समय नई अवशेष में रेस्क श्रमिकों की निगरानी कैसे करें?

उसी docs के अनुसार, हमने newrelic.yml फ़ाइल को स्पर्श नहीं किया। हम न तो सुनिश्चित हैं कि क्या गलत है और न ही इसे प्रभावी तरीके से कैसे डिबग करें। हमें क्या करना होगा?

+0

अपने रेस्क श्रमिकों के लिए लॉग में क्या आप न्यूट्रिक एजेंट कनेक्टिंग देखते हैं? – jakeonrails

उत्तर

11

यह पता चला हमारे स्वयं के कस्टम Resque.before_fork औरहोने से है कि हमारी समस्या के कारण हुई थीहैंडलर।

न्यूरेलिक का आरपीएम मणि स्वचालित रूप से श्रमिकों के लिए संचार चैनल स्थापित करने के लिए Resque.before_fork और Resque.after_fork के साथ हुक सेट करेगा। Resque की सीमा के रूप में, यह पहले_फोर और after_fork हुक के लिए केवल अंतिम निर्दिष्ट ब्लॉक/प्रो चलाता है। इसलिए, यदि आपके पास पहले_फर्क/after_fork हुक से पहले अपना कस्टम है, तो आपको * एजेंट के संचार चैनल को हाथ से स्थापित करना होगा, उदा।

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 

इस कोड को सीधे आरपीएम मणि की फाइल gems/newrelic_rpm-3.5.0/lib/new_relic/agent/instrumentation/resque.rb

आरपीएम बग अद्यतन 2012/12/27 से लिया जाता है: एक config/initializers/custom_resque.rb फ़ाइल में ऊपर तकनीक की तैनाती के बाद, हमने पाया कि आरपीएम मणि फोर्क मोड (जैसे रेस्क्यू) में इस्तेमाल होने पर फ़ाइल हैंडल लीक करता है। हमने ActiveRecord::StatementInvalid: ArgumentError: too large fdsets: SET client_min_messages TO '' के त्रुटि संदेशों को देखा। खुदाई के बाद हमने पाया कि ये तब होते हैं जब ActiveRecord डेटाबेस कनेक्शन खोलने का प्रयास करता है और ऐसा नहीं कर सकता क्योंकि फ़ाइल डिस्क्रिप्टर की संख्या समाप्त हो जाती है। न्यू रिलीक ने पुष्टि की कि व्याख्या योजना की नमूना करते समय एजेंट में एक बग है। ऐसा तब होता है जब बहुत से बचाव कार्य चलते हैं जो डीबी से जुड़ते हैं। ज्यादा सिर खरोंच हमें पता चला कि इस बग resque-lonely_job मणि जो Resque के before_perform हुक है कि एक Resque::Job::DontPerform अपवाद के साथ एक Resque काम करना बंद कर सकता का उपयोग करता है के साथ एक असमर्थित बातचीत के कारण हुई थी बाद:

बग अद्यतन 2013/01/28। आरपीएम क्लाइंट इस स्थिति में ठीक से साफ नहीं करता है और फाइल डिस्क्रिप्टर लीक करता है। नई अवशेष को सूचित किया गया है और एक फिक्स पर काम कर रहा है।

बग अपडेट 4/10/2013: यह तय किया गया है। हम 3.6.0.78 का उपयोग कर रहे हैं और यह इस मामले को संभालता है। कोई और फाइल डिस्क्रिप्टर लीक नहीं! धन्यवाद नया अवशेष।

+3

में से कोई भी नहीं था, मैं नई अवशेष के लिए काम करता हूं, और यह पूरी तरह से सही है। भविष्य में यह स्पष्ट करने के लिए हम दस्तावेज़ीकरण को अपडेट कर देंगे। इसे खोजने के लिए काम के लिए धन्यवाद। – jasonrclark

+3

हमारे पास पहले_फोर/बाद_फोर हुक का वर्णन करने वाला एक दस्तावेज़ है: https://newrelic.com/docs/ruby/resque-instrumentation फ़ाइल डिस्क्रिप्टर रिसाव के संबंध में - यह वास्तव में समझाया गया योजना कार्यक्षमता से संबंधित नहीं है, और केवल कुछ स्थितियों के तहत होता है, लेकिन मुझे लगता है कि हम इसे अभी समझते हैं और एक फिक्स पर काम कर रहे हैं। – grumbler

+1

1/28/2013 बग अपडेट के बारे में सिर्फ एक नोट: हम इसके बारे में नए अवशेष समर्थन के संपर्क में रहे हैं और वे कहते हैं कि इसमें कुछ समय लगेगा जब तक कि उनके पास कोई नया मणि नहीं है जो इस मुद्दे को हल करता है। इस बीच, अपवाद उठाए जाने से ठीक पहले, 'न्यूकेलिक :: एजेंट.शूटडाउन' को कॉल करने के लिए 'Resque :: Job :: DontPerform'' को बढ़ाने के लिए किसी भी स्थान पर बंदरपैचिंग करके आप इस मुद्दे को हल कर सकते हैं। –

4

मुझे एक ही समस्या हो रही थी क्योंकि नया रिलिक एजेंट मेरे रेस्क्यू श्रमिकों के भीतर शुरू नहीं हो रहा था। इसलिए मैं start the agent manually करने के लिए अपने resque:setup रेक कार्य अद्यतन:

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

क्या यह हेरोोकू पर काम करता है? –

+0

हां, यदि आप नया रिलिक हेरोकू ऐड-ऑन इंस्टॉल करते हैं, तो 'ENV [' NEW_RELIC_APP_NAME '] 'चर आपके लिए स्वचालित रूप से सेट होना चाहिए। – trliner

+0

मेरे लिए काम किया, धन्यवाद! – Dakuan

1

@trliner सुझाव की कोशिश की, लेकिन मैं रखने के इस त्रुटि हो रही थी:

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

आसान समाधान नहीं है, बस अपने Heroku उदाहरण के लिए NEWRELIC_ENABLE env जोड़ सकते हैं और सब कुछ काम करना चाहिए:

heroku config:set NEWRELIC_ENABLE=true 
+0

यह अजीब बात है कि मेरा जवाब आपके लिए काम नहीं करता है, लेकिन मुझे लगता है कि मैं आपके समाधान को वैसे भी बेहतर पसंद करता हूं। जिज्ञासा से बाहर, जो हरोकू स्टैक आप पर हैं? – trliner

+0

मैं सीडर – shem

+0

का उपयोग कर रहा हूं मैंने बहुत जल्द स्वीकार किया। उसने चाल नहीं की। नया अवशेष एजेंट भी ऑटो-यंत्र रेज्यूक। हम घटनाओं को देखते हैं जब हम देव मशीनों को हेरोकू इंस्टेंस के समान एनआर प्रमाण-पत्रों पर इंगित करते हैं। हालांकि, कोड को तैनात करने के बाद, यह घटनाएं नहीं भेजेगा ... –