SpringBoot的资源监控,或者叫指标监控
Actuator是Springboot提供的用来对应用系统进行自省和监控的功能模块,
借助于Actuator开发者可以很方便地对应用系统某些监控指标进行查看、统计等。Springboot为我们提供数据有两种方式,web方式(通过http获取监控数据)和JMX(通过JDK工具查看监控数据)
主流使用Web方式获取监控数据。配置Actuator资源监控的步骤如下:
导入Actuator场景依赖
<!--指标监控功能场景依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
在boot配置文件中,开启将监控数据以web形式暴露出来,
使得我们通过浏览器http://localhost:8080/actuator
即可查看监控数据#指标监控的设置 management: endpoints: enabled-by-default: true #默认开启所有endpoint(端点,功能) web: exposure: include: '*' #以web形式暴露所有端点(开启所有功能)
在Actuator中有非常多的端点,即很多模块信息,有所有bean信息,组件的健康状态
各种配置信息,只需要使用http://localhost:8080/actuator/端点名称
即可查看各端点数据,
数据以json格式返回给用户。例如,查看health,访问
http://localhost:8080/actuator/health
即可查看项目的健康状态
不过”UP”表示健康,”Down”表示宕机不健康,只有项目中所有的组件都健康,整个项目才会显示UP
任意一个组件宕机,整个项目就会显示Down,我们可以通过配置查看整个项目下更细节的健康情况management: endpoint: health: show-details: always #开启健康详细报告
所有端点的具体信息都可以在management.endpoint.xxx配置,配置端点是否打开监控信息等等
自定义端点及其数据项
自定义health端点的健康信息
默认情况下,当我们配置了详细模式访问health端点时,可以看到有三个健康信息项,db,diskSpace,ping
当我们自定义新的健康信息项后,通过业务逻辑判断就能监控组件是否健康,我们还可以给自定义健康信息项
传递数据,当我们通过http访问我们自己的健康数据项时就可以查看到该组件是否健康。自定义类继承AbstractHealthIndicator,该抽象类实现了HealthIndicator接口,自定义类名后缀必须
是HealthIndicator,即xxxHealthIndicator,如此,我们的health端点下的健康数据项名就为xxx@Component public class KeyiHealthIndicator extends AbstractHealthIndicator { @Override protected void doHealthCheck(Health.Builder builder) throws Exception { /* 这里进行逻辑判断后,将数据带给health,一起被展示 */ HashMap<String, Object> map = new HashMap<>(); if (1==1){ map.put("keyi","健康强壮"); builder.up(); //表示组件健康 }else { map.put("keyi","虚脱瘦弱"); builder.down(); //表示组价不健康 } builder.withDetail("xixi","茜茜哈哈").withDetails(map); } }
配置好后,我们就可以通过
http://localhost:8080/actuator/health/keyi
即可看到我们
自己配置的健康数据项,keyi: {status: "UP", details: {xixi: "茜茜哈哈", keyi: "健康强壮"}}
自定义info端点信息
info端点可以用来配置项目的基本信息,项目名,项目版本之类的,默认情况下,我们访问info时没有数据
配置info端点信息有两种方式:boot配置文件中配置info端点信息
info: information: 该项目隶属于太阳系->地球->中国->江西->九江->王科一 #自定义信息 mavenVersion: @project.version@ mavenArtifact: @project.artifactId@ #获取maven中的配置信息
我们还可以使用自定义类实现InfoContributor接口,从而配置info端点的数据项
使用方式和配置health端点的健康数据项类似。
自定义metrics端点信息
metrics端点,当我们需要为某个系统某个服务做监控、做统计,就需要用到 metrics
应用场景:- 每秒的请求数是多少?
- 平均每个请求处理的时间?
- 请求处理的最长耗时?
- 等待处理的请求队列长度?
例如:统计一个service方法被调用多少次?
@Service @Slf4j public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService { UserMapper userMapper; Counter counter; @Autowired public UserServiceImpl(UserMapper userMapper, MeterRegistry meterRegistry) { this.userMapper = userMapper; counter = meterRegistry.counter("UserServiceImpl.getUserByEmail.count"); } public User getUserByEmail(String email){ log.info("UserService:{}",email); //自增+1 counter.increment(); return userMapper.getUserByEmail(email); } } /* 注入MeterRegistry对象,调用该对象的counter计数方法,传递的string参数 就是metrics端点中的数据项的key,而计算的结果被作为value,每次调用getUserByEmail方法 counter调用自增方法,我们通过http访问metrics端点下的key值,即可查看到value自增值 */
自定义端点
以上都是在原有的端点上添加数据源,下面我们来看看如何自定义端点及设置数据项信息
只需要自定义一个类,使用@EndPoind注解标注该类的端点名称,该端点名与health,metrics同级
访问http://localhost:8080/actuator/端点名称
,即可查看自定义端点信息@Component @Endpoint(id="keyi") //指定端点名 public class MyServiceEndPoint { @ReadOperation public Map getSomeInfo(){ //访问actuator/keyi时,就会显示以下数据项 return Collections.singletonMap("万一","茜茜"); } @WriteOperation public void writeSomeInfo(){ System.out.println("一袋米要抗几楼"); } }
SpringBootAdmin,微服务可视化资源监控项目
SpringBootAdmin是一个可视化的资源监控项目,我们之前使用http方式访问各个端点信息,
返回给我们的是json,这个项目就是用这些json数据做成前端页面展示出来,并使用微服务架构
使得多个微服务配置到运行该项目的服务器上后,就可以可视化管理监控我们的微服务项目。
下面来看看如何简单的配置运行该项目:
创建一个新的SpringBoot项目,使得该项目作为服务器,导入admin-server依赖和web场景依赖
<!--web场景依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--微服务可视化监控服务器--> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> <version>2.4.0</version> </dependency>
在主程序类上标注@EnableAdminServer,并在boot配置文件中配置项目的端口号,
防止跟原有项目端口冲突@EnableAdminServer @SpringBootApplication public class ApplicationAdminServer { public static void main(String[] args) { SpringApplication.run(ApplicationAdminServer.class,args); } }
#端口号 server: port: 8888
配置好后,通过
http://localhost:8888/
即可查看到该项目首页服务器端配置好后,接下来配置客户端,首先我们的项目需要导入指标监控依赖和client依赖
<!--添加springbootAdmin的client端场景依赖--> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.4.0</version> </dependency> <!--指标监控功能场景依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
在boot配置文件中配置好本项目端口号,防止与服务器项目冲突,并且将端点使用web方式暴露出来,
默认使用的是JMX方式,最后配置服务器端的url地址,以便该项目部署到服务器端,能被监控到。#修改tomcat端口号 server: port: 8080 # springbootAdmin监视可视化配置 spring: boot: admin: client: url: http://localhost:8888 #指标监控的设置 management: endpoints: enabled-by-default: true #默认开启所有endpoint(功能) web: exposure: include: '*' #以web形式暴露所有端点(开启所有功能)
配置好客户端后,将服务器端和客户端项目都启动起来,再访问服务器端项目首页,即可监控原项目的信息