Ktorサーバーでのリクエストトレース
必要な依存関係: io.ktor:ktor-server-call-id
コード例: call-id
CallIdプラグインを使用すると、一意のリクエストIDまたはコールIDを使用して、クライアントリクエストをエンドツーエンドでトレースできます。通常、KtorでコールIDを扱う方法は次のようになります。
- まず、特定の要求のコールIDを以下のいずれかの方法で取得する必要があります。
- 次に、Ktorは取得または生成されたコールIDを、事前定義された辞書を使用して検証します。コールIDを検証するための独自の条件を提供することもできます。
- 最後に、特定のヘッダー(例:
X-Request-Id
)でコールIDをクライアントに送信できます。
CallId
をCallLoggingと組み合わせて使用すると、コールIDをMDCコンテキストに配置し、各リクエストのコールIDを表示するようにロガーを構成することで、コールのトラブルシューティングに役立ちます。
クライアント側では、KtorはクライアントリクエストをトレースするためのCallIdプラグインを提供します。
依存関係の追加
CallId
を使用するには、ビルドスクリプトにktor-server-call-id
アーティファクトを含める必要があります。
CallIdのインストール
アプリケーションにCallId
プラグインをインストールするには、指定された
install
関数に渡します。以下のコードスニペットは、CallId
をインストールする方法を示しています... - ...
embeddedServer
関数呼び出し内で。 - ...
Application
クラスの拡張関数である、明示的に定義されたmodule
内で。
CallIdの構成
コールIDの取得
CallId
は、コールIDを取得するためのいくつかの方法を提供します。
- 指定されたヘッダーからコールIDを取得するには、
retrieveFromHeader
関数を使用します。例:
install(CallId) {
retrieveFromHeader(HttpHeaders.XRequestId)
}
header
関数を使用して、同じヘッダーでコールIDを取得および送信することもできます。
- 必要に応じて、
ApplicationCall
からコールIDを取得できます。
install(CallId) {
retrieve { call ->
call.request.header(HttpHeaders.XRequestId)
}
}
取得されたすべてのコールIDは、デフォルトの辞書を使用して検証されることに注意してください。
コールIDの生成
受信リクエストにコールIDが含まれていない場合は、generate
関数を使用して生成できます。
- 以下の例は、事前定義された辞書から特定の長さのコールIDを生成する方法を示しています。
install(CallId) {
generate(10, "abcde12345")
}
- 以下の例では、
generate
関数はコールIDを生成するためのブロックを受け入れます。
install(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をクライアントに送信する
header
関数は、コールIDを取得し、同じヘッダーで送信するために使用できます。
install(CallId) {
header(HttpHeaders.XRequestId)
}
完全な例はこちらにあります: call-id。
replyToHeader
関数は、指定されたヘッダーにコールIDを送信します。
install(CallId) {
replyToHeader(HttpHeaders.XRequestId)
}
- 必要に応じて、
ApplicationCall
を使用して、レスポンスでコールIDを送信できます。
reply { 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。