前言

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

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

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

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

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

注: 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接口,形如

@Componentpublic 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接口,来裸露一些咱们想展现的信息。形如

@Componentpublic 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