Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

ブレッドクラムの紹介

本番環境でエラーに対処したことがありますか。何をしようとしても 、開発環境またはステージング環境で問題を再現することはできませんか?多くの場合、次のステップは、本番環境でデバッグログをスローして、より多くのデータを収集することです。ログをリクエストと関連付ける良い方法がない場合、特にインシデントの際にイライラする可能性があります。

役立つ機能を追加しました。これはブレッドクラムと呼ばれます。

ブレッドクラムの紹介

ブレッドクラム ログイベントに非常によく似ていますが、エラーと一緒に保存および報告されます。ログのように、ブレッドクラムにはメッセージが含まれますが、メタデータ(ハッシュマップの形式)を保持することもできます。ブレッドクラムのセットは、リクエスト(またはジョブの呼び出し)の存続期間を通じて収集され、エラーが報告されない限りすぐに削除されます。

スタックに独自のブレッドクラムを追加するのは簡単です。 Honeybadger.add_breadcrumbを呼び出すだけです コードのどこでも:

Honeybadger.add_breadcrumb("Loading User", metadata: {
  user_name: user_name,
})

その後にエラーが報告された場合は、ブレッドクラムスタックに表示されます:

ブレッドクラムの紹介

ああuser_name 空に見えます。問題が発生する可能性があります。

自動ブレッドクラム

Honeybadger Rubyライブラリには、パンくずリストを自動的に収集するためのRuby&Railsへのフックが含まれています。たとえば、本番環境で送信されたすべてのログメッセージ(Loggerを介して送信されます) クラス)は、ブレッドクラムとしてキャプチャおよび作成されます。また、Rails Instrumentationと連携して、コントローラーアクション、SQLクエリ、アクティブなジョブ呼び出しなどのブレッドクラムを収集します...

どのように使用できますか?

ブレッドクラムは現在、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の後にブレッドクラムを保存します 。このメッセージを送信した後にアプリが次にエラーをスローしたときは、どのユーザーがメッセージを送信したか、エラーに関連していつ発生したかを確認する必要があります、Yay!

add_breadcrumbが必要になるため、これは少し面倒です。 リクエストを送信する各場所に電話してください。 注意したい ただし、あります このようなブレッドクラムを作成する利点。このメソッドでキャプチャするメタデータについて非常に具体的にすることができます。多くの場合、これは本番環境のバグによって動機付けられたターゲット情報を収集するための優れた方法です。

本当に、いつどこでリクエストが出たのか知りたいだけです。図書館が私のためにほとんどの仕事をしてくれるといいのですが;)

ファラデーを使用したインストルメンテーション

少しごまかして、人気のあるファラデーリクエストライブラリを使用していると仮定します。

タスクを実行するために独自のミドルウェアを構築することもできますが、代わりにRailsインストルメンテーションをブローカーとして使用したいと思います。幸い、faraday_middleware gemによって提供されるミドルウェアがあり、イベントを発行します。 gemがGemfileにあることを確認します また、instrumentationを確認してください ミドルウェアが接続に注入されます。

connection = Faraday.new do |conn|
  conn.use :instrumentation
  conn.adapter Faraday.default_adapter
end

アプリ内で接続を共有しない場合、これには少し作業が必要になる可能性があります。怠惰な場合は、ConnectionOptionsの前に追加して、すべてのリクエストでミドルウェアが有効になっていることを確認することもできます。ただし、これにより、アプリ内で発生するファラデーリクエストが計測され、宝石も含まれるようになるので注意してください(必要な場合もあります)。

Railsインストルメンテーションを使用すると、いくつかの優れた副作用があります。1つは、他のユースケース(一般的なロギング目的など)に対して複数のサブスクリプションを作成できることです。

リクエストを監視しているBinge

ファラデーリクエストがインストルメント化されたので、サブスクライブしてブレッドクラムの作成に取り掛かることができます:

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は、送信リクエストごとにブレッドクラムを追加しています!

ブレッドクラムの紹介

リクエストからいくつかのデータポイントのみを検査していることに注意してください。機密データがブレッドクラムのメタデータに漏洩する可能性が高いため、送信または応答の本文のペイロードは追加しません。

どうなるか教えてください!

ブレッドクラムがデバッグツールボックスの追加に役立つことを願っています。試してみて、追加してほしいものがあれば、私たちに一言お願いします。


  1. ObjectRocketでのメトリックダッシュボードの紹介

    元々は2019年9月9日にObjectRocket.com/blogで公開されました Rackspace ObjectRocketでの私たちの使命は、お客様のデータベースを自動操縦に置くことです。そのため、データについて心配する必要がなく、優れたアプリの構築に集中できます。ただし、データベースが自動操縦になっている場合でも、システムの可観測性を維持することは重要な目標です。 データストアで何が起こっているのか、最新のアプリケーションの変更がデータベースのパフォーマンスにどのような影響を与えているのかを正確に把握することは非常に重要です。 そのため、新しいプラットフォームのCockro

  2. 新しい Linux テスト ラップトップの紹介:Lenovo G50

    これは一大イベントでしょう。最近、有名な T61 と T400 マシンを含め、テストとレビューに使用した合計 4 台のラップトップを廃止しました。つまり、Linux のインストールなどをすべて行うには、新しいコンピューターが必要でした。だから、レノボG50。 Nvidiaカードが付属しているため、古いLGハードウェアを引き続き使用するため、古くてスペックが弱いにもかかわらず、その点でまだ役に立ちます.しかし、私のディストリビューションのテストのほとんどは、この真新しい野獣に焦点を当てています.UEFI、セキュアブートなどについて話しているので、ここには非常に重要な点があります.私のレビュー