SpringBoot-指标监控
指标监控
1、SpringBoot Actuator
1、简介
未来每一个微服务在云上部署以后,我们都需要对其进行监控、追踪、审计、控制等。SpringBoot就抽取了Actuator场景,使得我们每个微服务快速引用即可获得生产级别的应用监控、审计等功能。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2、使用
- 引入场景
- 访问 http://localhost:8080/actuator
- 暴露所有监控信息为HTTP
management:endpoints:enabled-by-default: true #暴露所有端点信息web:exposure:include: '*' #以web方式暴露
- 测试
http://localhost:8080/actuator/beans
查看某个属性的监控信息:http://localhost:8080/actuator/属性名/具体路径
2、Actuator Endpoint
1、最常使用的端点
ID | 描述 |
---|---|
auditevents | 暴露当前应用程序的审核事件信息。需要一个AuditEventRepository组件 。 |
bean | 显示应用程序中所有Spring Bean的完整列表。 |
caches | 暴露可用的缓存。 |
conditions | 显示自动配置的所有条件信息,包括匹配或不匹配的原因。 |
configprops | 显示所有@ConfigurationProperties 。 |
env | 暴露Spring的属性ConfigurableEnvironment |
flyway | 显示已应用的所有Flyway数据库迁移。 需要一个或多个Flyway 组件。 |
health | 显示应用程序运行状况信息。 |
httptrace | 显示HTTP跟踪信息(默认情况下,最近100个HTTP请求-响应)。需要一个HttpTraceRepository 组件。 |
info | 显示应用程序信息。 |
integrationgraph | 显示Spring integrationgraph 。需要依赖spring-integration-core 。 |
loggers | 显示和修改应用程序中日志的配置。 |
liquibase | 显示已应用的所有Liquibase数据库迁移。需要一个或多个Liquibase 组件。 |
metrics | 显示当前应用程序的“指标”信息。 |
mappings | 显示所有@RequestMapping 路径列表。 |
scheduledtasks | 显示应用程序中的计划任务。 |
sessions | 允许从Spring Session支持的会话存储中检索和删除用户会话。需要使用Spring Session的基于Servlet的Web应用程序。 |
shutdown | 使应用程序正常关闭。默认禁用。 |
startup | 显示由ApplicationStartup 收集的启动步骤数据。需要使用SpringApplication进行配置BufferingApplicationStartup 。 |
threaddump | 执行线程转储。 |
如果您的应用程序是Web应用程序(Spring MVC,Spring WebFlux或Jersey),则可以使用以下附加端点:
ID | 描述 |
---|---|
heapdump | 返回hprof 堆转储文件。 |
jolokia | 通过HTTP暴露JMX bean(需要引入Jolokia,不适用于WebFlux)。需要引入依赖jolokia-core 。 |
logfile | 返回日志文件的内容(如果已设置logging.file.name 或logging.file.path属性)。支持使用HTTPRange 标头来检索部分日志文件的内容。 |
prometheus | 以Prometheus服务器可以抓取的格式公开指标。需要依赖micrometer-registry-prometheus 。 |
最常用的Endpoint
- Health:监控状况
- Metrics:运行时指标
- Loggers:日志记录,方便我们追踪错误
2、Health Endpoint
健康检查端点,我们一般用于在云平台,平台会定时的检查应用的健康状况,我们就需要Health Endpoint可以为平台返回当前应用的一系列组件健康状况的集合。
重要的几点:
- health endpoint返回的结果,应该是一系列健康检查后的一个汇总报告
- 很多的健康检查默认已经自动配置好了,比如:数据库、redis等
- 可以很容易的添加自定义的健康检查机制
- 如果觉得显示的状态信息过于简单,可以在配置文件中对health endpoint进行配置
查看当前应用的健康状况: localhost:8080/actuator/health
#management.endpoints -> 配置所有的endpoint
#management.endpoint.xxx -> 配置指定的endpoint端点management:endpoints: enabled-by-default: true #默认开启所有的监控端点web:exposure:include: '*' #以web方式暴露端点endpoint: health:show-details: always #总是显示详细信息
配置完成后,再次查看应用健康状况:
3、Metrics Endpoint
提供详细的、层级的、空间指标信息,这些信息可以被pull(主动推送)或者push(被动获取)方式得到;
- 通过Metrics对接多种监控系统
- 简化核心Metrics开发
- 添加自定义Metrics或者扩展已有Metrics
management:endpoints:enabled-by-default: true #默认开启所有的监控端点web:exposure:include: '*' #以web方式暴露端点endpoint:health:show-details: always #总是显示详细信息enable: truebeans:enabled: trueinfo:enable: truemetrics:enable: true
访问:localhost:8080/actuator/metrics
3、管理Endpoints
1、开启与禁用Endpoints
- 默认所有的Endpoint除过shutdown都是开启的。
- 需要开启或者禁用某个Endpoint。配置模式为 management.endpoint.${endpointName}.enabled = true
endpoint:health:show-details: always #总是显示详细信息enable: truebeans:enabled: trueinfo:enable: truemetrics:enable: true
- 或者禁用所有的Endpoint然后手动开启指定的Endpoint
management:endpoints:enabled-by-default: false #默认关闭所有的监控端点web:exposure:include: '*' #以web方式暴露端点endpoint:health:show-details: always #总是显示详细信息enable: truebeans:enabled: trueinfo:enable: truemetrics:enable: true
2、暴露Endpoints
支持的暴露方式
- HTTP:默认只暴露health和info Endpoint
- JMX:默认暴露所有Endpoint
- 除过health和info,剩下的Endpoint都应该进行保护访问。如果引入SpringSecurity,则会默认配置安全访问规则
ID | JMX | Web |
---|---|---|
auditevents | Yes | No |
beans | Yes | No |
caches | Yes | No |
conditions | Yes | No |
configprops | Yes | No |
env | Yes | No |
flyway | Yes | No |
health | Yes | Yes |
heapdump | N/A | No |
httptrace | Yes | No |
info | Yes | Yes |
integrationgraph | Yes | No |
jolokia | N/A | No |
logfile | N/A | No |
loggers | Yes | No |
liquibase | Yes | No |
metrics | Yes | No |
mappings | Yes | No |
prometheus | N/A | No |
scheduledtasks | Yes | No |
sessions | Yes | No |
shutdown | Yes | No |
startup | Yes | No |
threaddump | Yes | No |
4、定制 Endpoint
1、定制 Health 信息
@Component
public class MyHealthIndicator extends AbstractHealthIndicator {@Overrideprotected void doHealthCheck(Health.Builder builder) throws Exception {Map<String,Object> msg = new HashMap<>();if(1 == 1){ //通过判断来设置应用进程的健康状态
// builder.up();msg.put("msg","该应用进程无错误");builder.status(Status.UP);}else{msg.put("msg","应用进程出错");builder.status(Status.DOWN);}builder.withDetail("code",100).withDetails(msg);}
}
访问:localhost:8080/actuator/health
@Component
public class MyHealthIndicator extends AbstractHealthIndicator {@Overrideprotected void doHealthCheck(Health.Builder builder) throws Exception {Map<String,Object> msg = new HashMap<>();if(1 == 2){ //通过判断来设置应用进程的健康状态
// builder.up();msg.put("msg","该应用进程无错误");builder.status(Status.UP);}else{msg.put("msg","应用进程出错");builder.status(Status.DOWN);}builder.withDetail("code",100).withDetails(msg);}
}
2、定制info信息
常用两种方式
1、编写配置文件
management:endpoints:enabled-by-default: true #默认开启所有的监控端点web:exposure:include: '*' #以web方式暴露端点endpoint:health:show-details: always #总是显示详细信息enable: truebeans:enabled: trueinfo:enable: truemetrics:enable: trueinfo:appName: testInfo #直接将信息写死currentTime: 19:37mavenProjectName: @project.name@ #通过@@获取动态pom文件中的信息mavenProjectVersion: @project.version@
2、编写InfoContributor
@Component
public class MyInfoContributor implements InfoContributor {@Overridepublic void contribute(Info.Builder builder) {builder.withDetail("AppName","SpringBoot-03").withDetail("example",Collections.singletonMap("Time","19:36"));}
}
访问:localhost:8080/actuator/info
3、定制Metrics信息
1、SpringBoot支持自动适配的Metrics
-
JVM的指标监控
-
- 各种内存和缓冲池
- 垃圾回收相关统计
- 线程利用率
- 加载/卸载的类数
-
CPU指标
-
磁盘空间指标
-
第三方指标
-
日志指标
-
Tomcat指标
-
…
2、增加定制Metrics
@Service
public class TeacherServiceImpl implements TeacherService {@AutowiredTeacherMapper teacherMapper;Counter counter;public TeacherServiceImpl(MeterRegistry meterRegistry){counter = meterRegistry.counter("TeacherService.addTeacher.count");}public Teacher getTeacherById(Integer id){return teacherMapper.getTeacher(id);}public int addTeacher(Teacher teacher){counter.increment();return teacherMapper.addTeacher(teacher);}
}
4、定制Endpoint
@Component
@Endpoint(id = "myService")
public class MyEndPoint {@ReadOperationpublic Map getDockerInfo(){return Collections.singletonMap("docker","docker start...");}@WriteOperationpublic void stopDocker(){System.out.println("Docker stopped");}
}
使用JMX进行测试:
控制台输出: