Actuator Health Endpoint returns OUT_OF_SERVICE,当所有组都启动时
Actuator Health Endpoint returns OUT_OF_SERVICE, when all groups are UP
我正在尝试为部署到 k8s 的应用程序设置就绪探测,但在 actuator/health
端点下,与 actuator/health/readiness
端点相比,我得到不同的状态。
重要的是,只有当应用程序部署到 k8s 集群时才会观察到此行为。
所以 application.properties
文件中没有任何额外的配置,我得到:
➜ ~ curl localhost:8080/actuator/health
{"status":"OUT_OF_SERVICE","groups":["liveness","readiness"]}%
➜ ~ curl localhost:8080/actuator/health/liveness
{"status":"UP"}%
➜ ~ curl localhost:8080/actuator/health/readiness
{"status":"OUT_OF_SERVICE"}%
这似乎是正确的 - 如果就绪状态为 OUT_OF_SERVICE
,则健康端点 returns OUT_OF_SERVICE
也是如此,因为它包括 readiness
组。这至少是一致的。
另一方面,当我在 application.properties
文件的 readiness
组中指定应包含的内容时,它似乎报告了不一致的结果。在我的例子中,我在我的配置文件中添加了一个条目,即:management.endpoint.health.group.readiness.include=ping
这一次我发送了与之前相同的请求集:
➜ ~ curl localhost:8080/actuator/health
{"status":"OUT_OF_SERVICE","groups":["liveness","readiness"]}%
➜ ~ curl localhost:8080/actuator/health/liveness
{"status":"UP"}%
➜ ~ curl localhost:8080/actuator/health/readiness
{"status":"UP"}%
这是不一致的 - 当 liveness
和 readiness
端点 return 状态 UP
我希望在 health
中看到相同的状态端点。
我正在寻找我在这里错误配置的解释,以及它为什么会那样工作。
为了方便起见,我创建了一个小应用程序,您可以在其中验证集群上的此行为:
https://github.com/gebertdominik/actuator-bug
与 described in the documentation 一样,在调用应用程序和 command-line runner 之前,应用程序尚未准备好处理流量。您的 command-line 调用您的 EventConsumer
的运行程序从不 returns 因此该应用程序永远不会被视为准备好处理流量。
如果您将运行状况端点配置为始终显示详细信息,则更容易看到它的效果:
management.endpoint.health.show-details=always
健康端点现在显示聚合以产生整体健康状况的所有单个组件:
{
"components": {
"diskSpace": {
"details": {
"exists": true,
"free": 465064448000,
"threshold": 10485760,
"total": 1000240963584
},
"status": "UP"
},
"livenessState": {
"status": "UP"
},
"ping": {
"status": "UP"
},
"readinessState": {
"status": "OUT_OF_SERVICE"
}
},
"groups": [
"liveness",
"readiness"
],
"status": "OUT_OF_SERVICE"
}
由于 readinessState
组件的状态,返回 OUT_OF_SERVICE
。
在其默认配置中,readinessState
被 readiness
组使用,它也被 returns OUT_OF_SERVICE
使用。通过设置 management.endpoint.health.group.readiness.include=ping
,您创建了自己的自定义 readiness
组,该组仅包含 ping
组件。它现在 returns UP
,这与整体健康响应中 ping
组件的状态一致。作为 shown in the documentation,您应该在自定义 readinessGroup
:
时包含 readinessState
management.endpoint.health.group.readiness.include=readinessState,ping
我正在尝试为部署到 k8s 的应用程序设置就绪探测,但在 actuator/health
端点下,与 actuator/health/readiness
端点相比,我得到不同的状态。
重要的是,只有当应用程序部署到 k8s 集群时才会观察到此行为。
所以 application.properties
文件中没有任何额外的配置,我得到:
➜ ~ curl localhost:8080/actuator/health
{"status":"OUT_OF_SERVICE","groups":["liveness","readiness"]}%
➜ ~ curl localhost:8080/actuator/health/liveness
{"status":"UP"}%
➜ ~ curl localhost:8080/actuator/health/readiness
{"status":"OUT_OF_SERVICE"}%
这似乎是正确的 - 如果就绪状态为 OUT_OF_SERVICE
,则健康端点 returns OUT_OF_SERVICE
也是如此,因为它包括 readiness
组。这至少是一致的。
另一方面,当我在 application.properties
文件的 readiness
组中指定应包含的内容时,它似乎报告了不一致的结果。在我的例子中,我在我的配置文件中添加了一个条目,即:management.endpoint.health.group.readiness.include=ping
这一次我发送了与之前相同的请求集:
➜ ~ curl localhost:8080/actuator/health
{"status":"OUT_OF_SERVICE","groups":["liveness","readiness"]}%
➜ ~ curl localhost:8080/actuator/health/liveness
{"status":"UP"}%
➜ ~ curl localhost:8080/actuator/health/readiness
{"status":"UP"}%
这是不一致的 - 当 liveness
和 readiness
端点 return 状态 UP
我希望在 health
中看到相同的状态端点。
我正在寻找我在这里错误配置的解释,以及它为什么会那样工作。
为了方便起见,我创建了一个小应用程序,您可以在其中验证集群上的此行为: https://github.com/gebertdominik/actuator-bug
与 described in the documentation 一样,在调用应用程序和 command-line runner 之前,应用程序尚未准备好处理流量。您的 command-line 调用您的 EventConsumer
的运行程序从不 returns 因此该应用程序永远不会被视为准备好处理流量。
如果您将运行状况端点配置为始终显示详细信息,则更容易看到它的效果:
management.endpoint.health.show-details=always
健康端点现在显示聚合以产生整体健康状况的所有单个组件:
{
"components": {
"diskSpace": {
"details": {
"exists": true,
"free": 465064448000,
"threshold": 10485760,
"total": 1000240963584
},
"status": "UP"
},
"livenessState": {
"status": "UP"
},
"ping": {
"status": "UP"
},
"readinessState": {
"status": "OUT_OF_SERVICE"
}
},
"groups": [
"liveness",
"readiness"
],
"status": "OUT_OF_SERVICE"
}
由于 readinessState
组件的状态,返回 OUT_OF_SERVICE
。
在其默认配置中,readinessState
被 readiness
组使用,它也被 returns OUT_OF_SERVICE
使用。通过设置 management.endpoint.health.group.readiness.include=ping
,您创建了自己的自定义 readiness
组,该组仅包含 ping
组件。它现在 returns UP
,这与整体健康响应中 ping
组件的状态一致。作为 shown in the documentation,您应该在自定义 readinessGroup
:
readinessState
management.endpoint.health.group.readiness.include=readinessState,ping