问题描述
本文放在草稿箱好久了,本来想结合日志完善该文章的,后来日志研究失败了,本文也就算是一篇独立于日志的文章了。
项目上线,并不意味着我们的工作结束了。
我们往往会对已上线的应用进行监控,监控系统在实际使用时有何问题?以实施改进。
最近不是很忙,想学习一下应用监控,以期上线更加完善的系统。
实现
应用监控
在这方面毫无经验,第一时间想到的自然是学习前辈们的经验。打开《Java EE 开发的颠覆者:Spring Boot实战》。
本书中也是讲解了部分有关应用监控的知识。使用SpringBoot
中提供的Actuator
即可实现应用监控。
官方文档:Part V. Spring Boot Actuator: Production-ready features
添加依赖
新建一个SpringBoot
项目,添加web
与actuator
依赖,actuator
就是SpringBoot
提供的应用监控模块。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
在引入了相应的监控模块之后,启动项目,控制台中会打印映射的日志。
但是前台访问时,却报了401
错误。
同时控制台中打印信息:
Full authentication is required to access actuator endpoints. Consider adding Spring Security or set 'management.security.enabled' to false.
访问actuator
需要完整的认证,请考虑加入Spring Security
或将management.security.enabled
设置为false
。
因为这里只是测试项目,直接关闭安全验证就行了。如果是上线的商业项目,还是加入Spring Security
进行用户认证,避免系统被黑客所攻击或泄露数据。
访问
重启项目,访问/mapping
,可以看到本项目中不同url
、不同方法所对应的相关Bean
中的相关方法。
{[/error]}: {
bean: "requestMappingHandlerMapping",
method: "public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)"
},
{[/error], produces=[text/html]}: {
bean: "requestMappingHandlerMapping",
method: "public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)"
},
{[/autoconfig || /autoconfig.json], methods = [GET], produces = [application / vnd.spring - boot.actuator.v1 + json || application / json]}: {
bean: "endpointHandlerMapping",
method: "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()"
},
{[/dump || /dump.json], methods = [GET], produces = [application / vnd.spring - boot.actuator.v1 + json || application / json]}: {
bean: "endpointHandlerMapping",
method: "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()"
}
各路由作用
Part V. Spring Boot Actuator: Production-ready features
断点名 | 描述 |
---|---|
autoconfig | 所有自动配置 |
beans | 所有Bean信息 |
configprops | 所有的配置属性 |
dump | 显示当前线程状态信息 |
env | 显示当前环境信息 |
health | 显示应用健康状况 |
info | 显示当前应用信息 |
metrics | 显示当前应用的各项指标信息 |
mappings | 显示所有的映射路径 |
shutdown | 关闭当前应用(默认关闭) |
trace | 显示追踪信息(默认最新的HTTP请求) |
尝试了几个可能用到的接口。
dump
好几十个线程,DestroyJavaVM
、http-nio-8080-AsyncTimeout
、http-nio-8080-Acceptor
、NioBlockingSelector.BlockPoller
,虽然都不太明白什么意思,但知道了原来一个SpringBoot
应用有这么多的线程。
health
有两个状态UP
(正常)和DOWN
(故障)。
我想可以写一个脚本去监听这个Json
数据,当系统DOWN
掉了可以给我们推送消息。
{
status: "UP",
diskSpace:
{
status: "UP",
total: 1121118199808,
free: 854676496384,
threshold: 10485760
}
}
metrics
显示当前应用的各项指标信息,看看下面的返回数据格式,感觉这个还是有点用的。
共启动了54
个线程,加载了6278
个类,
{
mem: 280282,
mem.free: 204920,
processors: 4,
instance.uptime: 2874558,
uptime: 2879508,
systemload.average: 1.77587890625,
heap.committed: 236544,
heap.init: 131072,
heap.used: 31623,
heap: 1864192,
nonheap.committed: 44992,
nonheap.init: 2496,
nonheap.used: 43739,
nonheap: 0,
threads.peak: 37,
threads.daemon: 25,
threads.totalStarted: 54,
threads: 27,
classes: 6278,
classes.loaded: 6278,
classes.unloaded: 0,
gc.ps_scavenge.count: 8,
gc.ps_scavenge.time: 126,
gc.ps_marksweep.count: 1,
gc.ps_marksweep.time: 50,
httpsessions.max: -1,
httpsessions.active: 0,
gauge.response.loggers: 52,
gauge.response.mappings: 3,
gauge.response.env: 69,
gauge.response.dump: 63,
gauge.response.health: 9,
gauge.response.star-star: 5,
gauge.response.star-star.favicon.ico: 4,
counter.status.200.mappings: 2,
counter.status.200.star-star.favicon.ico: 2,
counter.status.200.loggers: 1,
counter.status.404.star-star: 4,
counter.status.200.health: 1,
counter.status.200.dump: 2,
counter.status.200.env: 1
}
最后这个counter
可以帮我们统计应用的错误情况。
counter.status
后的值是HTTP
状态码,随后是所请求的路径。举个例子,counter.status.200.metrics
表明/metrics
端点返回200(OK)
状态码的次数。
总结
知识的海洋无穷无尽,我们不过是在Java
的海滩边捡了几片贝壳的小学生而已。
本文写的只是一个入门,如果想深入了解各个字段都是何含义,请参考这篇文章,写得特别好。