Spring Boot 最主要的特性就是AutoConfig(自动配置),而对于我们这些使用者来说也就是各种starter,
Spring Boot-Actuator 也提供了starter,为我们自动配置,在使用上我们只需要添加starter到我们的依赖中,然后启动项目即可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
常用Endpoint
Spring Boot-actuator,提供了许多有用的EndPoint,对Spring Boot应用提供各种监控,下面说一下我常用的EndPoint:
/health 应用的健康状态
/configprops 获取应用的配置信息,因为Spring Boot 可能发布时是单独的Jar包,配置文件可能包含其中, 当我们需要检查配置文件时可以使用 ConfigpropsEndPoint 进行查看一些配置是否正确。
/trace 最近几次的http请求信息
HealthEndPoint
当我们访问 http://localhost:8088/health 时,可以看到 HealthEndPoint 给我们提供默认的监控结果,包含 磁盘检测和数据库检测。
{
"status": "UP",
"diskSpace": {
"status": "UP",
"total": 398458875904,
"free": 315106918400,
"threshold": 10485760
},
"db": {
"status": "UP",
"database": "MySQL",
"hello": 1
}
}
其实看 Spring Boot-actuator 源码,你会发现 HealthEndPoint 提供的信息不仅限于此,org.springframework.boot.actuate.health 包下 你会发现 ElasticsearchHealthIndicator、RedisHealthIndicator、RabbitHealthIndicator 等
也就是 HealthEndPoint 也提供 ES, Redis 等组件的健康信息。
自定义Indicator 扩展 HealthEndPoint
看源码 其实 磁盘和数据库健康信息就是 DiskSpaceHealthIndicator、DataSourceHealthIndicator 来实现的,当我们对一些我们自定义的组件进行监控时, 我们也可以实现个Indicator :
@Component
public class User implements HealthIndicator {
/**
* user监控 访问: http://localhost:8088/health
*
* @return 自定义Health监控
*/
@Override
public Health health() {
return new Health.Builder().withDetail("usercount", 10) //自定义监控内容
.withDetail("userstatus", "up").up().build();
}
}
这时我们再次访问: http://localhost:8088/health 这时返回的结果如下,包含了我们自定义的 User 健康信息。
{
"status": "UP",
"user": {
"status": "UP",
"usercount": 10,
"userstatus": "up"
},
"diskSpace": {
"status": "UP",
"total": 398458875904,
"free": 315097989120,
"threshold": 10485760
},
"db": {
"status": "UP",
"database": "MySQL",
"hello": 1
}
}
自定义EndPoint
其实除了扩展 HealthEndPoint 来添加一些健康检查, 我们也可以自定定义一些EndPoint 来提供程序运行时一些信息的展示:
@Configuration
public class EndPointAutoConfig {
@Bean
public Endpoint<Map<String, Object>> customEndPoint() {
return new SystemEndPoint();
}
}
@ConfigurationProperties(prefix="endpoints.customsystem")
public class SystemEndPoint extends AbstractEndpoint<Map<String, Object>> {
public SystemEndPoint(){
super("customsystem");
}
@Override
public Map<String, Object> invoke() {
Map<String,Object> result= new HashMap<>();
Map<String, String> map = System.getenv();
result.put("username",map.get("USERNAME"));
result.put("computername",map.get("COMPUTERNAME"));
result.put("userdomain",map.get("USERDOMAIN"));
return result;
}
}
访问 http://localhost:8088/customsystem 来查看我们自定义的EndPoint ,返回结果如下:
{
"username": "xxx",
"userdomain": "DESKTOP-6EAN1H4",
"computername": "DESKTOP-6EAN1H4"
}
我们在为Spring Boot应用添加actuator后,期望的health接口返回结果应该是类似下面的结果:
{
status: "UP",
diskSpace:
{
status: "UP",
total: 250182889472,
free: 31169568768,
threshold: 10485760
},
db:
{
status: "UP",
database: "H2",
hello: 1
}
}
如果只是返回了status
{
status: "UP"
}
则需要为应用新增配置,以yml配置文件为例,需要添加如下配置:
management:
security:
enabled: false
endpoints:
health:
sensitive: false
Spring boot 2.0之后不管用。参考:https://www.jianshu.com/p/1aadc4c85f51
management.endpoint.health.show-details=always
/heapdump
这个主要会dump目前堆的状况出来,可以用jvm的工具大家,并查看目前堆的状况,但是总的来说没人会这么干,会造成系统的短暂停止,大流量容易压垮系统
/health
这个路径主要是用来统计系统的状况,默认里面目前只有系统状况和磁盘状况
/info
/beans
可以查看到目前Spring里面加载的所有bean,在生产中感觉没有什么用处,可能在开发中会有一些帮助,方便查看bean是否被扫描
/env
里面包含了目前的环境变量,包括application.yaml
配置的属性,以及systemProperties都能够拿到
/dump
里面包含了目前线程的一个快照信息
/mappings
里面包含了Controller的所有mapping信息,开发中新手经常会遇到访问不到controller的情况,可以根据这个查看是否被扫描
/trace trace
目前主要是监控http请求的,监控每个请求的状况,如下所示:
[
{
"timestamp": 1479717912091,
"info": {
"method": "GET",
"path": "/",
"headers": {
"request": {
"Connection": "keep-alive",
"User-Agent": "GoogleSoftwareUpdateAgent/1.2.6.1370 CFNetwork/807.0.4 Darwin/16.0.0 (x86_64)",
"Host": "127.0.0.1:8080"
},
"response": {
"X-Application-Context": "application",
"Date": "Mon, 21 Nov 2016 08:45:12 GMT",
"Content-Type": "application/json;charset=UTF-8",
"status": "404"
}
}
}
},
{
"timestamp": 1479717910980,
"info": {
"method": "GET",
"path": "/",
"headers": {
"request": {
"Connection": "keep-alive",
"User-Agent": "GoogleSoftwareUpdate/1.2.6.1370 CFNetwork/807.0.4 Darwin/16.0.0 (x86_64)",
"Host": "127.0.0.1:8080"
},
"response": {
"X-Application-Context": "application",
"Date": "Mon, 21 Nov 2016 08:45:10 GMT",
"Content-Type": "application/json;charset=UTF-8",
"status": "404"
}
}
}
},
{
"timestamp": 1479717908924,
"info": {
"method": "GET",
"path": "/",
"headers": {
"request": {
"Connection": "keep-alive",
"User-Agent": "GoogleSoftwareUpdate/1.2.6.1370 CFNetwork/807.0.4 Darwin/16.0.0 (x86_64)",
"Host": "127.0.0.1:8080"
},
"response": {
"X-Application-Context": "application",
"Date": "Mon, 21 Nov 2016 08:45:08 GMT",
"Content-Type": "application/json;charset=UTF-8",
"status": "404"
}
}
}
},
{
"timestamp": 1479716651440,
"info": {
"method": "GET",
"path": "/trace",
"headers": {
"request": {
"Cache-Control": "max-age=0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Upgrade-Insecure-Requests": "1",
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36",
"Host": "localhost:8080",
"Accept-Encoding": "gzip, deflate, sdch, br",
"Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6"
},
"response": {
"X-Application-Context": "application",
"Date": "Mon, 21 Nov 2016 08:24:11 GMT",
"Content-Type": "application/json;charset=UTF-8",
"status": "200"
}
}
}
}
]
/autoconfig
显示当前SpringBoot,已经自动配置的的属性
/metrics
是整个监控里面的核心信息,
{
"mem": 323984,
"mem.free": 239989,
"processors": 4,
"instance.uptime": 1670490,
"uptime": 1691378,
"systemload.average": 4.22265625,
"heap.committed": 271872,
"heap.init": 131072,
"heap.used": 31882,
"heap": 1864192,
"nonheap.committed": 54056,
"nonheap.init": 2496,
"nonheap.used": 52113,
"nonheap": 0,
"threads.peak": 15,
"threads.daemon": 5,
"threads.totalStarted": 17,
"threads": 15,
"classes": 6662,
"classes.loaded": 6662,
"classes.unloaded": 0,
"gc.ps_scavenge.count": 10,
"gc.ps_scavenge.time": 153,
"gc.ps_marksweep.count": 2,
"gc.ps_marksweep.time": 150,
"gauge.response.trace": 19,
"gauge.response.autoconfig": 41,
"gauge.response.error": 6,
"gauge.response.configprops": 138,
"counter.status.200.configprops": 1,
"counter.status.404.error": 3,
"counter.status.200.autoconfig": 1,
"counter.status.200.trace": 2
}
目前来说包含了如下信息
The total system memory in KB (mem)
The amount of free memory in KB (mem.free)
The number of processors (processors)
The system uptime in milliseconds (uptime)
The application context uptime in milliseconds (instance.uptime)
The average system load (systemload.average)
Heap information in KB (heap, heap.committed, heap.init, heap.used)
Thread information (threads, thread.peak, thread.daemon)
Class load information (classes, classes.loaded, classes.unloaded)
Garbage collection information (gc.xxx.count, gc.xxx.time)