diff --git a/management/src/main/scala/org/apache/pekko/management/HealthCheckRoutes.scala b/management/src/main/scala/org/apache/pekko/management/HealthCheckRoutes.scala index 61ec3a70..8e090964 100644 --- a/management/src/main/scala/org/apache/pekko/management/HealthCheckRoutes.scala +++ b/management/src/main/scala/org/apache/pekko/management/HealthCheckRoutes.scala @@ -14,7 +14,7 @@ package org.apache.pekko.management import org.apache.pekko -import pekko.actor.ExtendedActorSystem +import pekko.actor.{ ActorSystem, ClassicActorSystemProvider, ExtendedActorSystem, ExtensionId, ExtensionIdProvider } import pekko.annotation.InternalApi import pekko.http.scaladsl.model._ import pekko.http.scaladsl.server.Directives._ @@ -47,7 +47,12 @@ private[pekko] class HealthCheckRoutes(system: ExtendedActorSystem) extends Mana StatusCodes.InternalServerError -> s"Health Check Failed: ${t.getMessage}") } - override def routes(mrps: ManagementRouteProviderSettings): Route = { + override def routes(mrps: ManagementRouteProviderSettings): Route = routes() + + /** + * @since 1.1.0 + */ + def routes(): Route = { concat( path(PathMatchers.separateOnSlashes(settings.startupPath)) { get { @@ -66,3 +71,17 @@ private[pekko] class HealthCheckRoutes(system: ExtendedActorSystem) extends Mana }) } } + +/** + * Providing an extension, so users can get the routes and add it to their own server + * @since 1.1.0 + */ +object HealthCheckRoutes extends ExtensionId[HealthCheckRoutes] with ExtensionIdProvider { + override def get(system: ActorSystem): HealthCheckRoutes = super.get(system) + + override def get(system: ClassicActorSystemProvider): HealthCheckRoutes = super.get(system) + + override def lookup: HealthCheckRoutes.type = HealthCheckRoutes + + override def createExtension(system: ExtendedActorSystem): HealthCheckRoutes = new HealthCheckRoutes(system) +} diff --git a/management/src/test/scala/org/apache/pekko/management/HealthCheckRoutesSpec.scala b/management/src/test/scala/org/apache/pekko/management/HealthCheckRoutesSpec.scala index de08ce17..747feed9 100644 --- a/management/src/test/scala/org/apache/pekko/management/HealthCheckRoutesSpec.scala +++ b/management/src/test/scala/org/apache/pekko/management/HealthCheckRoutesSpec.scala @@ -28,7 +28,7 @@ class HealthCheckRoutesSpec extends AnyWordSpec with Matchers with ScalatestRout private val eas = system.asInstanceOf[ExtendedActorSystem] - private def testRoute( + private def testRouteWithProviderSettings( startupResultValue: Future[Either[String, Unit]] = Future.successful(Right(())), readyResultValue: Future[Either[String, Unit]] = Future.successful(Right(())), aliveResultValue: Future[Either[String, Unit]] = Future.successful(Right(()))): Route = { @@ -44,12 +44,33 @@ class HealthCheckRoutesSpec extends AnyWordSpec with Matchers with ScalatestRout }.routes(ManagementRouteProviderSettings(Uri("http://whocares"), readOnly = false)) } + private def testRoute( + startupResultValue: Future[Either[String, Unit]] = Future.successful(Right(())), + readyResultValue: Future[Either[String, Unit]] = Future.successful(Right(())), + aliveResultValue: Future[Either[String, Unit]] = Future.successful(Right(()))): Route = { + new HealthCheckRoutes(eas) { + override protected val healthChecks: HealthChecks = new HealthChecks { + override def startupResult(): Future[Either[String, Unit]] = startupResultValue + override def startup(): Future[Boolean] = startupResultValue.map(_.isRight) + override def readyResult(): Future[Either[String, Unit]] = readyResultValue + override def ready(): Future[Boolean] = readyResultValue.map(_.isRight) + override def aliveResult(): Future[Either[String, Unit]] = aliveResultValue + override def alive(): Future[Boolean] = aliveResultValue.map(_.isRight) + } + }.routes() + } + tests("/startup", result => testRoute(startupResultValue = result)) tests("/ready", result => testRoute(readyResultValue = result)) tests("/alive", result => testRoute(aliveResultValue = result)) - def tests(endpoint: String, route: Future[Either[String, Unit]] => Route) = { - s"Health check $endpoint endpoint" should { + // testRoutes with provider settings + tests("/startup", result => testRouteWithProviderSettings(startupResultValue = result), withSettings = true) + tests("/ready", result => testRouteWithProviderSettings(readyResultValue = result), withSettings = true) + tests("/alive", result => testRouteWithProviderSettings(aliveResultValue = result), withSettings = true) + + def tests(endpoint: String, route: Future[Either[String, Unit]] => Route, withSettings: Boolean = false) = { + s"Health check $endpoint endpoint - withSettingsProvided: $withSettings" should { "return 200 for Right" in { Get(endpoint) ~> route(Future.successful(Right(()))) ~> check { status shouldEqual StatusCodes.OK