マイクロサービス分散アーキテクチャでログリンクトラッキングを実装するにはどうすればよいですか?

マイクロサービス分散アーキテクチャでログリンクトラッキングを実装するにはどうすればよいですか?

背景

システムの問題をトラブルシューティングするために最も一般的に使用される方法は、システム ログを確認することです。分散環境では、通常、ELK はログを統一された方法で収集するために使用されます。ただし、同時実行数が多い場合は、ログを使用して問題を特定するのは依然として面倒です。次の図を見てみましょう。

上の図では、ユーザーが URL を要求しています。リンク全体を図に示します。各処理層はログを生成します。では、これらのログを連結してリクエストのフルパス ログを形成するにはどうすればよいでしょうか?

既存のシステムでは、他のユーザー/他のスレッドのログも大量に出力され、通過してしまうため、指定したリクエストに関連するログをすべてフィルタリングすることが困難です。それで、これにどう対処すればいいのでしょうか?

解決

各リクエストに一意の識別子を付与し、ログを印刷するときに各リクエストに一意の識別子を使用できます。一意の識別子はダウンストリーム サービスに渡す必要があり、ダウンストリーム サービスもログを印刷するときにこの一意の識別子を含めます。この方法では、すべてのリンクを適切に追跡し、ログに表示することができます。

では、技術的な実装計画は何でしょうか?コードにできるだけ影響を与えないようにし、Logback の MDC メカニズムを使用して、ログ テンプレートに traceId 識別子を追加する必要があります。値は%X{traceId}です。

MDCとは

MDC (Mapped Diagnostic Context) は、マルチスレッド条件下でのログ記録を容易にするために log4j および logback によって提供される機能です。 MDC は、キーと値のペアを追加できる、現在のスレッドにバインドされたマップとして見ることができます。

MDC の内容には、同じスレッドで実行されるコードからアクセスできます。現在のスレッドの子スレッドは、親スレッドの MDC の内容を継承します。ログ記録が必要な場合は、MDC から必要な情報を取得するだけで済みます。 MDC の内容は、プログラムによって適切なタイミングで保存されます。 Web アプリケーションの場合、このデータは通常、処理されるリクエストの最初に保存されます。

ソリューションの実装

MDC は内部的に ThreadLocal を使用するため、このスレッドでのみ有効であり、子スレッドおよび下流のサービス MDC の値は失われます。したがって、ソリューションの主な難しさは、主に次の部分を含む価値転送問題を解決することです。

  • API Gateway の MDC データを下流のサービスに渡す方法
  • 他のリモート サービスを呼び出すときに、サービスはどのようにデータを受信して​​渡すのでしょうか?
  • 非同期の場合に子スレッドに渡す方法(スレッドプール)

ログテンプレートを変更する

このフラグをログバック設定ファイルのログフォーマットに追加します

ゲートウェイフィルターの追加

このフィルターは、ゲートウェイが MDC データをダウンストリーム サービスに渡す方法を解決します。

トレースIDを生成し、ヘッダーを介して下流のサービスに渡す

上記のコードには、org.slf4j.MDC に属する MDC があります。定数値は次のとおりです。

  1. /**
  2. * ログリンクトラッキングID情報ヘッダー
  3. */
  4. 文字列 TRACE_ID_HEADER = "x-traceId-header" ;
  5. /**
  6. * ログリンクトラッキングIDログフラグ
  7. */
  8. 文字列 LOG_TRACE_ID = "traceId" ;

下流サービスにスプリングインターセプターを追加

traceId の値を受け取って保存します。

ダウンストリーム サービスにフェイク インターセプターを追加する

現在のサービスの traceId 値をダウンストリーム サービスに渡し続けます。

親子スレッド転送の問題を解決する

スレッドプール(非同期・並列処理)は主にビジネスで使用され、Spring自体にもスレッドプールを使用するための@Asyncアノテーションがあります。この問題を解決するには、次の 2 つの手順が必要です。

logbackのLogbackMDCAdapterを書き換える

logback の MDC 実装は内部的に ThreadLocal を使用しており、子スレッドを転送できないため、書き直して Alibaba の TransmittableThreadLocal に置き換える必要があります。

