SpringBoot Actuator
简介:
SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息等
实现:
<!--actuator核心依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
在添加这actuator的场景启动器后默认就有了指标监控,此时不需要做任何事情,直接启动SpringBoot项目即可使用指标监控。可以使用http端点或者JMX来管理和监视应用程序。
步骤:
- 引入场景
- 访问 http://localhost:8080/actuator/
- 暴露所有端点为HTTP
#暴露所有端点,想指定具体的端点可以设置多个,以逗号分隔(health,info,beans)
management:
endpoints:
web:
exposure:
# 以web方式暴露所有的端点
include: "*"
# 更改路径,如果想更安全,请结合spring-security,更改后的路径将http://localhost:8080/actuator改为http://localhost:8080/test
base-path: /test
# 默认启动actuator
enabled-by-default: true
测试:
http://localhost:8080/actuator/beans
http://localhost:8080/actuator/configprops
http://localhost:8080/actuator/metrics
http://localhost:8080/actuator/metrics/jvm.gc.pause
http://localhost:8080/actuator/endpointName/detailPath
官方端点文档:Spring Boot Actuator
常用端点:
Health:监控状况
一个组件指标状态为Down则总状态信息Down,很多组件中都定制了Health子节点指标: 比如jdbc、redis。
shutdowm:优雅关闭
优雅关闭指的是在关闭程序之后新的请求就会无法访问,程序会等未完成的请求执行完毕后关闭程序,需要web服务器的支持
server:
# graceful优雅关闭 immediate立即关闭
shutdown: graceful
Metrics:运行时指标
Loggers:日志记录
logging:
file:
name: D:/logs/actuator_test.log
SpringBoot Admin
简介
可视化监控平台, 是一个基于 Spring Boot Actuator 端点之上的 Vue.js 应用程序。
github官方地址:https://github.com/codecentric/spring-boot-admin
使用SpringBoot Actuator的方式可以是HTTP端点或者JMX,这两种方式都比较不方便,而使用SpringBoot Admin可以直接对接暴露出来的HTTP端点,简化使用
-
绿色:健康
-
灰色:连接客户端健康信息超时(超过10s)
-
红色:就能看到具体的异常信息
使用:
-
设置SpringBoot Admin Server 创建服务器并引入依赖,例如创建一个springboot项目。版本建议:Spring Boot 2.x=Spring Boot Admin 2.x(比如Spring Boot 2.3x可以使用Spring Boot Admin 2.3x)
org.springframework.boot spring-boot-starter-web de.codecentric spring-boot-admin-starter-server 3.2.1 -
通过添加@EnableAdminServer到配置中来引入Spring Boot Admin Server配置:
@SpringBootApplication @EnableAdminServer public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
-
注册客户端应用程序并引入依赖,如一个springboot项目
de.codecentric spring-boot-admin-starter-client 3.2.1 -
配置Spring Boot Admin Server的URL,客户端连接Spring Boot Admin Server的地址
spring: # 如果服务端配置了登陆验证,那么客户端也要配置 boot: admin: client: url: http://localhost:8082 username: mzl password: test123 # 服务端配置 spring: security: user: name: mzl password: test123
若连接不上,可能是地址使用计算机名称作为地址,可以改变使用ip注册
访问服务器的根目录如http://localhost:8080/ 即可浏览
安全防护
SBA服务端安全
spring-boot-admin-server-ui 提供了一个登录页面和一个注销按钮、可以结合SpringSecurity解决身份验证和授权。Spring Security 配置如下:
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
配置类:
import de.codecentric.boot.admin.server.config.AdminServerProperties;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.Customizer;
import
org.springframework.security.config.annotation.authentication.builders.Authen ticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.security.web.csrf.CookieCsrfTokenRepository;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import java.util.UUID;
@Configuration(proxyBeanMethods = false)
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
private final AdminServerProperties adminServer;
private final SecurityProperties security;
public SecuritySecureConfig(AdminServerProperties adminServer, SecurityProperties security) {
this.adminServer = adminServer;
this.security = security;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
successHandler.setDefaultTargetUrl(this.adminServer.path("/"));
http.authorizeRequests(
(authorizeRequests) -> authorizeRequests.antMatchers(this.adminServer.path("/assets/**")).permitAll()
.antMatchers(this.adminServer.path("/actuator/info")).permitAll()
.antMatchers(this.adminServer.path("/actuator/health")).permitAll()
.antMatchers(this.adminServer.path("/login")).permitAll().anyRequest().authenticated()
).formLogin(
(formLogin) -> formLogin.loginPage(this.adminServer.path("/login")).successHandler(successHandler).and()
).logout((logout) -> logout.logoutUrl(this.adminServer.path("/logout"))).httpBasic(Customizer.withDefaults())
.csrf((csrf) -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.ignoringRequestMatchers(
new AntPathRequestMatcher(this.adminServer.path("/instances"),
HttpMethod.POST.toString()),
new AntPathRequestMatcher(this.adminServer.path("/instances/*"),
HttpMethod.DELETE.toString()),
new AntPathRequestMatcher(this.adminServer.path("/actuator/**"))
))
.rememberMe((rememberMe) -> rememberMe.key(UUID.randomUUID().toString()).tokenValiditySeconds(1209600));
}
// Required to provide UserDetailsService for "remember functionality"
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser(security.getUser().getName())
.password("{noop}" + security.getUser().getPassword()).roles("USER");
}
}
配置信息:
spring:
security:
user:
name: mzl
password: test123
运行提示登录: 输入配置的name/password即可
SBA客户端:
如果服务端不是通过注册中心进行获取客户端 ,需要单独为客户端配置,因为不配置客户端无法向服务端注册应用( 没有配置不会报错,只是在监控台看不到应用,也就是没有注册进去)
spring:
# 如果服务端配置了登陆验证,那么客户端也要配置
boot:
admin:
client:
username: mzl
password: test123
邮件通知
如果服务下线,会进行邮件通知,在spring boot amdin 服务端修改
依赖:
<!--邮件通知-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
配置:
spring:
mail:
# 发件人使用的qq邮箱服务
host: smtp.qq.com
username: 2545166742@qq.com
# 授权码,不是密码,在qq邮箱设置-账号里面有生成授权码
password: mrlsurhamvhxecfi
boot:
admin:
notify:
mail:
# 收件人,多个中间用,分隔
to: 2545166742@qq.com
# 发件人
from: 2545166742@qq.com
重启服务 ,然后将一个服务关闭进行测试。
定制EndPoint(端点)
-
定制Health信息
@Component // 类名后缀一定要加上HealthIndicator public class MzlHealthIndicator extends AbstractHealthIndicator { @Override protected void doHealthCheck(Health.Builder builder) throws Exception { try { boolean isCheck=check(); if (isCheck){ builder.up().withDetail("total","1"); }else { builder.down(); } } catch (Exception e) { builder.down().withException(e); } } // 自己去链接mongodb 如果连不上说明状态down // 根据自己的项目的业务需求定制 private boolean check() { //todo: 验证逻辑 return true; } }
-
定制info信息:
info端点本来是什么都没有的,是专门提供给程序员自己定制的端点
方式1:编写配置文件:
info: appName: boot‐admin version: 2.0.1 mavenProjectName: @project.artifactId@ mavenProjectVersion: @project.version@
方式2:编写InfoContributor:
@Component public class MzlInfo implements InfoContributor { @Override public void contribute(Info.Builder builder) { // 可以查询数据库缓存...来放到info中 builder.withDetail("TestInfo","启动"); builder.withDetail("吃什么","猪头肉"); } }
-
定制Metrics信息
Spring Boot Actuator为Micrometer 提供了依赖管理和自动配置功能,Micrometer 是一个应用指标 facade(门面),支持多种监控系统,包括:
AppOptics,Azure Monitor,Netflix Atlas,CloudWatch,Datadog,Dynatrace,Elastic,Ganglia,
Graphite,Humio,Influx/Telegraf,JMX,KairosDB,New Relic,Prometheus,SignalFx,Google
Stackdriver,StatsD,和 Wavefront。
而我们可以看到一下优点:
- 提供了一些api供我们操作指标
- 提供缓存、类加载器、GC、jvm内存/cpu利用率 线程...指标 开箱即用
- 已经融入了SpringBoot Actuator
JVM度量,报告利用率(JVM metrics, report utilization of):
- 各种内存和缓冲池(Various memory and buffer pools)
- 与垃圾收集有关的统计数据(Statistics related to garbage collection)
- 线程利用率(Threads utilization)
- 加载/卸载的类数(Number of classes loaded/unloaded)
- CPU 指标-CPU metrics
- 文件描述符度量-File descriptor metrics
- Kafka 的消费者、生产者和流量指标-Kafka consumer, producer, and streams metrics
- Log4j2度量: 记录每个level记录在 Log4j2中的事件数量-Log4j2 metrics: record the number of events logged to Log4j2 at each level
- Logback度量: 记录每个级别登录到 Logback 的事件数量 —Logback metrics: record the number of events logged to Logback at each level
- 正常运行时间指标: 报告正常运行时间指标和表示应用程序绝对启动时间的固定指标—Uptime metrics: report a gauge for uptime and a fixed gauge representing the application’s absolute start time
- Tomcat 指标—Tomcat metrics (server.tomcat.mbeanregistry.enabled must be set to true for all Tomcatmetrics to be registered)
Spring整合指标 Spring Integration metrics
增加定制Mertrics
定制计量方法:
Counter:
Counter是一种比较简单的Meter,它是一种单值的度量类型,或者说是一个单值计数器
使用场景:
Counter的作用是记录XXX的总量或者计数值,适用于一些增长类型的统计,例如下单、支付次数、Http请求总量记录等等
// 记录下单总数 Metrics.counter("order.count","order.channel",order.getChannel()).increment(); // 记录访问次数 Metrics.counter("sayHi.counter", Tags.empty()).increment(); @RestController public class HelloController { @GetMapping("/sayHi") public String sayHi() throws InterruptedException { // 记录访问次数 Metrics.counter("sayHi.counter", Tags.empty()).increment(); System.out.println("success"); return "Hi success"; } }
Timer:
Timer(计时器)适用于记录好事比较短的事件的执行时间,通过时间分布展示时间的序列和发生频率
使用场景:
大致总结如下:
1、记录指定方法的执行时间用于展示
2、记录一些让你无的执行时间,从而确定某些数据来源的速率,例如消息队列的消费速率
@RestController
public class HelloController {
@GetMapping("/sayHi")
public String sayHi() throws InterruptedException {
// 定制基于Metrics的计时器
Timer timer = Metrics.timer("mzl.timer");
timer.record(()->{
System.out.println("success1");
});
return "Hi success";
}
}
Gauge
Gauge(仪表)是获取当前度量记录值的句柄,也就是它表示一个可以任意上下浮动的单数值度量Meter。
使用场景:
大致如下:
1、有自然(物理)上界的浮动值的检测,例如物理内存、集合、映射、数值等
2、有罗技上街的浮动值的检测,例如积压的消息、(线程池中)挤压的任务等,其实其本质也是集合或者映射的检测
//定制基于Metrics的仪表 记录单个值 一般集合的数量
Metrics.gauge("mzl.gauge",1);
Summary
Summary(摘要)主要用于跟踪事件的分布,在Micrometer中,对应的类是DistributionSummary (分发摘要)。它的使用方式和Timer十分相似,但是它的记录值并不依赖于时间单位。
使用场景:
大致如下:
1、不依赖于时间单位的记录值的测量,例如服务器的有效负载值,缓存的命中率等
// 定制基于Metrics的摘要 一般用于记录百分比的数值 例如:缓存命中率
DistributionSummary summary=Metrics.summary("mzl.summary");
summary.record(1.5);
其他方式:
或者:
-
定制Endpoint
@Component @Endpoint(id="mzl") public class MzlEndPoint { public Map
mzlInfo=new HashMap<>(); public MzlEndPoint(){ mzlInfo.put("age",22); mzlInfo.put("sex","男"); } @ReadOperation public Map show(){ return mzlInfo; } @WriteOperation public void write(String key,String value){ mzlInfo.put(key,value); } }
最后:
SpringBoot Admin不提供自定义的Endpoint的界面,如果需要界面,则需要下载源码,自定义界面
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://miaoweb.online/155/
星期六一博主
这里不知道怎么回事,md文件出了点毛病在“`SpringBoot Admin Server 创建服务器并引入依赖“`和“`注册客户端应用程序并引入依赖“`那里的xml标签丢了,我检查一圈也没找到问题,还有其他的地方也出现了一些小问题。如果需要完整的md文件可以私信我