আপনি কি কখনো প্রোডাকশনে একটি এরর সম্মুখীন হয়েছেন, এবং আপনি যা যেন করুন, ডেভেলপমেন্ট বা স্টেজিং এনভায়রনমেন্টে ইস্যুটি রিপ্লিকেট করতে পারলেন না? ofte nächস্ট ধাপ হচ্ছে ডিবাগ লগ প্রোডাকশনে ফেলা যেন আরও ডেটা গ্যাদার করা যায়। যদি আপনার पास লগকে রিকোয়েস্টের সাথে কোরিলেট করার ভালো উপায় না থাকে, তবে এটি ফ্রুস্ট্রেটিং, বিশেষ করে একটি ইনসিডেন্টের সময়।
আমরা একটি ফিচার যোগ করেছি সাহায্য করার জন্য, এবং এর নাম Breadcrumbs।

একটি Breadcrumb খুব বেশি একটি লগ ইভেন্টের মত, কিন্তু এটি একটি এররের সাথেই স্টোর এবং রিপোর্ট করা হয়। একটি লগের মত, একটি Breadcrumb-এ একটি মেসেজ থাকে, কিন্তু এতে মেটাডেটা ও থাকতে পারে (হ্যাশম্যাপ আকারে)। একটি রিকোয়েস্ট (বা জব ইনভোকেশন) এর জীবনচক্রে একটি সেট ব্রেডক্রাম্ব কালেক্ট হয়, এবং তা তৎক্ষণাৎ ড্রপ করা হয় যদি না কোনো এরর রিপোর্ট করা হয়।
আপনার নিজস্ব ব্রেডক্রাম্ব স্টকে যোগ করা খুব সহজ। আপনার কোডে যেকোনো জায়গায় Honeybadger.add_breadcrumb কল করুন:
Honeybadger.add_breadcrumb("Loading User", metadata: { user_name: user_name, })
যদি এরর রিপোর্ট করা হয় এর পর, তবে আপনি ব্রেডক্রাম্ব স্টকে সেটি দেখতে পাবেন:

ওহ, user_name খালি দেখাচ্ছে, এটা সমস্যা সৃষ্টি করতে পারে।
অটোমেটিক ব্রেডক্রাম্বস
Honeybadger Ruby লাইব্রেরিতে Ruby এবং Rails-এ হুক থাকে যাতে অটোমেটিক্যালি ব্রেডক্রাম্ব কালেক্ট করা যায়। উদাহরণস্বরূপ, প্রোডাকশনে প্রোমিট করা সকল লগ মেসেজ ( Logger ক্লাস দিয়ে পাঠানো) ক্যাপচার হয় এবং ব্রেডক্রাম্ব হিসেবে তৈরি হয়। আমরা Rails Instrumentation-ও টাই-ইন করি যাতে Controller Actions, SQL Queries, Active Job ইনভোকেশন ইত্যাদির জন্য ব্রেডক্রাম্ব গ্যাদার করা যায়।
আপনি কীভাবে ব্যবহার করতে পারেন?
ব্রেডক্রাম্ব বর্তমানে আমাদের 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 কল করতে হবে। আমি নোট করছি, যেহেতু এই পদ্ধতিতে আরও সুবিধা আছে। আপনি খুব স্পেসিফিক হতে পারেন কোন মেটাডেটা ক্যাপচার করতে চান। প্রায়শই এটি প্রোডাকশনে একটি বাগ দ্বারা মোটিভেটেড টার্গেটেড ইনফরমেশন গ্যাদার করার একটি চমৎকার উপায়।
আসলে আমি শুধু জানতে চাই কখন এবং কোথায় একটি রিকোয়েস্ট যায়। এছাড়া একটা লাইব্রেরি যদি অধিকাংশ কাজ করে দেয় তাহলে ভালো হতো ;)।
Faraday দিয়ে ইনস্ট্রুমেন্ট করা
আমরা একটু চিট করব এবং অনুমান করব আপনি পপুলার Faraday রিকোয়েস্ট লাইব্রেরি ব্যবহার করছেন।
আমরা নিজের মিডলওয়ার বানাতে পারতাম আমাদের টাস্ক সম্পন্ন করতে, কিন্তু বরং আমি Rails instrumentation-কে ব্রোকার হিসেবে ব্যবহার করতে চাই। মglésia, faraday_middleware gem দ্বারা প্রদত্ত মিডলওয়ার আছে যা ইভেন্ট ইমিট করবে। নিশ্চিত করুন জেমটি আপনার Gemfile-এ আছে এবং instrumentation মিডলওয়ার কানেকশনে ইনজেক্ট করা হয়েছে।
connection = Faraday.new do |conn|
conn.use :instrumentation
conn.adapter Faraday.default_adapter
end
এটি কিছু ওয়ার্ক লাগতে পারে যদি আপনি আপনার অ্যাপে কানেকশন শেয়ার না করেন। আপনি যদি আলসী হন, তবে ConnectionOptions প্রিপেন্ড করেও পারেন যাতে সকল রিকোয়েস্টে মিডলওয়ার এনাবল্ড থাকে। সাবধান থাকুন, কারণ এটি আপনার অ্যাপ এবং ইনক্লুডেড জেমগুলোর মধ্যে যেকোনো Faraday রিকোয়েস্ট ইনস্ট্রুমেন্ট করবে (যেটি আপনি চাইতে পারেন)!
Rails instrumentation-এর কিছু নাইস সাইড ইফেক্ট আছে, उनमें একটি হচ্ছে আমরা মাল্টিপল সাবস্ক্রিপশন বানাতে পারি অন্যান্য ইউজ কেসের জন্য (যেমন জেনারেল লগিং পারপোজ)۔
আমাদের রিকোয়েস্ট বিংজ-ওয়াচ করা
এখন আমাদের Faraday রিকোয়েস্টগুলো ইনস্ট্রুমেন্টেড, আমরা সাবস্ক্রাইব করি এবং ব্রেডক্রাম্ব তৈরি করি:
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 এখন প্রতিটি আউটগোইং রিকোয়েস্টের জন্য একটি ব্রেডক্রাম্ব অ্যাড করছে!

লক্ষ্য করুন আমরা আমাদের রিকোয়েস্টের কিছু ডেটা পয়েন্টই ইনস্পেক্ট করছি। আমরা আউটগোইং বা রেসপন্স বডি পেলোড অ্যাড করছি না কারণ সেনসিটিভ ডেটা ব্রেডক্রাম্ব মেটাডেটায় লিক হয়ে যাওয়ার চান্স আছে।
আমাদের জানান কীভাবে যাচ্ছে!
আমরা আশা করি ব্রেডক্রাম্বস আপনার ডিবাগিং টুলবক্সে একটি হেল্পফুল অডিশন হবে। ট্রাই করুন, এবং যদি কী কিছু অ্যাড করতে চান সেটি জানাতে চান তবে আমাদের এক শাউট দিন।