2012-10-02 12 views
12

विलंबित जॉब दस्तावेज़ों में हुक का उल्लेख है, जिसमें त्रुटि हुक भी शामिल है, लेकिन केवल कस्टम नौकरी उप-वर्गों के संदर्भ में।जब कोई एक्शनमेलर त्रुटि में चलता है तो Delayed_Job एयरब्रैक को सूचित करता है?

This similar question (बिना किसी जवाब के) कहते हैं कि मेलर वर्ग में एक ही हुक जोड़ने से काम नहीं हुआ।

चाल क्या है?

अद्यतन:

सामान्य तौर पर, मैं नौकरियों कि object.delay.action() वाक्य रचना, जहां मैं एक ____Job वर्ग के लिए एक स्पष्ट लिंक नहीं दिखाई देता का उपयोग कर ट्रिगर कर रहे हैं करने के लिए हुक को जोड़ने का तरीका देखना चाहते हैं।

+1

अपडेट किया गया और सरल जवाब यहाँ: http://stackoverflow.com/questions/11766368/error-reporting-when-sending-emails-with-delayed-job/17029430#17029430 जिस तरह से – Subhas

उत्तर

20

मैं बस इस समस्या का हल ढूंढ रहा था, और मुझे this gist मिला।

मुझे नहीं पता कि यह कहां से आता है (इसे Google पर मिला), लेकिन अच्छी तरह से, ऐसा लगता है कि यह काम बहुत अच्छी तरह से काम करता है, यह काफी सरल है, और ऐसा लगता है कि विलम्ब जॉब की प्लगइन सिस्टम का पालन करना मुझे पता नहीं था

# https://gist.github.com/2223758 
# modified 

module Delayed 
    module Plugins 
    class Airbrake < Plugin 
     module Notify 
     def error(job, error) 
      ::Airbrake.notify_or_ignore(
      :error_class => error.class.name, 
      :error_message => "#{error.class.name}: #{error.message}", 
      :parameters => { 
       :failed_job => job.inspect, 
      } 
     ) 
      super if defined?(super) 
     end 
     end 

     callbacks do |lifecycle| 
     lifecycle.before(:invoke_job) do |job| 
      payload = job.payload_object 
      payload = payload.object if payload.is_a? Delayed::PerformableMethod 
      payload.extend Notify 
     end 
     end 
    end 
    end 
end 

Delayed::Worker.plugins << Delayed::Plugins::Airbrake 

यह इतना है कि यह airbrake में उपलब्ध है त्रुटि के संदेश और पेलोड जोड़ देगा: ...

यहाँ एक हल्के से सुधार एक पिछले बंदर-पैच कोड के कुछ हिस्सों का उपयोग कर रहा है।

+0

मुझे या तो इस प्लगइन सिस्टम से अवगत नहीं था। मैं एक नजर मार लूगां। अगर यह मेरे सिस्टम में काम करता है, तो मैं जल्द ही स्वीकृत उत्तर को आपके पास बदल दूंगा। –

+1

मुझे लगता है कि यह काम करता है;) धन्यवाद! – rchampourlier

+9

मुझे वास्तव में यह दृष्टिकोण पसंद है। मुझे एक मणि के रूप में जारी संस्करण नहीं मिला, इसलिए इसे साझा करने के लिए धन्यवाद, मैंने इसे आसानी से उपयोग करने के लिए इसे एक मणि के रूप में पैक किया। यदि आप पहुंच लिखना चाहते हैं, आदि, कृपया मुझे बताएं! https://github.com/benjaminoakes/delayed-plugins-airbrake –

1

ग्लोबल हुक का उपयोग करने का सबसे अच्छा तरीका होगा। 2011 में कोई proposed यह नहीं है, लेकिन ऐसा लगता है कि उन्हें अभी तक लागू नहीं किया गया है। जब काम में विफल रहता है बंदर-पैच delayed_job है airbrake को एक चेतावनी के माध्यम से भेजने के लिए delayed_job प्राप्त करने के लिए सबसे आसान तरीका

