关于springboot:聊聊springboot项目如何实现自定义actuator端点

前言

用过springboot的敌人,可能会晓得springboot有四大神器:主动拆卸、starter、cli、actuator。其中actuator可帮忙你在将应用程序推送到生产环境时监控和管理应用程序。你能够抉择应用 HTTP 端点或 JMX 来治理和监控你的应用程序。 审计、衰弱和指标收集也能够主动利用于你的应用程序。

actuator默认为咱们内置了以下端点

ID 形容 默认启用 默认公开
auditevents 公开以后应用程序的审计事件信息 Yes No
beans 显示应用程序中所有Spring bean的残缺列表 Yes No
conditions 显示在配置和主动配置类上评估的条件以及它们是否匹配的起因 Yes No
configprops 显示所有@ConfigurationProperties对照的列表 Yes No
env 从Spring的ConfigurableEnvironment中公开属性 Yes No
flyway 显示已利用的任何Flyway数据库迁徙 Yes No
health 显示应用程序衰弱信息 Yes Yes
httptrace 显示HTTP跟踪信息(默认状况下,最初100个HTTP申请-响应交互) Yes No
info 显示任意应用程序信息 Yes Yes
loggers 显示和批改应用程序中记录器的配置 Yes No
liquibase 显示已利用的任何Liquibase数据库迁徙 Yes No
metrics 显示以后应用程序的“指标”信息 Yes No
mappings 显示所有@RequestMapping门路对照的列表 Yes No
scheduledtasks 显示应用程序中调度的工作 Yes No
sessions 容许从Spring Session反对的会话存储中检索和删除用户会话 Yes No
shutdown 让应用程序优雅地敞开 No No
threaddump 执行线程转储 Yes No

如果你的应用程序是一个web应用程序(Spring MVC、Spring WebFlux或Jersey),你能够应用以下附加端点

ID 形容 默认启用 默认公开
heapdump 返回一个GZip压缩的hprof堆转储文件 Yes No
jolokia 在HTTP上公开JMX bean(当Jolokia在类门路上时,WebFlux不可用) Yes No
logfile 返回日志文件的内容,反对应用HTTP Range header来检索日志文件内容的一部分 Yes No
prometheus 公开指标,该格局能够被Prometheus服务器采集 Yes No

注: actuator 在springboot 1.X 和springboot 2.X 存在较大的差别,本文以springboot 2.X 作为本文的解说

通常状况下,actuator内置的端点就能够满足咱们的日常需要了,但有时候咱们须要自定义端点。上面就列举一下几种罕用的自定义端点

自定义端点

自定义前置条件,在pom.xml引入

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

1、自定义health

当内置的health端点信息不满足用来判断咱们我的项目是否衰弱时,咱们能够自定义health

通过实现org.springframework.boot.actuate.health.HealthIndicator接口,形如

@Component
public class CustomHealthIndicator implements HealthIndicator {

    @Override
    public Health health() {
        int errorCode = check();
        if (errorCode == 1) {
            return Health.down().withDetail("Error Code", errorCode).build();
        }
        return Health.up().build();
    }

    private int check() {
        // perform some specific health check
        return ThreadLocalRandom.current().nextInt(5);
    }

}

或者通过继承org.springframework.boot.actuate.health.AbstractHealthIndicator,形如

@Component("otherCustom")
public class CustomAbstractHealthIndicator extends AbstractHealthIndicator {
    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {

        int errorCode = check();
        if (errorCode == 1) {
            builder.down().down().withDetail("Error Code", errorCode).build();
            return;
        }
        builder.up().build();

    }

    private int check() {
        // perform some specific health check
        return ThreadLocalRandom.current().nextInt(5);
    }
}

举荐应用继承AbstractHealthIndicator 这种形式。在配置文件中作如下配置,能够查看具体的衰弱信息


management:
   endpoint:
      health:
        show-details: always

通过拜访http://ip:port/actuator/health进行查看,形如下


从图片咱们能够看出,咱们自定义的health端点信息,如果@Component不指定name,形如CustomHealthIndicator ,默认是取custom作为自定义端点对象

2、自定义info

咱们能够通过实现org.springframework.boot.actuate.info.InfoContributor接口,来裸露一些咱们想展现的信息。形如

@Component
public class CustomInfoContributor implements InfoContributor {

    @Override
    public void contribute(Info.Builder builder) {
        builder.withDetail("customInfo", Collections.singletonMap("hello", "world"));
    }

}

通过拜访http://ip:port/actuator/info进行查看,形如下

3、自定义endpoint

有时候咱们须要自定义本人的端点,咱们能够通过
@Endpoint注解 + @ReadOperation、@WriteOperation、@DeleteOperation注解来实现自定义端点。形如下

@Component
@Endpoint(id = "customEndpoint")
public class CustomEndpoint {

  // @ReadOperation 对应GET申请

  /**
   * 申请示例:
   * GET http://localhost:8080/actuator/customEndpoint/zhangsan/20
   * @param username
   * @param age
   *
   * @return
   */
  @ReadOperation
  public Map<String, Object> endpointByGet(@Selector String username,@Selector Integer age) {
    Map<String, Object> customMap = new HashMap<>();
    customMap.put("httpMethod", HttpMethod.GET.toString());
    customMap.put("username",username);
    customMap.put("age",age);
    return customMap;
  }


  // @WriteOperation 对应POST申请

  /**
   * 申请示例:
   * POST http://localhost:8080/actuator/customEndpoint
   *
   * 申请参数为json格局
   *
   * {
   *     "username": "zhangsan",
   *     "age": 20
   * }
   *
   * @param username 参数都为必填项
   * @param age 参数都为必填项
   * @return
   */
  @WriteOperation
  public Map<String, Object> endpointByPost(String username,Integer age) {
    Map<String, Object> customMap = new HashMap<>();
    customMap.put("httpMethod", HttpMethod.POST.toString());
    customMap.put("username",username);
    customMap.put("age",age);
    return customMap;
  }


  // @DeleteOperation 对应Delete申请

  /**
   * 申请示例:
   * DELETE http://localhost:8080/actuator/customEndpoint
   *
   * @return
   */
  @DeleteOperation
  public Map<String, Object> endpointByDelete() {
    Map<String, Object> customMap = new HashMap<>();
    customMap.put("httpMethod", HttpMethod.DELETE.toString());

    return customMap;
  }

代码片段外面有比拟具体的正文,这边就不在阐述。这边有个细节就是,咱们须要在yml作如下配置来裸露咱们自定义的端点

通过


management:
  endpoints:
    web:
      exposure:
        include: customEndpoint

或者


management:
  endpoints:
    web:
      exposure:
        include: "*"

总结

本文仅介绍几种绝对通用的自定义端点,更具体的端点介绍能够查看官网,链接如下

https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator

demo链接

https://github.com/lyb-geek/springboot-learning/tree/master/springboot-custom-actuator-endpoint

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理