Spring Boot Actuator :系统监控组件

Spring Boot Actuator :系统监控组件

Demo已上传GitHub

Maven依赖

Spring Boot Actuator依赖于Spring HATEOAS

1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.hateoas</groupId>
<artifactId>spring-hateoas</artifactId>
</dependency>

application.yml

1
2
3
4
5
6
7
# 暴露所有Spring Boot Actuator端点,否则只暴露/health和/info两个端点
# 生产环境不建议全部暴露
management:
endpoints:
web:
exposure:
include: "*" # * 在yaml 文件属于关键字,所以需要加引号

HATEOAS端点】

所有端点信息及功能见Spring Boot Actuator端点文档》

1./actuator:查看所有端点

  • 访问http://localhost:8080/actuator可以获得所有的HATEOAS端点

    在之前的版本中是/application,后来所有端点都被加入了/actuator端点下

  • 如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
{
"_links":{
"self":{
"href":"http://localhost:8080/actuator",
"templated":false
},
"auditevents":{
"href":"http://localhost:8080/actuator/auditevents",
"templated":false
},
"beans":{
"href":"http://localhost:8080/actuator/beans",
"templated":false
},
"caches-cache":{
"href":"http://localhost:8080/actuator/caches/{cache}",
"templated":true
},
"caches":{
"href":"http://localhost:8080/actuator/caches",
"templated":false
},
"health":{
"href":"http://localhost:8080/actuator/health",
"templated":false
},
"health-component":{
"href":"http://localhost:8080/actuator/health/{component}",
"templated":true
},
"health-component-instance":{
"href":"http://localhost:8080/actuator/health/{component}/{instance}",
"templated":true
},
"conditions":{
"href":"http://localhost:8080/actuator/conditions",
"templated":false
},
"configprops":{
"href":"http://localhost:8080/actuator/configprops",
"templated":false
},
"env":{
"href":"http://localhost:8080/actuator/env",
"templated":false
},
"env-toMatch":{
"href":"http://localhost:8080/actuator/env/{toMatch}",
"templated":true
},
"info":{
"href":"http://localhost:8080/actuator/info",
"templated":false
},
"loggers-name":{
"href":"http://localhost:8080/actuator/loggers/{name}",
"templated":true
},
"loggers":{
"href":"http://localhost:8080/actuator/loggers",
"templated":false
},
"heapdump":{
"href":"http://localhost:8080/actuator/heapdump",
"templated":false
},
"threaddump":{
"href":"http://localhost:8080/actuator/threaddump",
"templated":false
},
"metrics":{
"href":"http://localhost:8080/actuator/metrics",
"templated":false
},
"metrics-requiredMetricName":{
"href":"http://localhost:8080/actuator/metrics/{requiredMetricName}",
"templated":true
},
"scheduledtasks":{
"href":"http://localhost:8080/actuator/scheduledtasks",
"templated":false
},
"httptrace":{
"href":"http://localhost:8080/actuator/httptrace",
"templated":false
},
"mappings":{
"href":"http://localhost:8080/actuator/mappings",
"templated":false
}
}
}

2.应用配置类

  • /actuator/conditions:获取应用的自动化配置报告,其中包括所有自动化配置的候选项。同时还列出了每个候选项的各个先决条件是否满足,因此,该端点可以帮助我们很方便地找到一些自动化配置为什么没有生效。

    该属性在之前的版本中称为/autoconfig

  • /actuator/configprops:获取应用中配置的属性信息报告。

  • /actuator/beans:获取应用上下文中创建的所有Bean以及它们之间的相互关系。

  • /actuator/env:获取应用中的所有可用的环境属性报告,包括环境变量、JVM熟悉、应用配置属性、命令行中的参数……

  • /actuator/info:返回一些应用自定义的信息。默认情况只返回一个空的JSON串。我们可以在application.properties配置文件中通过info前缀来设置一些属性。

  • /actuator/mappings:返回所有Controller映射关系报告,包括beanmethod两个核心属性,bean标识了该映射关系的请求处理器,method标识了该映射关系的具体处理类和处理函数。

