Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

예외 클래스에 컨텍스트 추가

우리는 최근에 honeybadger 버전 3.2를 출시했습니다. 오류 보고서에 컨텍스트를 더 쉽게 추가할 수 있는 새로운 기능이 포함된 Ruby Gem.

tl;dr

꿀오소리 gem은 이제 #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 context will include:
# {
#   custom_attribute: {
#     foo: 'bar'
#   }
# }

컨텍스트란 무엇입니까?

컨텍스트를 사용하면 애플리케이션에서 오류가 발생할 때 Honeybadge에 추가 데이터를 보낼 수 있습니다. Rails에서 Honeybadger.context를 사용하여 현재 요청에 대한 컨텍스트를 설정할 수 있습니다. Ruby gem에서 제공하는 메소드:

Honeybadger.context({
  user_email: '[email protected]'
})

현재 요청(백그라운드 작업자를 실행 중인 경우 작업)에서 발생하는 모든 오류에는 고유한 컨텍스트 데이터가 있습니다.

컨텍스트 데이터는 무엇이든 될 수 있지만 현재 로그인한 사용자의 사용자 ID 또는 이메일 주소, 일부 원시 POST 데이터 또는 디버깅을 돕기 위한 기타 관련 페이로드, 백그라운드 작업의 ID 등과 같은 항목이 종종 포함됩니다.

수동으로 오류를 보고할 때 로컬 컨텍스트를 추가할 수도 있습니다.

Honeybadger.notify(exception, context: {
  user_email: '[email protected]'
})

재미있는 사실:컨텍스트는 무엇이든 될 수 있지만 Honeybadger에는 몇 가지 "특별한" 컨텍스트 키가 있습니다. 예를 들어 user_email을 포함하는 경우 키를 오류 보고서와 함께 사용하면 Honeybadger는 각 오류에 대해 영향을 받는 사용자 보고서를 생성합니다.

예외에서 컨텍스트 추가

일부 컨텍스트는 요청이 아니라 예외 자체에만 해당됩니다. 예를 들어, 패러데이 gem을 사용하여 HTTP 요청을 한다고 가정해 보겠습니다.

require 'faraday'

conn = Faraday.new(:url => 'https://example.com') do |faraday|
  faraday.response :raise_error # Raises an error if the request isn't successful
  faraday.adapter  Faraday.default_adapter
end

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

위의 코드는 다음 예외를 발생시킵니다:

Faraday::ResourceNotFound: the server responded with status 404

Honeybadger는 이 오류를 자동으로 보고하지만(그렇게 구성되었다고 가정) response에 대한 정보는 없습니다. 물체. 이 정보는 특히 500 응답과 같이 덜 명백한 서버 오류에 대해 있으면 좋을 것입니다.

Faraday::ResourceNotFound 정의 살펴보기 GitHub에서 실제로 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
  })
  # Additional error handling...
end

이를 통해 응답에 대한 몇 가지 추가 정보와 함께 실패한 요청을 Honeybadge에 보고할 수 있습니다.

우리는 이 패턴을 사용하여 오류가 발생할 때 예외 관련 컨텍스트를 추가하고, 작동하는 동안 구조 명령문과 사용자 지정 알림 로직으로 코드를 어지럽히고 코드에 많은 오버헤드를 추가합니다. 좋은 소식:더 좋은 방법이 있습니다!

새로운 기능:예외 수준 컨텍스트

오류를 수동으로 보고하는 대신 이제 컨텍스트를 예외 클래스 자체에서 정의할 수 있습니다. , 그리고 Honeybadger는 오류가 궁극적으로 보고되는 위치에 관계없이 자동으로 선택합니다.

못생긴 rescue를 추가하는 대신 이전 예제를 다시 살펴보세요. 명령문에서 Honeybadger의 기본 제공 보고가 예외를 처리하도록 허용하겠습니다.

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

대신 #to_honeybadger_context를 추가해 보겠습니다. Faraday::ClientError 메소드 , 이는 Honeybadge가 예외가 보고될 때 확인하는 특별한 방법입니다:

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

#to_honeybadger_context를 추가하여 Faraday::ClientError 메소드 , 오류가 발생할 때마다 코드를 복잡하게 하지 않고 응답 컨텍스트를 얻습니다!