一文了解 Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控!
云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
本文为作者个人经验,供大家参考。
去年我们项目做了微服务1.0的架构转型,但是服务监控这块却没有跟上。这不,最近我就被分配了要将我们核心的微服务应用全部监控起来的任务。我们的微服务应用都是SpringBoot 应用,因此就自然而然的想到了借助Spring Boot 的Actuator 模块。
本篇是我在完成这个工单之后,对Spring Boot Actuator模块 学习应用的总结。在本篇文章中,你可以学习到:
- 1、Spring Boot Actuator 的快速使用入门
- 2、Spring Boot Actuator 的一些重要的endpoints的介绍
- 3、如何通过Actuator 模块实时查看当前应用的线程 dump信息
- 4、如何通过Actuator 模块实时查看当前应用的堆信息
- 5、如何通过Actuator 模块实时修改当前应用的日志打印等级
- 6、...
之后我还会介绍:
TODO:SpringBoot 微服务应用集成Prometheus + Grafana实现监控告警
什么是 Spring Boot Actuator
Spring Boot Actuator 模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP 跟踪等,帮助我们监控和管理Spring Boot 应用、Bean加载情况、环境变量、日志信息、线程信息,JVM 堆信息等 。这个模块是一个采集应用内部信息暴露给外部的模块,上述的功能都可以通过HTTP 和 JMX 访问。
因为暴露内部信息的特性,Actuator 也可以和一些外部的应用监控系统整合(Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic等)。这些监控系统提供了出色的仪表板,图形,分析和警报,可帮助你通过一个统一友好的界面,监视和管理你的应用程序。
Actuator使用Micrometer与这些外部应用程序监视系统集成。这样一来,只需很少的配置即可轻松集成外部的监控系统。
Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API,应用程序只需要使用 Micrometer 的通用 API 来收集性能指标即可。> Micrometer 会负责完成与不同监控系统的适配工作。这就使得切换监控系统变得很容易。
对比 Slf4j 之于 Java Logger 中的定位。
快速开始,创建一个Spring Boot Actuator Demo
我们先创建一个demo应用。
你可以通过Spring Boot CLI 创建:
spring init -d=web,actuator -n=actuator-demo actuator-demo
或者通过Spring Initializr 创建:
对应的maven依赖:
<dependencies> ... <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ... </dependencies>
对应的Gradle 依赖:
dependencies { compile("org.springframework.boot:spring-boot-starter-actuator") }
Endpoints 介绍
Spring Boot 提供了所谓的 endpoints (下文翻译为端点)给外部来与应用程序进行访问和交互。
打比方来说, /health 端点 提供了关于应用健康情况的一些基础信息。metrics 端点提供了一些有用的应用程序指标(JVM 内存使用、系统CPU使用等)。
这些 Actuator 模块本来就有的端点我们称之为原生端点。根据端点的作用的话,我们大概可以分为三大类:
应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与Spring Boot应用密切相关的配置类信息。
度量指标类:获取应用程序运行过程中用于监控的度量指标,比如:内存信息、线程池信息、HTTP请求统计等。
操作控制类:提供了对应用的关闭等操作类功能。
详细的原生端点介绍,请以官网为准,这里就不赘述徒增篇幅。
需要注意的就是:
1、每一个端点都可以通过配置来单独禁用或者启动
2、不同于Actuator 1.x,Actuator 2.x 的大多数端点默认被禁掉。Actuator 2.x 中的默认端点增加了 /actuator前缀。默认暴露的两个端点为 /actuator/health和 /actuator/info
端点暴露配置
我们可以通过以下配置,来配置通过JMX 和 HTTP 暴露的端点。
可以打开所有的监控点
management.endpoints.web.exposure.include=*
也可以选择打开部分,"*" 代表暴露所有的端点,如果指定多个端点,用","分开
management.endpoints.web.exposure.exclude=beans,trace
Actuator 默认所有的监控点路径都在 /actuator/*,当然如果有需要这个路径也支持定制。
management.endpoints.web. base -path=/minitor
设置完重启后,再次访问地址就会变成 /minitor/*。
现在我们按照如下配置:
# "*" 代表暴露所有的端点 如果指定多个端点,用","分开 management.endpoints.web.exposure.include=* # 赋值规则同上 management.endpoints.web.exposure.exclude=
启动DEMO程序,访问 http://localhost:8080/actuator,查看暴露出来的端点:
上面这样显示是因为chrome 浏览器安装了 JSON-handle 插件,实际上就是返回一大段json
下面,我会着重介绍几个比较重要的端点。
重要端点解析
5.1 /health端点
/health端点会聚合你程序的健康指标,来检查程序的健康情况。端点公开的应用健康信息取决于:
management.endpoint.health.show-details=always
该属性可以使用以下值之一进行配置:
按照上述配置,配置成 always之后,我们启动项目,访问 http://localhost:8080/actuator/health端口,可以看到这样的信息:
是不是感觉好像健康信息有点少?先别急,那是因为我们创建的是一个最基础的Demo项目,没有依赖很多的组件。
/health端点有很多自动配置的健康指示器:如redis、rabbitmq、db等组件。当你的项目有依赖对应组件的时候,这些健康指示器就会被自动装配,继而采集对应的信息。如上面的 diskSpace 节点信息就是 DiskSpaceHealthIndicator 在起作用。
上述截图取自官方文档
这是我另一个项目的 /health端点信息。
当如上的组件有一个状态异常,应用服务的整体状态即为down。我们也可以通过配置禁用某个组件的健康监测。
management.health.mongo.enabled: false
或者禁用所有自动配置的健康指示器:
management.health.defaults.enabled: false
⭐自定义 Health Indicator
当然你也可以自定义一个Health Indicator,只需要实现 HealthIndicator 接口或者继承 AbstractHealthIndicator类。
/** * @author Richard_yyf * @version 1.0 2020/1/16 */ @Component publicclass CustomHealthIndicator extends AbstractHealthIndicator { @Override protectedvoid doHealthCheck( Health . Builder builder) throws Exception { // 使用 builder 来创建健康状态信息 // 如果你throw 了一个 exception,那么status 就会被置为DOWN,异常信息会被记录下来 builder.up() .withDetail( "app" , "这个项目很健康" ) .withDetail( "error" , "Nothing, I'm very good" ); } }
最终效果:
5.2 /metrics端点
/metrics端点用来返回当前应用的各类重要度量指标,比如:内存信息、线程信息、垃圾回收信息、tomcat、数据库连接池等。
{ "names" : [ "tomcat.threads.busy" , "jvm.threads.states" , "jdbc.connections.active" , "jvm.gc.memory.promoted" , "http.server.requests" , "hikaricp.connections.max" , "hikaricp.connections.min" , "jvm.memory.used" , "jvm.gc.max.data.size" , "jdbc.connections.max" , .... ] }
不同于1.x,Actuator在这个界面看不到具体的指标信息,只是展示了一个指标列表。为了获取到某个指标的详细信息,我们可以请求具体的指标信息,像这样:
http: //localhost:8080/actuator/metrics/{MetricName}
比如我访问 /actuator/metrics/jvm.memory.max,返回信息如下:
你也可以用query param的方式查看单独的一块区域。比如你可以访问 /actuator/metrics/jvm.memory.max?tag=id:Metaspace。结果就是:
5.3 /loggers端点
/loggers 端点暴露了我们程序内部配置的所有logger的信息。我们访问 /actuator/loggers可以看到,
你也可以通过下述方式访问单独一个logger,
http: //localhost:8080/actuator/loggers/{name}
比如我现在访问 root logger, http://localhost:8080/actuator/loggers/root
{ "configuredLevel" : "INFO" , "effectiveLevel" : "INFO" }
⭐改变运行时的日志等级
/loggers端点我最想提的就是这个功能,能够动态修改你的日志等级。
比如,我们可以通过下述方式来修改 root logger的日志等级。我们只需要发起一个URL 为 http://localhost:8080/actuator/loggers/root的 POST请求,POST报文如下:
{ "configuredLevel" : "DEBUG" }
仔细想想,这个功能是不是非常有用。如果在生产环境中,你想要你的应用输出一些Debug信息以便于你诊断一些异常情况,你你只需要按照上述方式就可以修改,而不需要重启应用。
如果想重置成默认值,把value 改成 null
5.4 /info端点
/info端点可以用来展示你程序的信息。我理解过来就是一些程序的基础信息。并且你可以按照自己的需求在配置文件 application.properties中个性化配置(默认情况下,该端点只会返回一个空的json内容。):
info.app.name=actuator-test-demo info.app.encoding=UTF- 8 info.app.java.source= 1.8 info.app.java.target= 1.8 # 在 maven 项目中你可以直接用下列方式引用 maven properties的值 # info.app.encoding=@project.build.sourceEncoding@ # info.app.java.source=@java.version@ # info.app.java.target=@java.version@
启动项目,访问 http://localhost:8080/actuator/info:
{ "app" : { "encoding" : "UTF-8" , "java" : { "source" : "1.8.0_131" , "target" : "1.8.0_131" }, "name" : "actuator-test-demo" } }
5.5 /beans端点
/beans端点会返回Spring 容器中所有bean的别名、类型、是否单例、依赖等信息。
访问 http://localhost:8080/actuator/beans,返回如下:
5.6 /heapdump 端点
访问:http://localhost:8080/actuator/heapdump会自动生成一个 Jvm 的堆文件 heapdump。我们可以使用 JDK 自带的 Jvm 监控工具 VisualVM 打开此文件查看内存快照。
5.7 /threaddump 端点
这个端点我个人觉得特别有用,方便我们在日常定位问题的时候查看线程的情况。主要展示了线程名、线程ID、线程的状态、是否等待锁资源、线程堆栈等信息。就是可能查看起来不太直观。访问 http://localhost:8080/actuator/threaddump返回如下:
5.8 /shutdown端点
这个端点属于操作控制类端点,可以优雅关闭 Spring Boot 应用。要使用这个功能首先需要在配置文件中开启:
management.endpoint.shutdown.enabled= true
由于 shutdown 接口默认只支持 POST 请求,我们启动Demo项目,向 http://localhost:8080/actuator/shutdown发起 POST请求。返回信息:
{ "message" : "Shutting down, bye..." }
然后应用程序被关闭。
由于开放关闭应用的操作本身是一件非常危险的事,所以真正在线上使用的时候,我们需要对其加入一定的保护机制,比如:定制Actuator的端点路径、整合Spring Security进行安全校验等。(不是特别必要的话,这个端点不用开)
整合Spring Security 对端点进行安全校验
由于端点的信息和产生的交互都是非常敏感的,必须防止未经授权的外部访问。如果您的应用程序中存在Spring Security的依赖,则默认情况下使用基于表单的HTTP身份验证来保护端点。
如果没有,只需要增加对应的依赖即可:
<dependency> <groupId> org.springframework.boot </groupId> <artifactId> spring-boot-starter-security </artifactId> </dependency>
添加之后,我们需要定义安全校验规则,来覆盖Spring Security 的默认配置。
这里我给出了两个版本的模板配置:
import org.springframework.boot.actuate.autoconfigure.security.servlet. EndpointRequest ; import org.springframework.boot.actuate.context. ShutdownEndpoint ; import org.springframework.boot.autoconfigure.security.servlet. PathRequest ; import org.springframework.context.annotation. Configuration ; import org.springframework.security.config.annotation.web.builders. HttpSecurity ; import org.springframework.security.config.annotation.web.configuration. WebSecurityConfigurerAdapter ; /** * @author Richard_yyf */ @Configuration publicclass ActuatorSecurityConfig extends WebSecurityConfigurerAdapter { /* * version1: * 1. 限制 '/shutdown'端点的访问,只允许ACTUATOR_ADMIN访问 * 2. 允许外部访问其他的端点 * 3. 允许外部访问静态资源 * 4. 允许外部访问 '/' * 5. 其他的访问需要被校验 * version2: * 1. 限制所有端点的访问,只允许ACTUATOR_ADMIN访问 * 2. 允许外部访问静态资源 * 3. 允许外部访问 '/' * 4. 其他的访问需要被校验 */ @Override protectedvoid configure( HttpSecurity http) throws Exception { // version1 // http // .authorizeRequests() // .requestMatchers(EndpointRequest.to(ShutdownEndpoint.class)) // .hasRole("ACTUATOR_ADMIN") // .requestMatchers(EndpointRequest.toAnyEndpoint()) // .permitAll() // .requestMatchers(PathRequest.toStaticResources().atCommonLocations()) // .permitAll() // .antMatchers("/") // .permitAll() // .antMatchers("/**") // .authenticated() // .and() // .httpBasic(); // version2 http .authorizeRequests() .requestMatchers( EndpointRequest .toAnyEndpoint()) .hasRole( "ACTUATOR_ADMIN" ) .requestMatchers( PathRequest .toStaticResources().atCommonLocations()) .permitAll() .antMatchers( "/" ) .permitAll() .antMatchers( "/**" ) .authenticated() . and () .httpBasic(); } }
application.properties的相关配置如下:
# Spring Security Default user name and password spring.security.user.name=actuator spring.security.user.password=actuator spring.security.user.roles=ACTUATOR_ADMIN
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-03-15
本文作者:Richard_Yi
本文来自:“CSDN云计算公众号”,了解相关信息可以关注“CSDN云计算”

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
云原生就一定安全吗?
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 在当今时代,企业网络和数据安全风险从未像现在这样具有里程碑意义。尽管如此,传统方法(包括公有云运营商使用的方法)基本上是相同的。 云原生应用的兴起及其安全威胁 在当今时代,企业网络和数据安全风险从未像现在这样具有里程碑意义。尽管如此,传统方法(包括公有云运营商使用的方法)基本上是相同的。 转向应对威胁攻击而不是阻止威胁的反应措施。云原生应用程序日益受到重视,用各种可能的方式质疑了传统智慧。 从基础架构到应用程序的开发,堆栈在传统方法与更现代的基于云的方法之间形成了鲜明的对比,其中大多数已对成功的模式和实践达成了主流观点:DevOps文化、持续交付和微服务架构 。为什么我们还没有重新构想云原生的安全性呢?我们对此大胆的新想法在哪里呢? 可以肯定地说,在交付应用程序的过程中,云原生的安全性一直在被长期追踪。传统的IT安全团队将自己视为中间人。他们必须正确地完成工作,否则将面临代理机构所面临的更大风险。 它们在所有过程中都对安全性有很高的要求,但是要满足这些级别需要花费时间、测试和修订。因为这...
- 下一篇
Kubernetes operator 模式开发实践
0. 前言 近日我们在开发符合我们业务自身需求的微服务平台时,使用了 Kubernetes 的 Operator Pattern 来实现其中的运维系统,在本文,我们将实现过程中积累的主要知识点和技术细节做了一个整理。 读者在阅读完本文之后,会对 Operator Pattern 有一个基本的了解,并能将该模式应用到自己的业务中去。除此之外,我们也会分享要实现这一运维系统需要具备的一些相关知识。注:阅读本文内容需要对 Kubernetes 和 Go 语言有基本了解。 1. 什么是 Operator Pattern 在解释什么是 Operator Pattern 之前,我们得先了解在我们使用一个 Kubernetes 客户端——这里以 kubectl 举例——向 Kubernetes 集群发出指令,直到这项指令被 Kubernetes 集群执行结束,这段时间之内到底都发生了什么。这里以我们输入_ kubectl create -f ns-my-workspace.yaml_ 这条命令举例,这条命令的整条执行链路大致如下图所示: ### ns-my-workspace.yaml apiVer...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Linux系统CentOS6、CentOS7手动修改IP地址
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题