了解Springboot Actuator
,它提供了很多生产级的特性,比如说监控和度量spring boot
应用程序。Actuator
的这些特性可以通过众多的REST断点,远程shell和JMX获得。
加入依赖:
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
配置文件:
security.basic.enabled=false
management.security.enabled=false
之前的boot版本1.4.*不需要加入spring-boot-starter-security
依赖,自己本demo使用的是1.5.4的版本,发现无法访问监控度量的web端点,在控制台上提示加入spring-boot-starter-security
依赖及配置management.security.enabled=false
。
监控
- 描述应用程序上下文的全部beans,以及它们的关系
http://localhost:8080/beans
- 获取全部的环境变量
http://localhost:8080/env
包括系统属性,系统配置,配置文件application.properties
配置文件中的属性。
增加配置文件db.properties
@SpringBootApplication
@PropertySource(value = "classpath:db.properties")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
- 描述全部的URL路径,以及它们和控制器(包含Actuator断点)的映射关系。
http://localhost:8080/mappings
- 提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没有通过
比如我人为的排除WebSocketAutoConfiguration
,在监控上也可以反应出来。
@SpringBootApplication(exclude = {WebSocketAutoConfiguration.class})
@PropertySource(value = "classpath:db.properties")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
http://localhost:8080/autoconfig
- 健康检查
报告应用程序的健康指标,这些值由org.springframework.boot.actuate.health.HealthIndicator
的实现类提供。
比如我在项目中加入mysql服务,如下监控
http://localhost:8080/health
当然不仅仅是mysql
服务,springboot
默认实现的监控还包括redis
服务,mongodb
,solr
,rabbitmq
,Elasticsearch
等等服务。
这些实现在spring-boot-actuator-1.5.4.RELEASE.jar
的org.springframework.boot.actuate.health
包下,
自定义健康检查
实现HealthIndicator
接口,并纳入到spring容器的管理之中。
@Component
public class MyHealthIndicator implements HealthIndicator{
@Override
public Health health() {
return Health.down().withDetail("error","spring boot error").build();
}
}
这边举了简单的列子,并没有任何有意义的实现,实际开发中我们可以使用心跳检测监测一些外部调用服务的健康状态。
- 获取应用程序的定制信息,这些信息由info打头的属性提供
在配置文件中配置:
info.hello.name=miaozhihao
info.hello.password=2312312ewr
配置的信息必须以info开头,只有在配置文件中配置了/info才能监控得到。
也可以配置一些git信息,配置哪些配置呢?可以看GitInfoContributor
中的GitProperties
这个类。
新建git.properties
文件,在git.properties
中配置:
git.branch=master
git.commit.id=23r234wfsadfasfsdfdsf2qerqwrwt
git.commit.time=20170801
查看url地址,发现可疑监控到git的版本信息。
源码分析
spring-boot-actuator-1.5.4.RELEASE.jar
这个jar下的org.springframework.boot.actuate.endpoint
包下
org.springframework.boot.actuate.endpoint.BeansEndpoint
,
org.springframework.boot.actuate.endpoint.HealthEndpoint
,
org.springframework.boot.actuate.endpoint.MetricsEndpoint
等等。
比如说根据源码分析可以设置
endpoints.beans.enabled=false
那么http://localhost:8080/beans
就不显示了。
度量
对运行时度量情况做一个快照,这对评估应用程序的健康情况很有帮助。actuator提供了一系列的端点,让你能在运行时快速检查应用程序。
http://localhost:8080/metrics
查看某一项的度量值
springboot还提供了CounterService
类和GaugeService
类便于我们去度量。
CounterService
:用来计数的服务,可以直接使用。
GaugeService
:用来统计某个值,可以直接使用。
@RestController
public class UserController {
@Autowired
private CounterService counterService;
@Autowired
private GaugeService gaugeService;
@GetMapping("/user/index/{id}")
public String index(@PathVariable int id){
counterService.increment("user home");
if(2 == id){
throw new NullPointerException();
}
return "user home";
}
@GetMapping("/user/price")
public String getPrice(@RequestParam double price){
gaugeService.submit("price",price);
return "user price";
}
}
http://localhost:8080/user/index/1
http://localhost:8080/user/index/2
http://localhost:8080/user/price?price=3423
Metric不仅可以输出到页面,还可以输出到jmx,redis等地方
通过向spring容器中装配一个MetricWriter来实现定向输出。
下面的demo就是向jmx实现定向输出,然后进行相关的操作之后就能在jconsole(jvisualvm,jmc)上面看到具体的度量,
@Configuration
public class ExportConfiguration {
@Bean
@ExportMetricWriter
public MetricWriter metricWriter(MBeanExporter exporter){
return new JmxMetricWriter(exporter);
}
}
然后我们java的安装目录去查看相关工具的监控,
关于MetricWriter实现类,