SpringBoot 应用监控

问题描述

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

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

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

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

实现

应用监控

在这方面毫无经验,第一时间想到的自然是学习前辈们的经验。打开《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的海滩边捡了几片贝壳的小学生而已。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值