SpringBoot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!
阅读本文大概需要 8.5 分钟。
来自:网络,侵删
2、 Spring Boot Actuator 的一些重要的endpoints的介绍
3、 如何通过Actuator 模块实时查看当前应用的线程 dump信息
4、 如何通过Actuator 模块实时查看当前应用的堆信息
5、 如何通过Actuator 模块实时修改当前应用的日志打印等级
6、 ...
一、什么是 Spring Boot Actuator
Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API,应用程序只需要使用 Micrometer 的通用 API 来收集性能指标即可。Micrometer 会负责完成与不同监控系统的适配工作。这就使得切换监控系统变得很容易。 对比 Slf4j 之于 Java Logger 中的定位。
二、快速开始,创建一个Spring Boot Actuator Demo
spring init -d=web,actuator -n=actuator-demo actuator-demo
<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
...
</dependencies>
dependencies {
compile("org.springframework.boot:spring-boot-starter-actuator")
}
三、Endpoints 介绍
/health
端点 提供了关于应用健康情况的一些基础信息。metrics
端点提供了一些有用的应用程序指标(JVM 内存使用、系统CPU使用等)。详细的原生端点介绍,请以官网为准,这里就不赘述徒增篇幅。
/actuator
前缀。默认暴露的两个端点为/actuator/health
和 /actuator/info
四、端点暴露配置
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=beans,trace
/actuator/*
,当然如果有需要这个路径也支持定制。management.endpoints.web.base-path=/minitor
/minitor/*
。# "*" 代表暴露所有的端点 如果指定多个端点,用","分开
management.endpoints.web.exposure.include=*
# 赋值规则同上
management.endpoints.web.exposure.exclude=
http://localhost:8080/actuator
,查看暴露出来的端点:上面这样显示是因为chrome 浏览器安装了 JSON-handle 插件,实际上就是返回一大段json
五、重要端点解析
5.1 /health
端点
/health
端点会聚合你程序的健康指标,来检查程序的健康情况。端点公开的应用健康信息取决于:management.endpoint.health.show-details=always
never | |
when-authorized | management.endpoint.health.roles 配置 |
always |
always
之后,我们启动项目,访问http://localhost:8080/actuator/health
端口,可以看到这样的信息:/health
端点有很多自动配置的健康指示器:如redis、rabbitmq、db等组件。当你的项目有依赖对应组件的时候,这些健康指示器就会被自动装配,继而采集对应的信息。如上面的 diskSpace 节点信息就是DiskSpaceHealthIndicator
在起作用。上述截图取自官方文档
/health
端点信息。management.health.mongo.enabled: false
management.health.defaults.enabled: false
⭐自定义 Health Indicator
HealthIndicator
接口或者继承AbstractHealthIndicator
类。/**
* @author Richard_yyf
* @version 1.0 2020/1/16
*/
@Component
public class CustomHealthIndicator extends AbstractHealthIndicator {
@Override
protected void 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",
....
]
}
http://localhost:8080/actuator/metrics/{MetricName}
/actuator/metrics/jvm.memory.max
,返回信息如下:/actuator/metrics/jvm.memory.max?tag=id:Metaspace
。结果就是:5.3/loggers
端点
/loggers
端点暴露了我们程序内部配置的所有logger的信息。我们访问/actuator/loggers
可以看到,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"
}
如果想重置成默认值,把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
端点
http://localhost:8080/actuator/threaddump
返回如下:5.8 /shutdown
端点
management.endpoint.shutdown.enabled=true
http://localhost:8080/actuator/shutdown
发起POST
请求。返回信息:{
"message": "Shutting down, bye..."
}
六、整合Spring Security 对端点进行安全校验
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
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
public class ActuatorSecurityConfig extends WebSecurityConfigurerAdapter {
/*
* version1:
* 1. 限制 '/shutdown'端点的访问,只允许ACTUATOR_ADMIN访问
* 2. 允许外部访问其他的端点
* 3. 允许外部访问静态资源
* 4. 允许外部访问 '/'
* 5. 其他的访问需要被校验
* version2:
* 1. 限制所有端点的访问,只允许ACTUATOR_ADMIN访问
* 2. 允许外部访问静态资源
* 3. 允许外部访问 '/'
* 4. 其他的访问需要被校验
*/
@Override
protected void 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
结语
最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
朕已阅
评论