# Patch delayed job to report runtime errors to Airbrake 
module Delayed 
    class Worker 

    protected 

    def handle_failed_job_with_airbrake(job, error) 
     ::Airbrake.notify(
     :error_class => error.class.name, 
     :error_message => "#{error.class.name}: #{error.message}", 
     :parameters => { 
      :failed_job => job.inspect, 
     } 
    ) 

     handle_failed_job_without_airbrake(job, error) 
    end 

    alias_method_chain :handle_failed_job, :airbrake 

    end 
end 
+1

एयरब्रैक पैरामीटर दिखाता है, मैं 'job.inspect' भेजने की सलाह नहीं दूंगा बल्कि इसके बजाय हैश पास करता हूं। पहले विफल नौकरी की सामग्री का विश्लेषण करें: 'fail_job = YAML.load (job.handler)'।फिर इसके इंस्टेंस पैरामीटर को हैश में पार्स करें, जिसे आप एयरब्रैक के लिए 'पैरामीटर' पर भेज सकते हैं: 'fail_job.instance_variables.inject ({}) {| hsh, v | एचएसएच [v.to_s.gsub (/ [^ \ w] /, '')] = fail_job.instance_variable_get (v); एचएसएच} ' – iainbeeston

+1

आप 'पैरामीटर' में नौकरी का वर्ग नाम भी शामिल करना चाहेंगे:': class => fail_job.class.name' – iainbeeston

1

शायद:

मतलब समय में, यह बंदर पैच चीजों को काम करता है। यह आपको देरी_job के आंतरिक में हुक करने की अनुमति देता है, और कुछ गलत होने पर एयरब्रैक को अलर्ट करने के लिए थोड़ा सा संशोधित करता है।

दुर्भाग्य से, यह कैसे करना है यह इस बात पर निर्भर करेगा कि आप किस देरी_बॉब का उपयोग कर रहे हैं, और एयरब्रैक का कौन सा संस्करण आप उपयोग कर रहे हैं; यह भी निर्भर करेगा, शायद, देरी_job प्रसंस्करण के भीतर जहां आप सिस्टम में हुक करना चाहते हैं।

हालांकि, संभवतः मैंने जो कुछ भी किया है, उसके लिए मैंने देखा है कि हैंडल-पैच हैंडल_फेल_job विधि को बंदर-पैच करना है, जैसा कि here देखा गया है। ध्यान दें कि यह उदाहरण चेतावनी के लिए पुरानी हॉपटैड प्रणाली का उपयोग करता है, इसलिए यदि आप आधुनिक एयरब्रैक मणि का उपयोग कर रहे हैं, तो आपको उस कोड को बदलना होगा जो वास्तविक रूप से here वर्णित होने के बारे में सूचित करता है।

+0

मुझे याद दिलाने के लिए धन्यवाद। मैं अंत में एक ही बंदर पैच समाधान में आया था। कोड ऊपर फिसल गया। –

2

एक डीजे-हनीबैडर मणि है। मणि निश्चित रूप से सक्रिय रूप से बनाए रखा जाता है जो एक बंदर पैच का उपयोग करने से काफी बेहतर बनाता है। माना जाता है, जब बंदर पैच बाहर आया, ऐसा करने के लिए कोई मणि नहीं था।

https://github.com/honeybadger-io/delayed_job_honeybadger

+0

धन्यवाद, सवाल एयरब्रैक के लिए था, लेकिन यह एक समान, अच्छा जवाब है। (अब एक एयरब्रैक मणि भी है)। https://github.com/benjaminoakes/delayed-plugins-airbrake –

+1

आप सही हैं @ जोर्डन फेल्डस्टीन सवाल एयरब्रैक के लिए था। मजेदार मैं हनीबैगर के लिए एक ही हैक का इस्तेमाल किया और यह बहुत अच्छी तरह से काम किया। मुझे लगता है कि एयरब्रैक और हनीबैगर में एपीआई हैं जो एक ही कॉल का जवाब देते हैं (बहुत अच्छी बात) – lsaffie

+0

यह प्लगइन अब हनीबैगर के नवीनतम संस्करण के लिए बहिष्कृत है। –

संबंधित मुद्दे

 संबंधित मुद्दे