2

问题描述

本文放在草稿箱好久了,本来想结合日志完善该文章的,后来日志研究失败了,本文也就算是一篇独立于日志的文章了。

项目上线,并不意味着我们的工作结束了。

我们往往会对已上线的应用进行监控,监控系统在实际使用时有何问题?以实施改进。

最近不是很忙,想学习一下应用监控,以期上线更加完善的系统。

实现

应用监控

在这方面毫无经验,第一时间想到的自然是学习前辈们的经验。打开《Java EE 开发的颠覆者:Spring Boot实战》。

本书中也是讲解了部分有关应用监控的知识。使用SpringBoot中提供的Actuator即可实现应用监控。

官方文档:Part V. Spring Boot Actuator: Production-ready features

添加依赖

新建一个SpringBoot项目,添加webactuator依赖,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>

在引入了相应的监控模块之后,启动项目,控制台中会打印映射的日志。

clipboard.png

但是前台访问时,却报了401错误。

clipboard.png

同时控制台中打印信息:

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进行用户认证,避免系统被黑客所攻击或泄露数据。

clipboard.png

访问

重启项目,访问/mapping,可以看到本项目中不同url、不同方法所对应的相关Bean中的相关方法。

clipboard.png

{[/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

clipboard.png

好几十个线程,DestroyJavaVM http-nio-8080-AsyncTimeouthttp-nio-8080-AcceptorNioBlockingSelector.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的海滩边捡了几片贝壳的小学生而已。

本文写的只是一个入门,如果想深入了解各个字段都是何含义,请参考这篇文章,写得特别好。


张喜硕
2.1k 声望423 粉丝

浅梦辄止,书墨未浓。


« 上一篇
Entity 监听器