3.度量指标类

  • /actuator/metrics:返回当前应用的各类重要度量指标,如内存信息、线程信息、GC信息……

  • /actuator/threaddump:暴露程序运行中的线程信息

    即之前版本中的/dump

  • /actuator/heapdump:下载堆dump文件

  • /actuator/health:获取应用的各类健康指标,这些指标信息由HealthIndicator的实现类提供

    如:http://localhost:8080/health,返回如下JOSN

1
2
3
4
5
6
7
8
9
{
"status":"UP",
"diskSpace":{
"status":"UP",
"total":73400315904,
"free":4874935220,
"threshold":10485760
}
}
  • /actuator/httptrace:返回基本的HTTP跟踪信息,包括时间戳和HTTP header

    即之前版本中的/trace

4./shutdown:关闭应用程序

  • /shutdown:关闭应用程序,要求endpoints.shutdown.enabled = true

    表现异常,暂时未找到原因


【端点扩展】

实现方法:

  1. 扩展现有监控节点
  2. 自定义新的监控节点

1.扩展/actuator/info

  • /actuator/info用于暴露InfoContributor对象收集的全部Spring Boot应用自身信息。
  • 常见InfoContributor
名称描述
EnvironmentInfoContributor暴露Environment中key为info的所有key
GitInfoContributor如果存在git.properties文件,则暴露git信息
BuildInfoContributor如果存在META-INF/build-info.properties文件,则暴露构建信息
自定义InfoContributor实现InfoContributor接口的contribute()方法即可

EnvironmentInfoContributor为例,所有配置在application.yml文件中info字段下的Environment属性都会被自动暴露。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
info:
app:
encoding: UTF-8
java:
source: 1.8.0_31
target: 1.8.0_30

# 如果使用了Maven,还可以在服务构建时扩展/info,而不是写死
info:
app:
encoding: @project.build.sourceEncoding@
java:
source: @java.version@
target: @java.version@

自定义InfoContributor,暴露构建时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* @author dragonbaby308
* 引用InfoContributor,实现自定义/actuator/info端点的功能
* 不要忘记用@Component注解,将Bean扫入IoC容器
*/
@Component
public class CustomerBuildInfoContributor implements InfoContributor {
@Override
public void contribute(Info.Builder builder) {
//info端点 新增build/timestamp属性
builder.withDetail("build",
Collections.singletonMap("timestamp", new Date()));
}
}
  • 重新构建应用,浏览器输入http://localhost:8080/actuator/info,可以看到:
1
2
3
4
5
6
7
8
9
10
11
12
{
"app":{
"encoding":"UTF-8",
"java":{
"source":"1.8.0_31",
"target":"1.8.0_31"
}
},
"build":{
"timestamp":1527929903710
}
}

2.扩展/actuator/health

  • /actuator/health用于暴露HealthIndicator对象从ApplicationContext获取的正在运行的应用程序健康状态。
  • 常见HealthIndicator
名称描述
CassandraHealthIndicator检查Cassandra数据库是否启动
DiskSpaceHealthIndicator检查磁盘空间是否足够
DataSourceHealthIndicator检查是否可用获得DataSource连接
ElasticsearchHealthIndicator检查ES集群是否启动
InfluxDbHealthIndicator检查InfluxDB服务器是否启动
JmsHealthIndicator检查JMS代理是否启动
MailHealthIndicator检查邮件服务器是否启动
MongoHealthIndicator检查MongoDB是否启动
Neo4jHealthIndicator检查Neo4h服务器是否启动
RabbitHealthIndicator检查RabbitMQ服务器是否启动
RedisHealthIndicator检查Redis服务器是否启动
SolrHealthIndicator检查Solr服务器是否启动
自定义HealthIndicator实现HealthIndicatorhealth()方法
ReactiveHealthIndicator响应式版本,为获得应用程序的运行状态提供了非阻塞协议的实现方法

