우리는 최근에 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
메소드 , 오류가 발생할 때마다 코드를 복잡하게 하지 않고 응답 컨텍스트를 얻습니다!