কম্পিউটার টিউটোরিয়াল

এরর রিপোর্টিং উন্নত করা: Honeybadger-এ এক্সসেপশন ক্লাসে কনটেক্সট যোগ করা

আমরা সম্প্রতি honeybadger রুবি জেমের ভার্সন ৩.২ রিলিজ করেছি, যাতে এক্সসেপশন ক্লাসে কনটেক্সট যোগ করার একটি নতুন ফিচার রয়েছে। এটি আপনার এরর রিপোর্টকে আরও সমৃদ্ধ করে তোলে।

tl;dr

honeybadger জেম এখন যেকোনো এক্সসেপশন ক্লাসে #to_honeybadger_context মেথড ডিফাইন করার সুবিধা দেয়। যখন সেই এক্সসেপশনের কোনো ইনস্ট্যান্স থ্রো হয়ে Honeybadger-এ রিপোর্ট হয়, তার কনটেক্সট অটোমেটিক্যালি এরর রিপোর্টে জুড়ে যাবে:

class MyError < StandardError
  attr_reader :custom_attribute

  def initialize(err, custom_attribute)
    @custom_attribute = custom_attribute
    super(err)
  end

  def to_honeybadger_context
    { custom_attribute: custom_attribute }
  end
end

raise MyError.new("Something went wrong", { foo: 'bar' })
# Honeybadger কনটেক্সটে থাকবে:
# {
#   custom_attribute: {
#     foo: 'bar'
#   }
# }

কনটেক্সট কী?

যখন আপনার অ্যাপ্লিকেশনে এরর ঘটে, তখন Honeybadger-এ আপনি কনটেক্সট ব্যবহার করে অতিরিক্ত ডেটা পাঠাতে পারেন। রেইলসে (Rails), আপনি বর্তমান রিকোয়েস্টের জন্য Honeybadger.context মেথড দিয়ে কনটেক্সট সেট করতে পারেন, যা আমাদের রুবি জেম দ্বারা প্রদত্ত:

Honeybadger.context({ user_email: 'user@example.com' })

বর্তমান রিকোয়েস্টে (বা ব্যাকগ্রাউন্ড ওয়ার্কার রান করলে জবের জন্য) ঘটা প্রতিটি এরর তার নিজস্ব уникаল কনটেক্সট ডেটা পাবে।

আপনার কনটেক্সট ডেটা যেকোনো কিছু হতে পারে, কিন্তু সাধারণত এতে থাকে বর্তমান লগইন করা ইউজারের আইডি বা ইমেইল, কিছু র HTTP POST ডেটা বা ডিবাগিংয়ে সাহায্য করার অন্যান্য পেলোড, ব্যাকগ্রাউন্ড জবের আইডি ইত্যাদি।

আপনি ম্যানুয়ালি এরর রিপোর্ট করার সময় লোকাল কনটেক্সটও যোগ করতে পারেন:

Honeybadger.notify(exception, context: { user_email: 'user@example.com' })

মজার তথ্য: কনটেক্সট যেকোনো কিছু হতে পারে, কিন্তু Honeybadger-এ কিছু "স্পেশাল" কনটেক্সট কি রয়েছে। উদাহরণস্বরূপ, আপনি যদি এরর রিপোর্টে user_email কি অন্তর্ভুক্ত করেন, Honeybadger প্রতিটি এরর জন্য প্রভাবিত ব্যবহারকারীদের একটি রিপোর্ট তৈরি করবে।

এক্সসেপশন থেকে কনটেক্সট যোগ করা

কিছু কনটেক্সট রিকোয়েস্টের পরিবর্তে এক্সসেপশনটির নিজস্ব নির্দিষ্ট হয়। ধরুন, আমরা ফারাডে (faraday) জেম ব্যবহার করে HTTP রিকোয়েস্ট করছি:

require 'faraday'
conn = Faraday.new(:url => 'https://example.com') do |faraday|
  faraday.response :raise_error # রিকোয়েস্ট সফল না হলে এরর থ্রো করে
  faraday.adapter Faraday.default_adapter
