Skip to content

アプリケーション監視

コード例: events

Ktorは、イベントを使用することでサーバーアプリケーションを監視する機能を提供します。 アプリケーションのライフサイクル(アプリケーションの開始、停止など)に関連する事前定義されたイベントを処理したり、特定のケースを処理するためにカスタムイベントを使用したりできます。また、MonitoringEventフックを使用して、カスタムプラグインのイベントを処理することもできます。

イベント定義

各イベントは、EventDefinitionクラスのインスタンスによって表現されます。 このクラスには、イベントに渡される値の型を指定するT型パラメータがあります。この値は、ラムダ引数としてイベントハンドラー内でアクセスできます。たとえば、ほとんどの事前定義されたイベントApplicationをパラメータとして受け入れるため、イベントハンドラー内でアプリケーションのプロパティにアクセスできます。

カスタムイベントの場合、このイベントに必要な型パラメータを渡すことができます。 以下のコードスニペットは、ApplicationCallインスタンスを受け入れるカスタムNotFoundEventを作成する方法を示しています。

kotlin
val NotFoundEvent: EventDefinition<ApplicationCall> = EventDefinition()

カスタムイベントセクションでは、サーバーがリソースに対して404 Not Foundステータスコードを返したときに、カスタムプラグインでこのイベントを発生させる方法を示しています。

事前定義されたアプリケーションイベント

Ktorは、アプリケーションのライフサイクルに関連する以下の事前定義されたイベントを提供します。

たとえば、ApplicationStoppedイベントを購読して、アプリケーションリソースを解放できます。

アプリケーションでイベントを処理する

指定されたApplicationインスタンスのイベントを処理するには、monitorプロパティを使用します。 このプロパティは、アプリケーションイベントを処理できる以下の関数を公開するEventsインスタンスへのアクセスを提供します。

  • subscribe: EventDefinitionで指定されたイベントを購読します。
  • unsubscribe: EventDefinitionで指定されたイベントの購読を解除します。
  • raise: 指定された値でEventDefinitionで指定されたイベントを発生させます。

    カスタムイベントセクションでは、カスタムイベントを発生させる方法を示します。

subscribe / unsubscribe関数は、T値を持つEventDefinitionインスタンスをラムダ引数として受け入れます。 以下の例は、ApplicationStartedイベントを購読し、イベントハンドラーでメッセージをログする方法を示しています。

kotlin
fun Application.module() {
    monitor.subscribe(ApplicationStarted) { application ->
        application.environment.log.info("Server is started")
    }
}

この例では、ApplicationStoppedイベントを処理する方法を確認できます。

kotlin
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イベントを処理する方法を示しています。

kotlin
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ステータスコードを返したときに発生するカスタムイベントを作成する方法を見ていきます。

  1. まず、イベント定義を作成する必要があります。 以下のコードスニペットは、ApplicationCallをパラメータとして受け入れるカスタムNotFoundEventイベントを作成する方法を示しています。

    kotlin
    val NotFoundEvent: EventDefinition<ApplicationCall> = EventDefinition()
  2. イベントを発生させるには、Events.raise関数を呼び出します。以下のサンプルは、ResponseSent フックを処理して、呼び出しのステータスコードが404の場合に新しく作成されたイベントを発生させる方法を示しています。

    kotlin
    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(ResponseSent) { call ->
            if (call.response.status() == HttpStatusCode.NotFound) {
                this@createApplicationPlugin.application.monitor.raise(NotFoundEvent, call)
            }
        }
    }
  3. アプリケーションで作成されたイベントを処理するには、プラグインをインストールします。

    kotlin
    fun Application.module() {
        install(ApplicationMonitoringPlugin)
    }
  4. 次に、Events.subscribeを使用してイベントを購読します。

    kotlin
    fun Application.module() {
        install(ApplicationMonitoringPlugin)
        monitor.subscribe(NotFoundEvent) { call ->
            log.info("No page was found for the URI: ${call.request.uri}")
        }
    }

完全な例については、eventsを参照してください。