क्या आपने कभी उत्पादन में किसी त्रुटि का सामना किया है, और चाहे आप कुछ भी प्रयास करें , आप अपने विकास या मंचन परिवेशों पर समस्या को दोहरा नहीं सकते हैं? अक्सर अगला कदम उत्पादन में डिबग लॉग को उछालकर अधिक डेटा एकत्र करना होता है। यदि आपके पास अनुरोध के साथ लॉग को सहसंबंधित करने का एक अच्छा तरीका नहीं है, तो यह निराशाजनक हो सकता है, खासकर किसी घटना के दौरान।
हमने मदद के लिए एक फीचर जोड़ा है, और इसे ब्रेडक्रंब कहा जाता है।
एक ब्रेडक्रंब एक लॉग इवेंट की तरह है, लेकिन यह एक त्रुटि के साथ संग्रहीत और रिपोर्ट किया गया है। लॉग की तरह, ब्रेडक्रंब में एक संदेश होता है, लेकिन यह मेटाडेटा (हैशमैप के रूप में) भी रख सकता है। ब्रेडक्रंब का एक सेट अनुरोध (या नौकरी आमंत्रण) के पूरे जीवन में एकत्र किया जाता है, और जब तक कोई त्रुटि रिपोर्ट नहीं की जाती है, तब तक तुरंत छोड़ दिया जाता है।
अपने स्वयं के ब्रेडक्रंब को स्टैक में जोड़ना सरल है। बस Honeybadger.add_breadcrumb
पर कॉल करें आपके कोड में कहीं भी:
Honeybadger.add_breadcrumb("Loading User", metadata: {
user_name: user_name,
})
और अगर इसके बाद कोई त्रुटि रिपोर्ट की जाती है, तो आपको इसे ब्रेडक्रंब स्टैक में देखना चाहिए:
ओह user_name
खाली दिखता है, इससे समस्या हो सकती है।
स्वचालित ब्रेडक्रंब
हनीबैगर रूबी लाइब्रेरी में स्वचालित रूप से ब्रेडक्रंब एकत्र करने के लिए रूबी और रेल में हुक शामिल हैं। उदाहरण के लिए, उत्पादन में उत्सर्जित सभी लॉग संदेश (Logger
. के माध्यम से भेजे गए) क्लास) को पकड़ा जाता है और ब्रेडक्रंब के रूप में बनाया जाता है। हम कंट्रोलर एक्शन, एसक्यूएल क्वेरीज़, एक्टिव जॉब इनवोकेशन आदि के लिए ब्रेडक्रंब इकट्ठा करने के लिए रेल इंस्ट्रुमेंटेशन से भी जुड़ते हैं...
आप इसका उपयोग कैसे कर सकते हैं?
ब्रेडक्रंब वर्तमान में हमारे रूबी क्लाइंट के माध्यम से उपलब्ध हैं। आपको संस्करण 4.4.0
. में अपडेट करना होगा और इसे कॉन्फ़िगरेशन में सक्षम करना सुनिश्चित करें क्योंकि यह अक्षम हो जाएगा डिफ़ॉल्ट रूप से जब तक हम 5.0.0
. जारी नहीं करते मणि का संस्करण, यह सुनिश्चित करने के लिए कि हम किसी भी प्रकार की गड़बड़ी को दूर करते हैं।
कृपया इसे आज़माएं और अगर आपको कोई समस्या आती है तो हमें बताएं।
ब्रेडक्रंब का विस्तार करना
अब जबकि ब्रेडक्रंब को औपचारिक रूप से पेश कर दिया गया है, आइए एक त्वरित उदाहरण देखें कि उन्हें कैसे बढ़ाया जाए। यदि आप रेल ऐप में ब्रेडक्रंब सक्षम करते हैं, तो आपको कुछ मानक इंस्ट्रूमेंटेशन ब्रेडक्रंब मुफ्त में संलग्न होंगे, लेकिन अगर हम और अधिक चाहते हैं तो क्या होगा?
मान लें कि जब भी हमारा ऐप 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
. पर ब्रेडक्रंब स्टोर करते हैं . अगली बार जब हमारा ऐप इस संदेश को भेजने के बाद एक त्रुटि फेंकता है, तो हमें देखना चाहिए कि किस उपयोगकर्ता ने संदेश भेजा है और यह त्रुटि के संबंध में कब हुआ, याय!
हालांकि यह थोड़ा बोझिल है, क्योंकि हमें add_breadcrumb
. की आवश्यकता होगी प्रत्येक स्थान पर कॉल करें हम एक अनुरोध भेजते हैं। मैं नोट करना चाहता हूं , हालांकि, हैं इस तरह ब्रेडक्रंब बनाने के फायदे। आप इस बारे में बहुत विशिष्ट हो सकते हैं कि आप इस पद्धति से किस मेटाडेटा को कैप्चर करना चाहते हैं। अक्सर यह उत्पादन में एक बग से प्रेरित लक्षित जानकारी एकत्र करने का एक शानदार तरीका है।
वास्तव में मैं सिर्फ यह जानना चाहता हूं कि अनुरोध कब और कहां जाता है। यह भी अच्छा होगा यदि कोई पुस्तकालय मेरे लिए अधिकांश काम कर सके;)।
फैराडे के साथ इंस्ट्रुमेंटिंग
हम थोड़ा धोखा देने जा रहे हैं और मान लें कि आप लोकप्रिय फैराडे अनुरोध पुस्तकालय का उपयोग कर रहे हैं।
हम अपना काम पूरा करने के लिए अपना खुद का मिडलवेयर बना सकते हैं, लेकिन इसके बजाय मैं ब्रोकर के रूप में रेल इंस्ट्रुमेंटेशन का उपयोग करना चाहता हूं। सौभाग्य से, faraday_middleware मणि द्वारा प्रदान किया गया मिडलवेयर है जो हमारे लिए घटनाओं का उत्सर्जन करेगा। सुनिश्चित करें कि रत्न आपके Gemfile
. में है और यह भी सुनिश्चित करें कि instrumentation
मिडलवेयर को कनेक्शन में इंजेक्ट किया जाता है।
connection = Faraday.new do |conn|
conn.use :instrumentation
conn.adapter Faraday.default_adapter
end
यदि आप अपने ऐप के अंदर अपना कनेक्शन साझा नहीं करते हैं तो इसके लिए थोड़ा काम करना पड़ सकता है। यदि आप आलसी हैं, तो आप यह सुनिश्चित करने के लिए कनेक्शन विकल्प भी जोड़ सकते हैं कि सभी अनुरोधों में मिडलवेयर सक्षम है। हालांकि सावधान रहें, क्योंकि यह आपके ऐप के भीतर होने वाले किसी भी फैराडे अनुरोध को प्रभावित करेगा और इसमें रत्न भी शामिल होंगे (जो आप चाहते हैं)!
रेल इंस्ट्रुमेंटेशन का उपयोग करने के कुछ अच्छे दुष्प्रभाव हैं, एक यह है कि हम अन्य उपयोग के मामलों (सामान्य लॉगिंग उद्देश्यों के लिए कहते हैं) के लिए कई सदस्यताएँ बना सकते हैं।
हमारे अनुरोधों को द्वि घातुमान देखना
अब जब हमारे फैराडे अनुरोधों को पूरा कर लिया गया है, तो हम सदस्यता ले सकते हैं और कुछ ब्रेडक्रंब बनाने के लिए प्राप्त कर सकते हैं:
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
हनीबैगर अब प्रत्येक आउटगोइंग अनुरोध के लिए एक ब्रेडक्रंब जोड़ रहा है!
ध्यान दें कि हम अपने अनुरोधों से केवल कुछ डेटा बिंदुओं का निरीक्षण कर रहे हैं। हम आउटगोइंग या रिस्पॉन्स बॉडी पेलोड नहीं जोड़ते हैं क्योंकि एक अच्छा मौका है कि संवेदनशील डेटा हमारे ब्रेडक्रंब मेटाडेटा में लीक हो सकता है।
हमें बताएं कि यह कैसा चल रहा है!
हम आशा करते हैं कि ब्रेडक्रंब आपके डिबगिंग टूलबॉक्स को जोड़ने में सहायक होगा। इसे आज़माएं, और अगर आप कुछ जोड़ा देखना चाहते हैं तो हमें चिल्लाएं।