end

response = conn.get('/does-not-exist') # => Faraday::ResourceNotFound

উপরোক্ত কোড নিচের এক্সসেপশনটি থ্রো করে:

Faraday::ResourceNotFound: the server responded with status 404

Honeybadger এই এররটি অটোমেটিক্যালি রিপোর্ট করবে (যদি কনফিগার করা থাকে), কিন্তু সেটিতে response অবজেক্ট সম্পর্কে কোনো তথ্য থাকবে না। কম স্পষ্ট সার্ভার এরর যেমন ৫০০ রেসপন্সের জন্য এই তথ্যটি খুব উপকারী হতো।

GitHub-এ Faraday::ResourceNotFound-এর ডেফিনিশন দেখলে পাবেন, এটি আসলে ClientError-এর একটি টাইপ, আর ClientError প্রতিটি ইনস্ট্যান্সে রেসপন্স অবজেক্ট সংরক্ষণ করার একটি অ্যাট্রিবিউট ডিফাইন করে।

এই তথ্য ব্যবহার করে, আমরা Faraday::ClientError-এর সকল ইনস্ট্যান্স রেসকিউ করে Honeybadger.notify দিয়ে রেসপন্স ডেটা কনটেক্সটে যোগ করতে পারি:

begin
  response = conn.get('/does-not-exist')
rescue Faraday::ClientError => err
  Honeybadger.notify(err, context: {
    response_status: err.response.status,
    response_headers: err.response.headers
  })
  # অতিরিক্ত এরর হ্যান্ডলিং...
end

এটি আমাদের ব্যর্থ রিকোয়েস্টগুলো রেসপন্স সম্পর্কে কিছু একস্ট্রা ইনফো সহ Honeybadger-এ রিপোর্ট করতে দেয়।

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

নতুন ফিচার: এক্সসেপশন-লেভেল কনটেক্সট

এরর ম্যানুয়ালি রিপোর্ট করার পরিবর্তে, কনটেক্সট এখন এক্সসেপশন ক্লাসের নিজেই ডিফাইন করা যাবে, এবং Honeybadger সেটি অটোমেটিক্যালি পিক আপ করবে, এরর কোথায় রিপোর্ট হোক না কেন।

পূর্বের উদাহরণটি পুনর্বিবেচনা করলে, বদসूरत rescue স্টেটমেন্ট যোগ করার পরিবর্তে, Honeybadger-এর বিল্ট-ইন রিপোর্টিং-কে এক্সসেপশন হ্যান্ডেল করার দায়িত্ব দিই:

response = conn.get('/does-not-exist') # => Faraday::ResourceNotFound

বরং, Faraday::ClientError-এ #to_honeybadger_context মেথড যোগ করি, যা Honeybadger যেকোনো এক্সসেপশন রিপোর্ট করার সময় চেক করে:

Faraday::ClientError.class_eval do
  def to_honeybadger_context
    {
      response_status: err.response.status,
      response_headers: err.response.headers
    }
  end
end

Faraday::ClientError-এ #to_honeybadger_context মেথড যোগ করলে, আমরা সেই এরর যেকোনো জায়গায় ঘটুক কেন, রেসপন্স কনটেক্সট পাব—কোডে কোনো ক্লাটার ছাড়াই!

  1. প্রাইরে এক্সেপশন হ্যান্ডলিং মাস্টার করুন: রেলস কনসোলে অ্যাডভান্সড টেকনিক

  2. রুবিতে কাস্টোম এক্সেপশন মাস্টার করুন: ধাপে ধাপে গাইড

  3. প্রোগ্রামিং-এ ক্লাসের গুরুত্ব: কোড সংগঠন এবং অ্যাবস্ট্রাকশন বাড়ানো

  4. রুবি এক্সেপশন মাস্টার করুন: আত্মবিশ্বাসের সাথে এরর হ্যান্ডলিং