背景 システムの問題をトラブルシューティングするために最も一般的に使用される方法は、システム ログを確認することです。分散環境では、通常、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 年以上前から話題になっている生物学クラウド コンピューティングが、いまだに停滞しているのはなぜでしょうか?
ほとんどのウェブマスターはバックグラウンドデータの分析を好まないと思います。大量の冷たいデータを前に...
競争相手は、決して避けられない言葉です。利益を生む業界には、それを推進するさまざまなグループがあり、...
ftlcloud は現在、米国クラウド サーバー、香港クラウド サーバー、韓国クラウド サーバー、国...
海外の苦情に強い VPS やサーバーを探している人の中には、主にルーマニアとノルウェーで VPS と...
Limewaveは2010年に事業を開始し、主力事業は「有線インターネット接続」、続いてVPSやDA...
パブリック クラウドの導入率は、2020 年初頭にパンデミックが発生する前からすでに増加していました...
finalhostingは主にオランダでVPSを運営しており、スナップショットをサポートしています。...
2021 年 6 月 2 日 - OpenInfra Foundation (Open Infras...
はじめに:世界のモバイル インターネット市場は成熟しつつあり、ユーザーの要求はより多様化、パーソナ...
Virpus の最新 VPS プロモーション: すべての SSD VPS、Xen 仮想 VPS クー...
あらゆる分野、さまざまなメインキーワードには、一定のパターンがあると言えます。つまり、最初のいくつか...
タイガーフィッシュをめぐる長い綱引きが続く。当初の計画によれば、HuyaとDouyuは共通の主要株主...
今夜、ZhihuはSAIF Partners Asiaが主導するシリーズBの資金調達ラウンドを2,2...
障害が発生した場合でも中断することなく運用を継続するために、高可用性 (HA) と災害復旧 (DR)...
Baiduが統計ツールをリリースして以来、ウェブサイトの直帰率をより明確に把握できるようになりました...