Ktor Server でのリクエストのトレース
必須の依存関係: io.ktor:ktor-server-call-id
コード例: call-id
CallId プラグインを使用すると、一意のリクエスト ID またはコール ID を使用して、クライアントリクエストをエンドツーエンド (end-to-end) でトレースできます。通常、Ktor でコール ID を操作する流れは次のようになります。
- まず、以下のいずれかの方法で特定のリクエストのコール ID を取得する必要があります。
- 次に、Ktor は定義済みの辞書 (dictionary) を使用して、取得または生成されたコール ID を検証します。独自の検証条件を指定することも可能です。
- 最後に、
X-Request-Idなどの特定のヘッダーを使用して、クライアントにコール ID を送信できます。
CallId を CallLogging と併用すると、コール ID を MDC コンテキスト (MDC context) に配置し、各リクエストに対してコール ID を表示するようにロガーを設定することで、トラブルシューティングに役立てることができます。
クライアント側では、Ktor はクライアントリクエストをトレースするための CallId プラグインを提供しています。
依存関係の追加
CallId を使用するには、ビルドスクリプトに ktor-server-call-id アーティファクトを含める必要があります。
CallId のインストール
CallId プラグインをアプリケーションにインストールするには、指定された
install 関数に渡します。 以下のコードスニペットは、CallId をインストールする方法を示しています。 - ...
embeddedServer関数の呼び出し内。 - ...
Applicationクラスの拡張関数である明示的に定義されたmodule内。
CallId の設定
コール ID の取得
CallId は、コール ID を取得するためのいくつかの方法を提供します。
指定されたヘッダーからコール ID を取得するには、
retrieveFromHeader関数を使用します。例:kotlininstall(CallId) { retrieveFromHeader(HttpHeaders.XRequestId) }また、
header関数を使用して、同じヘッダーでコール ID の取得と送信を同時に行うこともできます。必要に応じて、
ApplicationCallからコール ID を取得することもできます。kotlininstall(CallId) { retrieve { call -> call.request.header(HttpHeaders.XRequestId) } }
取得されたすべてのコール ID は、デフォルトの辞書を使用して検証されることに注意してください。
コール ID の生成
リクエストにコール ID が含まれていない場合は、generate 関数を使用して生成できます。
- 以下の例は、定義済みの辞書から指定された長さのコール ID を生成する方法を示しています。kotlin
install(CallId) { generate(10, "abcde12345") } - 以下の例では、
generate関数にコール ID 生成用のブロックを渡しています。kotlininstall(CallId) { val counter = atomic(0) generate { "generated-call-id-${counter.getAndIncrement()}" } }
コール ID の検証
取得または生成されたすべてのコール ID は、デフォルトの辞書を使用して検証されます。デフォルトの辞書は以下の通りです。
CALL_ID_DEFAULT_DICTIONARY: String = "abcdefghijklmnopqrstuvwxyz0123456789+/=-"これは、大文字を含むコール ID は検証を通過しないことを意味します。必要に応じて、verify 関数を使用してより緩いルールを適用できます。
install(CallId) {
verify { callId: String ->
callId.isNotEmpty()
}
}完全な例はこちらで確認できます: call-id
クライアントへのコール ID の送信
コール ID を取得または生成した後、それをクライアントに送信できます。
header関数を使用すると、コール ID の取得と、同じヘッダーでの送信を同時に行うことができます。kotlininstall(CallId) { header(HttpHeaders.XRequestId) }完全な例はこちらで確認できます: call-id
replyToHeader関数は、指定されたヘッダーでコール ID を送信します。kotlininstall(CallId) { replyToHeader(HttpHeaders.XRequestId) }必要に応じて、
ApplicationCallを使用して レスポンス 内でコール ID を送信できます。kotlinreply { call, callId -> call.response.header(HttpHeaders.XRequestId, callId) }
MDC へのコール ID の設定
CallId を CallLogging と併用すると、コール ID を MDC コンテキストに配置し、各リクエストに対してコール ID を表示するようにロガーを設定することで、トラブルシューティングに役立ちます。これを行うには、CallLogging 設定ブロック内で callIdMdc 関数を呼び出し、MDC コンテキストに設定するキーを指定します。
install(CallLogging) {
callIdMdc("call-id")
}このキーを ロガー設定 に渡すことで、ログにコール ID を表示できます。例えば、logback.xml ファイルは次のようになります。
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %X{call-id} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>完全な例はこちらで確認できます: call-id