TransmittableThreadLocal は、スレッドをキャッシュするスレッド プールなどのコンポーネントを使用するときに ThreadLocal を転送する問題を解決するために Alibaba によって開発されたオープン ソースの InheritableThreadLocal 拡張機能です。 TransmittableThreadLocal をスレッド プールとメイン スレッド間で転送する場合は、TtlRunnable および TtlCallable と一緒に使用する必要があります。

  • 残りのコードは ch.qos.logback.classic.util.LogbackMDCAdapter と同じですが、代わりに copyOnInheritThreadLocal が呼び出されます。

TtlMDCAdapterInitializer クラスは、プログラムの起動時に独自の mdcAdapter 実装をロードするために使用されます。

スレッドプールの実装の拡張

TtlRunnable および TtlCallable 拡張機能を追加します。

シナリオテスト

テストコードは次のとおりです。

  1. log.info( "テスト" )
  2. @非同期
  3. パブリックボイドテスト(){
  4. log.info( "テスト1" )
  5. }
  6. userService.findByUserName( "gu" );

APIゲートウェイによって出力されるログ

ELK 集計ログは、traceId でリンク ログ全体を照会します。

システムで例外が発生した場合、次の図のように、例外ログの traceId 値を通じて、ログ センターでリクエストのすべてのログ情報を直接照会できます。

要約する

この時点で分散ログ追跡が完了し、マイクロサービス全体のログリンクを簡単に確認できるようになりました。ありがとう!!!

著者: 教室を楽しむ

リンク: https://www.jianshu.com/p/a3ebc9249b69

出典:建書

<<:  JVMにおけるJavaポリモーフィズムは次のようになります

>>:  10 年以上前から話題になっている生物学クラウド コンピューティングが、いまだに停滞しているのはなぜでしょうか?

推薦する

サイトの背景に関する5つの重要なデータ分析についての簡単な説明

ほとんどのウェブマスターはバックグラウンドデータの分析を好まないと思います。大量の冷たいデータを前に...

ウェブマスターが「競争相手」を「ウェブサイト構築のヘルパー」に変える方法の簡単な分析

競争相手は、決して避けられない言葉です。利益を生む業界には、それを推進するさまざまなグループがあり、...

FTLスーパークラウドサーバー:35元、4Gメモリ/2コア/100Gハードディスク/無制限トラフィック、米国/香港/韓国データセンター

ftlcloud は現在、米国クラウド サーバー、香港クラウド サーバー、韓国クラウド サーバー、国...

特別なリマインダー: ルーマニアの商人 hostsolutions.ro は現在、大きな財務リスクに直面しています。

海外の苦情に強い VPS やサーバーを探している人の中には、主にルーマニアとノルウェーで VPS と...

limewave: シアトル VPS、30% オフ、メモリ + データ トラフィックが 1 倍、月額 2.8 ドルから

Limewaveは2010年に事業を開始し、主力事業は「有線インターネット接続」、続いてVPSやDA...

使用量の増加、経費の無駄…感染症の流行が原因の「クラウド課題」に遭遇していませんか?

パブリック クラウドの導入率は、2020 年初頭にパンデミックが発生する前からすでに増加していました...

finalhosting: 月額 2 ユーロ、オランダ VPS、1G メモリ/30g SSD/無制限トラフィック、カスタム ISO、無料の高セキュリティ

finalhostingは主にオランダでVPSを運営しており、スナップショットをサポートしています。...

世界のモバイルインターネット市場の年次調査

 はじめに:世界のモバイル インターネット市場は成熟しつつあり、ユーザーの要求はより多様化、パーソナ...

ロングテールキーワードの膨大なトラフィックから収益を得る方法

あらゆる分野、さまざまなメインキーワードには、一定のパターンがあると言えます。つまり、最初のいくつか...

ゲームライブストリーミングの世界に変化はあるのでしょうか?

タイガーフィッシュをめぐる長い綱引きが続く。当初の計画によれば、HuyaとDouyuは共通の主要株主...

クラウド導入における高可用性と災害復旧のための 4 つの専門家のヒント

障害が発生した場合でも中断することなく運用を継続するために、高可用性 (HA) と災害復旧 (DR)...

ウェブサイトの直帰率がウェブサイト全体に及ぼす一般的な影響についての簡単な分析

Baiduが統計ツールをリリースして以来、ウェブサイトの直帰率をより明確に把握できるようになりました...