क्या आपने कभी प्रोडक्शन में एक त्रुटि का सामना किया है, और कोई फर्क नहीं पड़ता कि आप क्या कोशिश करते हैं, आप अपने विकास या स्टेजिंग एनवायरनमेंट पर इस मुद्दे को दोहरा नहीं सकते? अक्सर अगला कदम प्रोडक्शन पर एक डिबग लॉग फेंककर अधिक डेटा इकट्ठा करना है। यदि आपके पास रिक्वेस्ट के साथ लॉग को सहसंबंधित करने का एक अच्छा तरीका नहीं है तो यह निराशाजनक हो सकता है, विशेष रूप से एक घटना के दौरान।
हम मदद के लिए एक सुविधा जोड़ी है, और इसे ब्रेडक्रंब्स कहा जाता है।

एक ब्रेडक्रंब एक लॉग इवेंट की तरह बहुत अधिक है, लेकिन यह एक त्रुटि के साथ संग्रहीत और रिपोर्ट किया जाता है। एक लॉग की तरह, एक ब्रेडक्रंब में एक संदेश होता है, लेकिन यह मेटाडेटा (हैशमैप के रूप में) भी रख सकता है। एक रिक्वेस्ट (या जॉब इनवोकेशन) के जीवन भर में ब्रेडक्रंब्स का एक सेट एकत्र किया जाता है, और तुरंत छोड़ दिया जाता है जब तक कि कोई त्रुटि रिपोर्ट नहीं की जाती।
अपने खुद के ब्रेडक्रंब्स को स्टैक में जोड़ना सरल है। बस अपने कोड में कहीं भी Honeybadger.add_breadcrumb को कॉल करें:
Honeybadger.add_breadcrumb("Loading User", metadata: { user_name: user_name, })
और यदि इसके बाद कोई त्रुटि रिपोर्ट की जाती है, तो आपको यह ब्रेडक्रंब स्टैक में दिखाई देनी चाहिए:

