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"}%

这是不一致的 - 当 livenessreadiness 端点 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

在其默认配置中,readinessStatereadiness 组使用,它也被 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