0

私たちは非常に分散したシステムを持っています。サイトでのユーザーのリクエストには、複数のサービスへの呼び出しが含まれる場合があります。たとえば、ユーザーがサイトにログオンすると、広告サービス、パーソナライズ サービス、関連するニュース サービスなどに呼び出しが行われ、ログイン時に表示するために必要なデータが構築されます。高レベルの設計: URL へのリクエストは Spring MVC コントローラーにマップされ、そのコントローラーは (ほとんどは HttpClient を使用して) さまざまなサービスを呼び出します。

Logstash、ElasticSearch、Kibana、Log4j/SLF4J を使用して集中ログ ソリューションを実装しています。サイトで問題が報告された場合、ログ レベルをデバッグに変更し、すべてのサービスで特定のリクエストのログ メッセージを表示できるようにしたいと考えています。Log4j MDC にリクエスト ID を設定しているため、Web アプリケーション サーバーでその特定のリクエストのログ メッセージを識別できます。他のサービスへの呼び出しからメッセージを関連付けるにはどうすればよいですか?

フロー: ユーザー ログイン --> Log4j MDC にリクエスト ID を入力してメッセージをログに記録する Spring MVC コントローラーにマップされたリクエスト --> サービス 1、サービス 2、サービス 3 への HTTP クライアント呼び出し

service1、service2、service3 からのメッセージを、MVC コントローラーによってログに記録されたメッセージに関連付ける方法。1 つの解決策は、http クライアント呼び出しで要求 ID を渡すことです。このパラダイムに従うアプリケーションはたくさんあるため、あらゆる場所でコードを変更することは理想的なソリューションではありません。

更新1:

jvm エージェントについてはよくわかりませんが、カスタム エージェントを開発して、ネットワーク呼び出しをインターセプトし、パラメーターを追加できるかどうか疑問に思っています。受信側のカスタム エージェントは、パラメーターを検出し、それを ThreadLocal 変数に追加します。Dynatrace PurePath テクノロジーは、何らかの方法で JVM 間で呼び出しを関連付けます。jvm エージェントを注入する必要があるため、エージェントで呼び出しをインターセプトしていると思います。このビデオをチェックしてください

4

1 に答える 1