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

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

背景

システムの問題をトラブルシューティングするために最も一般的に使用される方法は、システム ログを確認することです。分散環境では、通常、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 年以上前から話題になっている生物学クラウド コンピューティングが、いまだに停滞しているのはなぜでしょうか?

推薦する

Qunarは、UGC獲得競争のために良いレビューを買うためにお金を費やしていると同業他社から批判された。

Qunar.com は昨日、同業他社から公に批判された。マフェンウォ・トラベル・ネットワークのチェン...

SEO 担当者が従来の企業で進歩を遂げるのはなぜ難しいのでしょうか?

なぜ SEO 担当者が従来の企業で進歩を遂げるのはそれほど難しいのでしょうか? 私の個人的な経験に基...

新しいアルゴリズムに挑戦するためのSEOのヒント

6月以前のBaidu検索エンジンのアルゴリズムは旧アルゴリズムと呼ばれ、6月から8月までのアルゴリズ...

悪質なオンライン競争

最近、一部のウェブマスターは、理由もなく自分のウェブサイトが追い出されたり、降格されたりすることにい...

cloudcone: 超大容量ハードディスク VPS 再入荷、ロサンゼルス KVM、最大 500G ハードディスク、PayPal/Alipay

cloudcone は、電子メール マーケティング用の大容量ハード ドライブ VPS (ストレージ ...

SEO は不正行為ですか? SEO担当者はこの概念を変えるために努力すべきだ

誰かがブログのスパムコメントについて言及するたびに、それはまた SEO 担当者によるものだと言う人が...

エンタープライズSaaSの新たな可能性を探るスマートシーンのアップグレード

SaaS モデルは、クラウド コンピューティング分野で企業に最も認知されているサービス モデルであり...

2020 年の SD-WAN: 注目すべき 6 つのトレンド

[51CTO.com クイック翻訳] 多くのベンダーは、クラウド エントリ チャネル、主要な Saa...

【最新版】日本のクラウドサーバーを提供するおすすめ優良業者

日本はネットワーク事情が発達しているため、市場には日本のクラウドサーバーを提供する事業者が多数存在し...

WEB2.0ボタンツール:Baiduの共有

Baidu Share は、Baidu が Web ページのアドレスを収集して共有するために提供して...

SEO 最適化: 「一般的な分析を安易に使用しないでください」

真夜中に、ずっと聞きたかった、あるいは誰もが知っているこの質問を突然思いつきました。まずはここで続き...

クラウドベンダーがダブル11セールに参加

また11月がやってきて、また眠れない夜がやってきました。 「独身の日」にちなんで名付けられたダブル1...

マーケティング Web サイトにはどのようなマーケティング要素が必要ですか?

ウェブサイトはますます急速に発展しており、ますます多くの企業がオンライン マーケティングに参加するよ...

哀れなウェブマスターとロボットが語らなければならない物語

今日 Xiaomao がお話ししたいのは、すべてのウェブマスターがよく知っているロボット ファイルで...

#ロシア VPS# ruvds-6.6 USD/Windows/1g RAM/20g ハードディスク/無制限トラフィック

ruvdsはロシアの会社です。公式サイトで具体的な背景を知ることができます。ruvdsは現在、ロシア...