Kubernetes 需要知道應用的健康狀況,Quarkus 也內建了 Extension 可以容易的提供探針(Probe) 予 Kubernetes 作健康檢查。關於 Application 的健康,主要分成以下兩種探針
告訴 K8S 說你的 Quarkus 應用在已服務的狀況下是否活著,如果是 down 的話,Platform 可以作一些自動回復的動作。例如重啟 pod, 新增更多的pod 等等。
告訴 platform 說你的應用已經暖機完成,可以開始接受服務,例如可能開始後要先作一些資料庫連接才能開始接受 request。
用 quarkus 指令新增
quarkus ext add quarkus-smallrye-health
或是手動新增 pom dependency
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-health</artifactId>
</dependency>
可以看到因為有接 mongodb ,所以也會自動加入 mongodb 的連接狀況
curl localhost:8080/q/health
{
"status": "UP",
"checks": [
{
"name": "MongoDB connection health check",
"status": "UP"
}
]
}
新增以下檔案src/kotlin/tw.brandy.ironman.health.CustomLiveness.kt
import org.eclipse.microprofile.health.HealthCheck
import org.eclipse.microprofile.health.HealthCheckResponse
import org.eclipse.microprofile.health.Liveness
@Liveness
class CustomLiveness : HealthCheck {
override fun call(): HealthCheckResponse =
HealthCheckResponse.up("I'm alive")
}
Quarkus 裡面的很多 Extensions 都會提供預設的健康檢查,而且會自動注冊到 health probes 裡,像是管理 datasource 的 agroal, 就會把每個 datasource 都注冊。
但是是在 API first 的世界,我們有更多東西要 check 像是外部的 RESTful 服務。 例如如果我們的服務依賴了 https://www.fruityvice.com ,可能就需要新增這個外部服務的檢查
新增以下檔案與設定
src/kotlin/tw.brandy.ironman.health.CutsomReadiness.kt
@ApplicationScoped
class CutsomReadiness {
@ConfigProperty(
name = "tw.brandy.ironman.FruityViceService/mp-rest/url",
defaultValue = "https://www.fruityvice.com"
)
lateinit var externalUrl: String
@Readiness
fun checkUrl() = UrlHealthCheck("$externalUrl/api/fruit/banana")
.name("ExternalURL health check").requestMethod(HttpMethod.GET).statusCode(200)
}
curl localhost:8080/health
{
"status": "UP",
"checks": [
{
"name": "I'm alive",
"status": "UP"
},
{
"name": "MongoDB connection health check",
"status": "UP"
},
{
"name": "ExternalURL health check",
"status": "UP",
"data": {
"host": "GET https://www.fruityvice.com/api/fruit/banana"
}
}
]
}
在 dev mode 也可以有 UI: http://localhost:8080/q/health-ui/
(其實就只是跟 JSON 長一樣)