프로덕션에서 오류를 처리한 적이 있습니까? 무엇을 시도하든 , 개발 또는 준비 환경에서 문제를 복제할 수 없습니까? 종종 다음 단계는 프로덕션에서 디버그 로그를 던져서 더 많은 데이터를 수집하는 것입니다. 요청과 로그의 상관 관계를 파악할 수 있는 좋은 방법이 없으면 특히 사고 중에 좌절할 수 있습니다.
이를 돕기 위해 Breadcrumbs라는 기능을 추가했습니다.
이동경로 로그 이벤트와 매우 유사하지만 오류와 함께 저장 및 보고됩니다. 로그와 마찬가지로 Breadcrumb에는 메시지가 포함되어 있지만 메타데이터(해시맵 형식)도 포함할 수 있습니다. 요청(또는 작업 호출) 기간 동안 이동 경로 집합이 수집되고 오류가 보고되지 않는 한 즉시 삭제됩니다.
스택에 자신의 이동 경로를 추가하는 것은 간단합니다. Honeybadger.add_breadcrumb
로 전화하세요. 코드의 모든 위치:
Honeybadger.add_breadcrumb("Loading User", metadata: {
user_name: user_name,
})
그리고 그 뒤에 오류가 보고되면 Breadcrumb 스택에서 확인해야 합니다.
오 user_name
비어 있어 문제가 발생할 수 있습니다.
자동 이동 경로
Honeybadger Ruby 라이브러리에는 자동으로 빵 부스러기를 수집하는 Ruby &Rails에 대한 후크가 포함되어 있습니다. 예를 들어 프로덕션에서 내보내는 모든 로그 메시지(Logger
class)가 이동 경로로 캡처 및 생성됩니다. 또한 컨트롤러 작업, SQL 쿼리, 활성 작업 호출 등에 대한 이동 경로를 수집하기 위해 Rails Instrumentation에 연결합니다.
어떻게 사용할 수 있나요?
이동 경로는 현재 Ruby 클라이언트를 통해 사용할 수 있습니다. 4.4.0
버전으로 업데이트해야 합니다. 비활성화되므로 구성에서 활성화해야 합니다. 5.0.0
을 출시할 때까지 기본적으로 꼬임이 있는지 확인하기 위해 gem의 버전을 확인합니다.
사용해 보시고 문제가 발생하면 알려주세요.
이동 경로 확장
이제 Breadcrumb가 공식적으로 도입되었으므로 이를 확장하는 방법에 대한 간단한 예를 살펴보겠습니다. Rails 앱에서 Breadcrumbs를 활성화하면 무료로 첨부된 몇 가지 표준 계측 이동 경로를 얻을 수 있지만 더 많은 것을 원하면 어떻게 될까요?
앱이 HTTP 요청을 보낼 때마다 Breadcrumb를 만들고 싶다고 가정해 봅시다. 이 정보는 디버깅하는 동안 유용할 수 있습니다.
이를 수행하는 간단한 방법은 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
여기에서 우리는 모든 POST 후에 /message
에 이동 경로를 저장합니다. . 다음에 이 메시지를 보낸 후 앱에서 오류가 발생하면 어떤 사용자가 메시지를 보냈는지, 오류와 관련하여 언제 발생했는지 확인해야 합니다. 예!
add_breadcrumb
가 필요하므로 다소 번거롭습니다. 각 위치에 전화하여 요청을 보냅니다. 참고하고 싶습니다 그러나 있다 이런 식으로 빵 부스러기를 만드는 이점이 있습니다. 이 방법으로 캡처하려는 메타데이터를 매우 구체적으로 지정할 수 있습니다. 종종 이것은 프로덕션의 버그에 의해 동기가 부여된 표적 정보를 수집하는 좋은 방법입니다.
정말로 나는 언제 어디서 요청이 나가는지 알고 싶습니다. 도서관이 나를 위해 대부분의 일을 할 수 있다면 좋을 것입니다.;).
패러데이로 악기
우리는 약간의 속임수를 쓰고 여러분이 인기 있는 Faraday 요청 라이브러리를 사용하고 있다고 가정하겠습니다.
작업을 수행하기 위해 자체 미들웨어를 구축할 수도 있지만 대신 Rails 계측을 브로커로 사용하고 싶습니다. 운 좋게도 faraday_middleware gem에서 제공하는 미들웨어가 있어 이벤트를 생성합니다. gem이 Gemfile
에 있는지 확인하십시오. 또한 instrumentation
미들웨어가 연결에 주입됩니다.
connection = Faraday.new do |conn|
conn.use :instrumentation
conn.adapter Faraday.default_adapter
end
앱 내에서 연결을 공유하지 않는 경우 약간의 작업이 필요할 수 있습니다. 게으른 경우 ConnectionOptions를 추가하여 모든 요청에 미들웨어가 활성화되도록 할 수도 있습니다. 그러나 이것은 앱 내에서 발생하는 모든 패러데이 요청을 계측하고 gem도 포함하므로 주의하십시오(원할 수 있음)!
Rails 계측을 사용하면 몇 가지 좋은 부작용이 있습니다. 하나는 다른 사용 사례(예:일반 로깅 목적)에 대해 여러 구독을 할 수 있다는 것입니다.
요청 폭주
이제 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
Honeybadge는 이제 각 발신 요청에 대해 이동 경로를 추가하고 있습니다!
요청에서 몇 가지 데이터 포인트만 검사하고 있습니다. 민감한 데이터가 이동 경로 메타데이터로 누출될 가능성이 높기 때문에 발신 또는 응답 본문 페이로드를 추가하지 않습니다.
진행 상황을 알려주세요!
Breadcrumbs가 디버깅 도구 상자에 유용한 추가 기능이 되기를 바랍니다. 사용해 보시고 추가되었으면 하는 사항이 있으면 알려주세요.