アプリケーション監視
コード例: events
Ktorは、イベントを使用することでサーバーアプリケーションを監視する機能を提供します。 アプリケーションのライフサイクル(アプリケーションの開始、停止など)に関連する事前定義されたイベントを処理したり、特定のケースを処理するためにカスタムイベントを使用したりできます。また、MonitoringEventフックを使用して、カスタムプラグインのイベントを処理することもできます。
イベント定義
各イベントは、EventDefinitionクラスのインスタンスによって表現されます。 このクラスには、イベントに渡される値の型を指定するT
型パラメータがあります。この値は、ラムダ引数としてイベントハンドラー内でアクセスできます。たとえば、ほとんどの事前定義されたイベントはApplication
をパラメータとして受け入れるため、イベントハンドラー内でアプリケーションのプロパティにアクセスできます。
カスタムイベントの場合、このイベントに必要な型パラメータを渡すことができます。 以下のコードスニペットは、ApplicationCall
インスタンスを受け入れるカスタムNotFoundEvent
を作成する方法を示しています。
val NotFoundEvent: EventDefinition<ApplicationCall> = EventDefinition()
カスタムイベントセクションでは、サーバーがリソースに対して404 Not Found
ステータスコードを返したときに、カスタムプラグインでこのイベントを発生させる方法を示しています。
事前定義されたアプリケーションイベント
Ktorは、アプリケーションのライフサイクルに関連する以下の事前定義されたイベントを提供します。
- ApplicationStarting
- ApplicationStarted
- ServerReady
- ApplicationStopPreparing
- ApplicationStopping
- ApplicationStopped
たとえば、ApplicationStopped
イベントを購読して、アプリケーションリソースを解放できます。
アプリケーションでイベントを処理する
指定されたApplication
インスタンスのイベントを処理するには、monitor
プロパティを使用します。 このプロパティは、アプリケーションイベントを処理できる以下の関数を公開するEventsインスタンスへのアクセスを提供します。
subscribe
: EventDefinitionで指定されたイベントを購読します。unsubscribe
: EventDefinitionで指定されたイベントの購読を解除します。raise
: 指定された値でEventDefinitionで指定されたイベントを発生させます。カスタムイベントセクションでは、カスタムイベントを発生させる方法を示します。
subscribe
/ unsubscribe
関数は、T
値を持つEventDefinition
インスタンスをラムダ引数として受け入れます。 以下の例は、ApplicationStarted
イベントを購読し、イベントハンドラーでメッセージをログする方法を示しています。
fun Application.module() {
monitor.subscribe(ApplicationStarted) { application ->
application.environment.log.info("Server is started")
}
}
この例では、ApplicationStopped
イベントを処理する方法を確認できます。
fun Application.module() {
monitor.subscribe(ApplicationStopped) { application ->
application.environment.log.info("Server is stopped")
// Release resources and unsubscribe from events
monitor.unsubscribe(ApplicationStarted) {}
monitor.unsubscribe(ApplicationStopped) {}
}
}
完全な例については、eventsを参照してください。
カスタムプラグインでイベントを処理する
MonitoringEvent
フックを使用して、カスタムプラグインでイベントを処理できます。 以下の例は、ApplicationMonitoringPlugin
プラグインを作成し、ApplicationStarted
およびApplicationStopped
イベントを処理する方法を示しています。
import io.ktor.events.EventDefinition
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.application.hooks.*
val ApplicationMonitoringPlugin = createApplicationPlugin(name = "ApplicationMonitoringPlugin") {
on(MonitoringEvent(ApplicationStarted)) { application ->
application.log.info("Server is started")
}
on(MonitoringEvent(ApplicationStopped)) { application ->
application.log.info("Server is stopped")
// Release resources and unsubscribe from events
application.monitor.unsubscribe(ApplicationStarted) {}
application.monitor.unsubscribe(ApplicationStopped) {}
}
}
完全な例はこちらから確認できます: events。
カスタムイベント
このセクションでは、サーバーがリソースに対して404 Not Found
ステータスコードを返したときに発生するカスタムイベントを作成する方法を見ていきます。
まず、イベント定義を作成する必要があります。 以下のコードスニペットは、
ApplicationCall
をパラメータとして受け入れるカスタムNotFoundEvent
イベントを作成する方法を示しています。kotlinval NotFoundEvent: EventDefinition<ApplicationCall> = EventDefinition()
イベントを発生させるには、
Events.raise
関数を呼び出します。以下のサンプルは、ResponseSent
フックを処理して、呼び出しのステータスコードが404
の場合に新しく作成されたイベントを発生させる方法を示しています。kotlinimport io.ktor.events.EventDefinition import io.ktor.http.* import io.ktor.server.application.* import io.ktor.server.application.hooks.* val ApplicationMonitoringPlugin = createApplicationPlugin(name = "ApplicationMonitoringPlugin") { on(ResponseSent) { call -> if (call.response.status() == HttpStatusCode.NotFound) { this@createApplicationPlugin.application.monitor.raise(NotFoundEvent, call) } } }
アプリケーションで作成されたイベントを処理するには、プラグインをインストールします。
kotlinfun Application.module() { install(ApplicationMonitoringPlugin) }
次に、
Events.subscribe
を使用してイベントを購読します。kotlinfun Application.module() { install(ApplicationMonitoringPlugin) monitor.subscribe(NotFoundEvent) { call -> log.info("No page was found for the URI: ${call.request.uri}") } }
完全な例については、eventsを参照してください。