ओह user_name खाली दिखता है, इससे समस्याएं हो सकती हैं।
स्वचालित ब्रेडक्रंब्स
Honeybadger Ruby लाइब्रेरी में Ruby और Rails में हुक होते हैं जो स्वचालित रूप से ब्रेडक्रंब्स एकत्र करते हैं। उदाहरण के लिए, प्रोडक्शन में उत्सर्जित सभी लॉग संदेश ( Logger क्लास के माध्यम से भेजे गए) कैप्चर किए जाते हैं और ब्रेडक्रंब्स के रूप में बनाए जाते हैं। हम Rails इंस्ट्रूमेंटेशन में भी जुड़ते हैं ताकि कंट्रोलर एक्शन्स, SQL क्वेरीज़, एक्टिव जॉब इनवोकेशन, आदि के लिए ब्रेडक्रंब्स एकत्र किए जा सकें।
आप इसका उपयोग कैसे कर सकते हैं?
ब्रेडक्रंब्स वर्तमान में हमारे Ruby क्लाइंट के माध्यम से उपलब्ध हैं। आपको वर्जन 4.4.0 पर अपडेट करना होगा और कॉन्फिग में इसे सक्षम करना सुनिश्चित करें क्योंकि यह डिफ़ॉल्ट रूप से अक्षम होगा जब तक कि हम जेम का 5.0.0 वर्जन जारी नहीं करते, यह सुनिश्चित करने के लिए कि हम किसी भी किंक को दूर कर लें।
कृपया इसे आज़माएं और हमें बताएं कि क्या आप किसी समस्या में भाग लेते हैं।
ब्रेडक्रंब्स का विस्तार
अब जब ब्रेडक्रंब्स को औपचारिक रूप से पेश किया गया है, तो आइए उन्हें विस्तारित करने का एक त्वरित उदाहरण देखें। यदि आप Rails ऐप में ब्रेडक्रंब्स सक्षम करते हैं, तो आपको कुछ मानक इंस्ट्रूमेंटेशन ब्रेडक्रंब्स मुफ्त में जुड़े हुए मिलेंगे, लेकिन क्या होगा अगर हम और चाहते हैं?
मान लीजिए कि हम हर बार जब हमारा ऐप HTTP रिक्वेस्ट भेजता है तो एक ब्रेडक्रंब बनाना चाहते हैं। यह जानकारी डीबगिंग करते समय काम आ सकती है।
इसे पूरा करने का एक सरल तरीका प्रत्येक रिक्वेस्ट इनवोकेशन पर Honeybadger.add_breadcrumb को कॉल करना होगा।
def send_a_message
res = conn.post("/message", { user: user.id, body: "Hey!" }.to_json)
Honeybadger.add_breadcrumb("Request: /message", metadata: { user: user.id })
res
end
यहां हम /message पर हर POST के बाद एक ब्रेडक्रंब स्टोर करते हैं। अगली बार जब हमारा ऐप इस संदेश को भेजने के बाद एक त्रुटि फेंकता है, तो हमें पता चल जाएगा कि किस यूज़र ने संदेश भेजा और यह त्रुटि के संबंध में कब हुआ, याय!
यह थोड़ा बोझिल है, हालांकि, क्योंकि हमें हर स्थान पर add_breadcrumb कॉल की आवश्यकता होगी जहां हम रिक्वेस्ट भेजते हैं। मैं नोट करना चाहता हूं, हालांकि, हैं इस तरह ब्रेडक्रंब्स बनाने के फायदे। आप इस मेथड के साथ कैप्चर करना चाहते हैं मेटाडेटा के बारे में बहुत विशिष्ट हो सकते हैं। अक्सर यह प्रोडक्शन में बग से प्रेरित लक्षित जानकारी इकट्ठा करने का एक शानदार तरीका है।
वास्तव में मैं सिर्फ यह जानना चाहता हूं कि रिक्वेस्ट कब और कहां जाती है। यह भी अच्छा होगा अगर एक लाइब्रेरी मेरे लिए अधिकांश काम कर सके ;)।
फैराडे के साथ इंस्ट्रूमेंटिंग
हम थोड़ा धोखा देने जा रहे हैं और मान लेंगे कि आप लोकप्रिय फैराडे रिक्वेस्ट लाइब्रेरी का उपयोग कर रहे हैं।
हम अपना खुद का मिडलवेयर बना सकते थे अपना कार्य पूरा करने के लिए, लेकिन इसके बजाय मैं Rails इंस्ट्रूमेंटेशन को ब्रोकर के रूप में उपयोग करना चाहता हूं। सौभाग्य से, faraday_middleware जेम द्वारा प्रदान किया गया मिडलवेयर है जो हमारे लिए इवेंट्स उत्सर्जित करेगा। सुनिश्चित करें कि जेम आपके Gemfile में है और यह भी सुनिश्चित करें कि instrumentation मिडलवेयर कनेक्शन में इंजेक्ट किया गया है।
connection = Faraday.new do |conn|
conn.use :instrumentation
conn.adapter Faraday.default_adapter
end
यदि आप अपने ऐप के अंदर अपना कनेक्शन साझा नहीं करते हैं तो इसमें थोड़ा काम लग सकता है। यदि आप आलसी हैं तो आप ConnectionOptions को प्रीपेंड भी कर सकते हैं ताकि यह सुनिश्चित हो सके कि सभी रिक्वेस्ट में मिडलवेयर सक्षम है। सावधान रहें, हालांकि, क्योंकि यह आपके ऐप और शामिल जेम्स के भीतर होने वाले किसी भी फैराडे रिक्वेस्ट को इंस्ट्रूमेंट करेगा (जो आप चाहते होंगे)!
Rails इंस्ट्रूमेंटेशन के कुछ अच्छे साइड इफेक्ट्स हैं, उनमें से एक यह है कि हम अन्य उपयोग के मामलों (कहें सामान्य लॉगिंग उद्देश्यों के लिए) के लिए कई सब्सक्रिप्शन बना सकते हैं।
हमारे रिक्वेस्ट्स को देखना
अब जब हमारे फैराडे रिक्वेस्ट इंस्ट्रूमेंटेड हैं, तो हम सब्सक्राइब कर सकते हैं और कुछ ब्रेडक्रंब्स बनाना शुरू कर सकते हैं:
ActiveSupport::Notifications.subscribe "request.faraday" do |_, _, _, _, data|
method = data[:method].to_s.upcase
metadata = data.to_h.slice(:url, :status).merge({method: method})
Honeybadger.add_breadcrumb("#{method}: #{metadata[:url]}", category: "request", metadata: metadata)
end
Honeybadger अब हर आउटगोइंग रिक्वेस्ट के लिए एक ब्रेडक्रंब जोड़ रहा है!

ध्यान दें कि हम अपने रिक्वेस्ट्स से केवल कुछ डेटा पॉइंट्स का निरीक्षण कर रहे हैं। हम आउटगोइंग या रिस्पॉन्स बॉडी पेलोड नहीं जोड़ते क्योंकि संवेदनशील डेटा के हमारे ब्रेडक्रंब मेटाडेटा में लीक होने की अच्छी संभावना है।
हमें बताएं कैसा चला!
हम आशा करते हैं कि ब्रेडक्रंब्स आपके डीबगिंग टूलबॉक्स में एक उपयोगी जोड़ होंगे। इसे आज़माएं, और अगर कुछ है जो आप जोड़ना चाहेंगे तो हमें आवाज दें।