前言
用过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接口,形如
@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