自定义HealthIndicator,明确服务状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* @author dragonbaby308
* 引用HealthIndicator,实现自定义/actuator/health端点的功能
* 不要忘记用@Component注解,将Bean扫入IoC容器
*/
@Component
public class CustomerHealthIndicator implements HealthIndicator {

private final static int TWO_HANDRED = 200;
private final static int THREE_HANDRED = 300;
@Override
public Health health() {
try{
//尝试与该URL建立连接
URL url = new URL("http://localhost:8888/configservice/default/");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
int statusCode = conn.getResponseCode(); //响应码
//响应码为2xx
if(statusCode >= TWO_HANDRED && statusCode < THREE_HANDRED) {
return Health.up().build();
}else{ //正常情况,应该返回这个,因为我压根没启动上述服务
return Health.down()
.withDetail("HTTP Status Code", statusCode)
.build();
}
}catch(IOException e){
return Health.down(e).build();
}
}
}
  • 访问localhost:8080/actuator/health,可以看到{"status":"DOWN"}

3.扩展/actuator/metrics

  • /actuator/metrics提供一个Metrics端点,用于实现生产级的度量工具。其指标包括系统内存总量、空闲内存数量、处理器数量、系统正常运行时间、堆信息
  • /actuator/metrics指标:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"names":[
"jvm.buffer.memory.used",
"jvm.memory.used",
"jvm.buffer.count",
"logback.events",
"process.uptime",
"jvm.memory.committed",
"jvm.buffer.total.capacity",
"jvm.memory.max",
"process.starttime",
"counter.span.dropped",
"counter.span.accepted"
]
}
  • 如果想了解某项指标的详细信息,在/actuator/metrics端点后加上述指标的名称即可。如/actuator/metrics/jvm.memory.used
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
"name":"jvm.memory.used",
"description":"The amount of used memory",
"baseUnit":"bytes",
"measurements":[
{
"statistic":"VALUE",
"value":80703808
}
],
"availableTags":[
{
"tag":"area",
"values":[
"heap",
"nonheap"
]
},
{
"tag":"id",
"values":[
"G1 Old Gen",
"CodeHeap 'non-profiled nmethods'",
"G1 Survivor Space",
"Compressed Class Space",
"Metaspace",
"G1 Eden Space",
"CodeHeap 'non-nmethods'"
]
}
]
}
  • Metrics指标体系都包含gaugecounter这两种级别的度量指标,其中gauge记录一个单一值,而counter记录一个变多或变少的增量。通过将CounterServiceGaugeService注入业务代码中,可用记录自己的度量指标,其中CounterService暴露increment()decrement()reset()方法,而GuageService则提供一个submit()方法。如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//表现异常
@Service
public class MyService {
private final CounterService conterService;

@Autowired
public MyService(CounterService counterService) {
this.counterService = counterService;
}

public void exampleMethod() {
this.conterService.increment(
"services.system.myservice.invoked");
}
}

访问application/metrics/services.system.myservice.invoked即可看到如下随着服务调用不断递增的度量信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"name":"services.system.myservice.invoked",
"measurements":[
{
"statistic":"Count",
"value":1
},
{
"statistic":"Total",
"value":1
}
],
"availableTags":[]
}

4.自定义监控端点

变现异常。

  • 继承AbstractEndpoint类,通过系统环境变量获取所需的监控信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@ConfigurationPropertes(prefix="endpoints.mypc")
public class MyPCEndpoint extends AbstractEndpoint<Map<String, Object>> {
public MyPCEndpoint() {
super("mypc");
}

@Override
public Map<String, Object> invoke(){
Map<String, Object> result = new HashMap<>();
Map<String, String> map = System.getenv();
result.put("username", map.get("USERNAME"));
result.put("computername", map.get("COMPUTERNAME"));
return result;
}
}

//将自定义的端点,加入配置中
@Configuration
public class EndPointAutoConfig {
@Bean
public EndPoint<Map<String, Object>> myPCEndPoint(){
return new MyPCEndpoint();
}
}
  • 重启应用后访问http://localhost:8080/mypc
1
2
3
4
{
"username": "db3",
"userdomain": "DESKTOP-CAFEBABE"
}
-------------本文结束感谢您的阅读-------------

本文标题:Spring Boot Actuator :系统监控组件

文章作者:DragonBaby308

发布时间:2019年09月27日 - 19:23

最后更新:2019年10月14日 - 19:36

原始链接:http://www.dragonbaby308.com/Spring-Boot-Actuator/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%