指标监控-配置 EndPoint
# 620.指标监控-配置 EndPoint
我们可以配置某个端点的信息,例如 Health,信息太少了
# 开启具体端点
之前我们默认是开启了全部的端点,其实这样有点危险,容易泄漏敏感信息;一般来说都是开启具体的端点,此时就可以配置 enabled,配置格式为:
management.endpoint.<endpointName>.enabled = true
例如:
management:
endpoints:
enabled-by-default: false
endpoint: #对某个端点的具体配置
health:
enabled: true
info:
enabled: true
beans:
enabled: true
metrics:
enabled: true
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ps:
management
:是所有 actuator 的配置
management.endpoint.端点名.xxxx
:对某个端点的具体配置
# Health Endpoint
健康检查端点,我们一般用于在云平台,平台会定时的检查应用的健康状况,Health Endpoint 可以为平台返回当前应用的一系列组件健康状况的集合。重要的几点:
- health endpoint 返回的结果,应该是一系列健康检查后的一个汇总报告
- 很多的健康检查默认已经自动配置好了,比如:数据库、Redis 等
- 可以很容易的添加自定义的健康检查机制
我们这样配置,显示全部信息:
management:
endpoints:
enabled-by-default: true # 默认开启所有监控端点
web:
exposure:
include: "*" # 以web方式暴露所有监控端点
endpoint:
health:
show-details: always # 显示健康检查的全部细节
2
3
4
5
6
7
8
9
重启后,效果:
可以看到 components 里面有 db、磁盘空间、ping 以及 Redis 的信息,并且都是健康的(up),因此我们的应用是健康的。如果有任何一个有问题,那么整体的状态就是不正常的。
# 定制 Health 信息
默认情况下,health 只检查了几个 component,有时候我们想要自己加上一个,具体怎么做呢?我们只需实现 HealthIndicator
接口即可
其实磁盘空间 diskSpace
,就是继承了该接口的。类定义如下:
public class DiskSpaceHealthIndicator extends AbstractHealthIndicator
而 AbstractHealthIndicator 就是实现了该接口的:
public abstract class AbstractHealthIndicator implements HealthIndicator
我们自己也增加一个 Indicator:
package com.peterjxl.learnspringbootwebadmin.health;
import org.springframework.boot.actuate.health.AbstractHealthIndicator;
import org.springframework.boot.actuate.health.Health;
@Component
public class MyComponentIndicator extends AbstractHealthIndicator {
/**
* 实现具体的检查方法
*/
@Override
protected void doHealthCheck(Health.Builder builder) throws Exception {
// 使用builder 来创建健康状态信息
// 如果throw 了一个异常,说明系统是不健康的,需要告诉用户什么错误
if (1==1) {
builder.up();
}else {
builder.down();
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
其实 up 和 down 方法,也是设置一个状态而已:
public Builder up() {
return status(Status.UP);
}
public Builder down(Throwable ex) {
return down().withException(ex);
}
2
3
4
5
6
7
8
除此之外,我们还可以设置一些详细的信息,假设我们目前是检查 MongoDB 的连接状况:
@Override
protected void doHealthCheck(Health.Builder builder) throws Exception {
// 使用builder 来创建健康状态信息
Map<String, Object> map = new HashMap<>();
if (1==1) {
//builder.up();
builder.status(Status.UP);
map.put("count", 1); //自定义监控内容,key-value形式,例如:当前数据库连接数
map.put("ms", 100); // 时间
}else {
builder.status(Status.OUT_OF_SERVICE);
map.put("error", "连接超时");
map.put("ms", 3000); // 时间
}
builder.withDetail("code", 1) // 可以传入错误信息
.withDetails(map); // 还可以传入map,可以传入更多检查信息
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
重启,此时就能看到自定义的信息了:
# 定制 info 信息
info 信息默认是空白的,想要定制常用的两种方式:编写配置文件、编写 InfoContributor
例如我们直接在配置文件 application.yml 中编写 INFO 的信息:
management:
endpoints:
enabled-by-default: true # 默认开启所有监控端点
web:
exposure:
include: "*" # 以web方式暴露所有监控端点
endpoint:
health:
show-details: always # 显示健康检查的全部细节
info:
appName: boot-admin
appVersion: 1.0.0
2
3
4
5
6
7
8
9
10
11
12
13
运行结果:
还可以读取 pom.xml 文件的信息,例如:
info:
appName: boot-admin
appVersion: 1.0.0
mavenProjectName: @project.name@
mavenProjectVersion: @project.version@
2
3
4
5
效果:
除了配置文件,还可以通过代码的方式来配置(因为有些内容可能是动态获取的):
package com.peterjxl.learnspringbootwebadmin.acutuator.info;
import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.stereotype.Component;
import java.util.Collections;
@Component
public class AppInfo implements InfoContributor {
@Override
public void contribute(Info.Builder builder) {
builder.withDetail("author", "peterjxl")
.withDetail("email", "peterjxl@qq.com")
.withDetails(Collections.singletonMap("version", "1.0.0")); // 可以传入map
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
结果:
可以看到和配置文件的合在一起了,也就是说我们可以将两者结合起来使用,确定的信息就写在配置文件中,事先不确定的则通过代码
# Metrics Endpoint
提供详细的、层级的、空间指标信息,这些信息可以被 pull(主动推送)或者 push(被动获取)方式得到:
- 通过 Metrics 对接多种监控系统
- 简化核心 Metrics 开发
- 添加自定义 Metrics 或者扩展已有 Metrics
Metrics 支持很多信息:
JVM metrics, report utilization of:
- Various memory and buffer pools
- Statistics related to garbage collection
- Threads utilization
- Number of classes loaded/unloaded
CPU metrics
File descriptor metrics
Kafka consumer and producer metrics
Log4j2 metrics: record the number of events logged to Log4j2 at each level
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 metrics (server.tomcat.mbeanregistry.enabled must be set to true for all Tomcat metrics to be registered)
Spring Integration metrics
除此之外,也支持自定义 Metrics 信息,例如我们想要统计 /city 路径的访问次数,也很简单,只需用 meterRegistry 进行一个注册即可,例如:
@Service
public class CityServiceImpl implements CityService {
@Autowired
CityMapper cityMapper;
Counter counter;
public CityServiceImpl(MeterRegistry meterRegistry){
counter = meterRegistry.counter("cityService.saveCity.count");
}
public City getCityById(Long id) {
return cityMapper.getById(id);
}
public void saveCity(City city) {
counter.increment();
cityMapper.insert(city);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
我们首先在构造方法中,创建了 meterRegistry;然后在 saveCity 方法里,调用一次 increment 方法,表明增加了一次。
meterRegistry 除了提供计数之外,还有很多功能,例如计时等,这里我们只用了 counter。
重启项目,可以看到多了一个指标:
然后我们可以使用 postman 发送/city 请求,再来看指标,可以看到有次数了:
也可以使用下面的方式,来完成指标的注册:
@Bean
MeterBinder queueSize(Queue queue) {
return (registry) -> Gauge.builder("queueSize", queue::size).register(registry);
}
2
3
4
# 新增监控端点
官方提供的端点虽然丰富,但有时候我们想要自定义一个端点,也很简单,只需在类上加上 @Endpoint
注解即可,然后定义读写的方法(也是用注解),例如:
package com.peterjxl.learnspringbootwebadmin.acutuator.endpoint;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.boot.actuate.endpoint.annotation.WriteOperation;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.Map;
@Component
@Endpoint(id = "myService")
public class MyServiceEndPoint {
@ReadOperation
public Map getDockerInfo(){
return Collections.singletonMap("dockerInfo", "docker is running");
}
@WriteOperation
public void stopDocker(){
System.out.println("docker is stopped....");
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
重启,效果:
# 源码
已将本文源码上传到 Gitee (opens new window) 或 GitHub (opens new window) 的分支 demo23,读者可以通过切换分支来查看本文的示例代码