春季执行器:自定义健康终点
#java #spring #springboot #monitoring

last post中,我谈到了配置和利用Spring Boot执行器配置您的启动应用程序以具有生产准备功能。

在这篇文章中,让我们自定义健康端点,这是重要的执行器端点之一,它有助于:

  • 监视应用程序健康:健康终点提供了一种简单而标准化的方法来监视应用程序的健康。它使您可以快速检查您的应用程序是否正确运行或遇到任何问题。监视应用程序的健康状况有助于您尽早确定和应对潜在问题,减少停机时间并确保更好的用户体验。
  • 主动的问题检测:通过定期轮询健康终点,监视工具和系统可以主动检测到应用程序健康中的任何降解或失败。这使您的运营团队能够立即采取行动,然后在问题上升级并影响用户。
  • 与编排工具集成:在现代生产环境中,应用程序通常由Kubernetes,Docker Swarm或Cloud Platform等工具进行管理和策划。
  • 操作见解:健康端点提供了有关应用程序内部内容的基本信息。您可以自定义端点以包括有关数据库连接,外部服务状态,资源可用性等的详细信息。这些详细信息对于在运行时对您的应用程序行为进行故障排除和了解很有价值。

春季执行器提供丰富的API支持以自定义健康端点响应。

让我们首先从配置中启用健康终点,并允许其显示详细信息:

management.endpoints.web.exposure.include=health
management.endpoint.health.show-details=always

默认情况下,它揭示了ping状态和磁盘详细信息:

{
    "status": "UP",
    "components": {
        "diskSpace": {
            ...
            ...
            ...
        },
        "ping": {
            "status": "UP"
        }
    }
}

我们可以通过将management.health.defaults.enabled属性设置为false

来禁用此默认响应

通过扩展保健剂来定制健康终点

实现健康指示剂界面使您可以创建自定义健康指标来监视应用程序的特定方面。

HealthIndicator(软件包:org.springframework.boot.actuate.health)接口是Spring Boot执行器模块的一部分,它提供了一个单个方法health(),该方法返回代表您自定义指示器健康状态的Health对象。它提供了几种静态方法来创建健康实例,以及添加有关健康检查的其他详细信息和上下文信息。

这是Health类的一些常用静态方法:

up():创建具有UP状态的健康实例,表明该应用程序处于健康状态。

down():创建具有DOWN状态的健康实例。

unknown():创建具有UNKNOWN状态的健康实例。

状态(状态状态):创建具有自定义状态的健康实例。状态枚举代表健康状况,可以是UP, DOWN, or UNKNOWN

删除(字符串键,对象值):将其他详细信息添加到健康实例中。这些详细信息提供了有关健康状况的更多信息,对于故障排除和监视可能很有用。

删除(地图详细信息):使用键值对的地图立即向健康实例添加了多个详细信息。

现在,让我们编写HealthIndicator接口(即ExternalServiceHealthIndicator.class)的实现。这是一个典型的例子,我正在基于从外部服务调用中收到的HTTP状态代码返回健康对象。

@Component
public class ExternalServiceHealthIndicator implements HealthIndicator {

    private final Random randomizer = new Random();
    private final List<Integer> statusCodes = List.of(200, 204, 401, 404, 503);

    @Override
    public Health health() {
        int randomStatusCode = statusCodes.get(randomizer.nextInt(statusCodes.size()));
        Health.Builder healthBuilder = new Health.Builder();
        return (switch(randomStatusCode) {
            case 200, 204 -> healthBuilder.up()
                    .withDetail("External_Service", "Service is Up and Running ✅")
                    .withDetail("url", "https://example.com");
            case 503 -> healthBuilder.down()
                    .withDetail("External_Service", "Service is Down 🔻")
                    .withDetail("alternative_url", "https://alt-example.com");
            default -> healthBuilder.unknown().withException(new RuntimeException("Received status: " + randomStatusCode));
        }).build();
    }
}

@ConditionAloneNabledHealthIndicator注释

@conditionAloneNabledHealthIndicator是org.springframework.boot.actuate.autoconfigure.health软件包中的元通知,可有条件地启用或禁用该特定指标提供的健康检查,并且需要indicatorName作为强制性字符串参数,可以使用外部化的应用程序配置启用。让我们看看一个正在行动的示例。

@Component
@ConditionalOnEnabledHealthIndicator("external_service_health")
public class ExternalServiceHealthIndicator implements HealthIndicator {

    @Override
    public Health health() {
        ...
    }
}

可以通过在应用程序的配置中设置management.health.<custom-indicator>.enabled属性true/fals,可以启用/禁用自定义指示器。如果属性不存在或设置为false,则将无法启用指示器。

management.health.external_service_health.enabled: true

最后一句话

健康端点是一个非常有用的端点,可以监视您的应用程序健康,获取操作见解,健康检查您的部署。请在评论中分享您的想法/意见。