背景 システムの問題をトラブルシューティングするために最も一般的に使用される方法は、システム ログを確認することです。分散環境では、通常、ELK はログを統一された方法で収集するために使用されます。ただし、同時実行数が多い場合は、ログを使用して問題を特定するのは依然として面倒です。次の図を見てみましょう。 上の図では、ユーザーが URL を要求しています。リンク全体を図に示します。各処理層はログを生成します。では、これらのログを連結してリクエストのフルパス ログを形成するにはどうすればよいでしょうか? 既存のシステムでは、他のユーザー/他のスレッドのログも大量に出力され、通過してしまうため、指定したリクエストに関連するログをすべてフィルタリングすることが困難です。それで、これにどう対処すればいいのでしょうか? 解決 各リクエストに一意の識別子を付与し、ログを印刷するときに各リクエストに一意の識別子を使用できます。一意の識別子はダウンストリーム サービスに渡す必要があり、ダウンストリーム サービスもログを印刷するときにこの一意の識別子を含めます。この方法では、すべてのリンクを適切に追跡し、ログに表示することができます。 では、技術的な実装計画は何でしょうか?コードにできるだけ影響を与えないようにし、Logback の MDC メカニズムを使用して、ログ テンプレートに traceId 識別子を追加する必要があります。値は%X{traceId}です。 MDCとは MDC (Mapped Diagnostic Context) は、マルチスレッド条件下でのログ記録を容易にするために log4j および logback によって提供される機能です。 MDC は、キーと値のペアを追加できる、現在のスレッドにバインドされたマップとして見ることができます。 MDC の内容には、同じスレッドで実行されるコードからアクセスできます。現在のスレッドの子スレッドは、親スレッドの MDC の内容を継承します。ログ記録が必要な場合は、MDC から必要な情報を取得するだけで済みます。 MDC の内容は、プログラムによって適切なタイミングで保存されます。 Web アプリケーションの場合、このデータは通常、処理されるリクエストの最初に保存されます。 ソリューションの実装 MDC は内部的に ThreadLocal を使用するため、このスレッドでのみ有効であり、子スレッドおよび下流のサービス MDC の値は失われます。したがって、ソリューションの主な難しさは、主に次の部分を含む価値転送問題を解決することです。
ログテンプレートを変更する このフラグをログバック設定ファイルのログフォーマットに追加します ゲートウェイフィルターの追加 このフィルターは、ゲートウェイが MDC データをダウンストリーム サービスに渡す方法を解決します。 トレースIDを生成し、ヘッダーを介して下流のサービスに渡す 上記のコードには、org.slf4j.MDC に属する MDC があります。定数値は次のとおりです。
下流サービスにスプリングインターセプターを追加 traceId の値を受け取って保存します。 ダウンストリーム サービスにフェイク インターセプターを追加する 現在のサービスの traceId 値をダウンストリーム サービスに渡し続けます。 親子スレッド転送の問題を解決する スレッドプール(非同期・並列処理)は主にビジネスで使用され、Spring自体にもスレッドプールを使用するための@Asyncアノテーションがあります。この問題を解決するには、次の 2 つの手順が必要です。 logbackのLogbackMDCAdapterを書き換える logback の MDC 実装は内部的に ThreadLocal を使用しており、子スレッドを転送できないため、書き直して Alibaba の TransmittableThreadLocal に置き換える必要があります。 TransmittableThreadLocal は、スレッドをキャッシュするスレッド プールなどのコンポーネントを使用するときに ThreadLocal を転送する問題を解決するために Alibaba によって開発されたオープン ソースの InheritableThreadLocal 拡張機能です。 TransmittableThreadLocal をスレッド プールとメイン スレッド間で転送する場合は、TtlRunnable および TtlCallable と一緒に使用する必要があります。
TtlMDCAdapterInitializer クラスは、プログラムの起動時に独自の mdcAdapter 実装をロードするために使用されます。 スレッドプールの実装の拡張 TtlRunnable および TtlCallable 拡張機能を追加します。 シナリオテスト テストコードは次のとおりです。
APIゲートウェイによって出力されるログ ELK 集計ログは、traceId でリンク ログ全体を照会します。 システムで例外が発生した場合、次の図のように、例外ログの traceId 値を通じて、ログ センターでリクエストのすべてのログ情報を直接照会できます。 要約する この時点で分散ログ追跡が完了し、マイクロサービス全体のログリンクを簡単に確認できるようになりました。ありがとう!!! 著者: 教室を楽しむ リンク: https://www.jianshu.com/p/a3ebc9249b69 出典:建書 |
<<: JVMにおけるJavaポリモーフィズムは次のようになります
>>: 10 年以上前から話題になっている生物学クラウド コンピューティングが、いまだに停滞しているのはなぜでしょうか?
10月11日、成都ハイテク区主催のスマートシティ建設計画募集コンペティションと新経済活力フォーラムが...
女性は買い物に行き、男性はバッグを持つものだと信じているに違いありません。同様に、多くの人の印象では...
1. 問題JAVA テキスト ファイルはどのようにして CLASS バイナリ ファイルに変換されるの...
コアヒント: 検索エンジンにウェブサイトをもっと気に入ってもらうにはどうすればよいでしょうか? 初心...
デジタル変革は無視できない力です。あらゆる業種において、企業はテクノロジー企業になることを目指してお...
WeChat 7.0.7 がリリースされました!昨日、WeChat は Android バージョン ...
原題: 対立とチャンス: ワールドカップ「インターネット」イベント毎年のワールドカップは中国のインタ...
感染症の拡大が続き、在宅勤務する従業員の数が増え続ける中、多くの企業が業務をエッジに移行し、データ量...
Sina が立ち上げたクラウド プラットフォームは、WordPress ブログを作成したい人にとって...
CAP 理論は、分散ストレージ システムの現在の設計に対する理論的ガイドラインであり、PACELC ...
Raksmart がスーパープロモーションを開始し、米国西海岸のサンノゼとロサンゼルスのデータセンタ...
2013年2月19日、Baiduのアルゴリズムが再び調整されました。Baiduのウェブ検索不正対策チ...
1. 分散システムの難しさ張大鵬は難しい問題に遭遇した。彼らの会社には貴重なデータを保存するサーバー...
クラウド コンピューティングとエッジ コンピューティングの違いについて議論する際には、データ処理の実...
2012 年 3 月 5 日月曜日、著者は医療業界のウェブサイトの最適化方法を分析し、共通の特徴を発...