グラハム・ダンプルトン:ラップチャーを使ったライブトレース ノート

グラハム・ダンプルトン:ラップチャーを使ったライブトレース

Wraptureバインディングは、元々は単体テストに使用されていましたが、強力なトレーシングメカニズムとしても機能します。バインディングはメソッド呼び出しを監視し、イベントを発行します。これらのイベントは、テストテープの代わりに「シンク」によって処理されます。これにより、実行中のプログラムのリアルタイムなナレーションが可能になります。この記事では、カード決済が拒否される可能性のあるGateway、Ledger、Notifierを含むOrderServiceを使用してこれを説明します。3つのバインディングが主要なメソッドに適用されます:OrderService.place、Gateway.charge、Ledger.record。簡単なPrinterシンクを使用してこれらのイベントを表示します。出力には、引数、戻り値、例外を含む詳細な呼び出し情報が表示され、インデントによって呼び出しのネストが示されます。重要なことに、カード番号のような機密データは、バインディングレベルのwrapture.redact()キャプチャポリシーを使用して編集できます。シンクが登録されていない場合、バインディングは最小限のオーバーヘッドで、呼び出しあたり約0.5マイクロ秒で実行されます。大量のトレースを管理するために、シンクまたはバインディングレベルでフィルタリングを適用できます。シンクレベルのフィルタリング、例えばwrapture.Depth(1, wrapture.Printer())は、トップレベルの呼び出しのみに出力を制限し、簡潔な概要を提供します。when=を使用したバインディングレベルのフィルタリングは、特定の呼び出しに対してイベントの構築を防ぐ述語を受け取るため、非常に効率的です。ただし、when=は指定されたイベントのみをスキップします。ネストされた呼び出しは引き続き記録されます。呼び出しツリー全体を抑制するには、バインディングにtree=Trueを追加でき、「ここから下は何も」トレースされないことを保証します。バインディングはfiltered_callsも追跡し、ユーザーがどの操作が抑制されたかを理解できるようにします。このセットアップにより、プログラムは最小限のコード変更と、さまざまな監視ニーズに対応するカスタマイズ可能なシンクで、リアルタイムデータを使用して自身の動作を自己記述できます。