写点什么

SpringBoot2--- 指标监控,Java 架构师之路

发布于: 2 小时前
web:
exposure:
include: '*' #以web方式暴露
复制代码





**测试**
复制代码


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


。。。。。。





* * *


[](
)2、Actuator Endpoint
==================================================================================


[](
)1、最常使用的端点
------------------------------------------------------------------------


![在这里插入图片描述](https://static001.geekbang.org/infoq/a7/a73f13f6e076ade65dd3479b8f84b3f1.png)
![在这里插入图片描述](https://static001.geekbang.org/infoq/5d/5d14c201f314cca4925e26202511447a.png)
![在这里插入图片描述](https://static001.geekbang.org/infoq/1b/1bf8c988e1f717edb37504f958de707c.png)


### [](
)最常用的Endpoint


**Health:监控状况**


**Metrics:运行时指标**


**Loggers:日志记录**


* * *


[](
)2、Health Endpoint
--------------------------------------------------------------------------------


**健康检查端点,我们一般用于在云平台,平台会定时的检查应用的健康状况,我们就需要Health Endpoint可以为平台返回当前应用的一系列组件健康状况的集合。**


开启health的显示详细endpoint.health.show-details=always


**重要的几点:**


* health endpoint返回的结果,应该是一系列健康检查后的一个汇总报告 (有任何一个应用是宕机状态,整个就是宕机状态)
* 很多的健康检查默认已经自动配置好了,比如:数据库、redis等
* 可以很容易的添加自定义的健康检查机制
![在这里插入图片描述](https://static001.geekbang.org/infoq/ab/aba7463b423226db2115c1119315d3bb.png)


* * *


[](
)3、Metrics Endpoint
---------------------------------------------------------------------------------


**提供详细的、层级的、空间指标信息,这些信息可以被pull(主动推送)或者push(被动获取)方式得到;**


* 通过Metrics对接多种监控系统
* 简化核心Metrics开发
* 添加自定义Metrics或者扩展已有Metrics


![在这里插入图片描述](https://static001.geekbang.org/infoq/87/87c8a4d83d8a5e816fc180ea8fe7c2b2.png)


* * *


[](
)4、管理Endpoints
----------------------------------------------------------------------------


### [](
)1、开启与禁用Endpoints


* 默认所有的Endpoint除过shutdown都是开启的。
* 需要开启或者禁用某个Endpoint。配置模式为 management.endpoint..enabled = true
复制代码


management:


endpoint:


beans:
enabled: true
复制代码





* 或者禁用所有的Endpoint然后手动开启指定的Endpoint (management.endpoints.enabled-by-default默认是true)
复制代码


management:


endpoints:


enabled-by-default: false
复制代码


endpoint:


beans:
enabled: true
health:
enabled: true
复制代码





* * *


[](
)2、暴露Endpoints (监控端点)
===================================================================================


**支持的暴露方式**


**HTTP:默认只暴露health和info Endpoint**


**JMX:默认暴露所有Endpoint (例如Jconsole)**


**除过health和info,剩下的Endpoint都应该进行保护访问。如果引入SpringSecurity,则会默认配置安全访问规则**


![在这里插入图片描述](https://static001.geekbang.org/infoq/f2/f2921d7b1377b6f0c2be8e1d0dbbee37.png)
![在这里插入图片描述](https://static001.geekbang.org/infoq/0c/0c8faf2c4bf7e42ab44d731e926b5ccc.png)


* * *


[](
)定制 Endpoint
==========================================================================


[](
)1、定制一个组件的Health信息(自定义的Health类名必须叫xxxHealthIndicator.xxx则是组件名字)
-----------------------------------------------------------------------------------------------------------------------------


### [](
)这里定制监控端点有两种方式,一种是实现HealthIndicator 接口,一种是继承 AbstractHealthIndicator抽象类


* * *


### [](
)方法一: 继承接口
复制代码


import org.springframework.boot.actuate.health.Health;


import org.springframework.boot.actuate.health.HealthIndicator;


import org.springframework.stereotype.Component;


@Component


public class MyHealthIndicator implements HealthIndicator {


@Override
public Health health() {
int errorCode = check(); // perform some specific health check
if (errorCode != 0) {
return Health.down().withDetail("Error Code", errorCode).build();
}
return Health.up().build();
}
复制代码


}


构建 Health


Health build = Health.down()


            .withDetail("msg", "error service")
.withDetail("code", "500")
.withException(new RuntimeException())
.build();
复制代码



management:
health:
enabled: true
show-details: always #总是显示详细信息。可显示每个模块的状态信息 ```


* * *


### [](
)方法二:实现抽象类```
@Component
public class MyConHealthIndicator extends AbstractHealthIndicator {
//这里可以通过获取容器中某个我们要监测的组件,判断其健康情况,来决定是up还是down
/**
* 真实的检查方法
*
* @param builder
* @throws Exception
*/
@Override
protected void doHealthCheck(Health.Builder builder) throws Exception {
//mongodb。 获取连接进行测试
Map<String, Object> map = new HashMap<>();
// 检查完成
if (1 == 2) {
// builder.up(); //健康
builder.status(Status.UP);
map.put("count", 1);
map.put("ms", 100);
} else {
// builder.down();
builder.status(Status.OUT_OF_SERVICE);
map.put("err", "连接超时");
map.put("ms", 3000);
}
builder.withDetail("code", 100)
.withDetails(map);
}
} ```


![在这里插入图片描述](https://static001.geekbang.org/infoq/1b/1bed573316a84d1b62e3e76b06634c5c.png)


* * *


### [](
)设置为总是显示详细信息```
management:
endpoints:
enabled-by-default: true #暴露所有端点信息
web:
exposure:
include: '*' #以web方式暴露


endpoint:
health:
show-details: always #总是显示详细信息。可显示每个模块的状态信息 ```


![在这里插入图片描述](https://static001.geekbang.org/infoq/2f/2f838575a64f1df05467c009d0234e24.png)


* * *


[](
)2、定制info信息—用于展示当前应用详细信息
--------------------------------------------------------------------------------------


#### [](
)方式一: 编写配置文件```
management:
endpoints:
enabled-by-default: true #暴露所有端点信息
web:
exposure:
include: '*' #以web方式暴露


endpoint:
health:
show-details: always #总是显示详细信息。可显示每个模块的状态信息
info:
appName: boot-admin
version: 2.0.1
mavenProjectName: @project.artifactId@ #使用@@可以获取maven的pom文件值
mavenProjectVersion: @project.version@ ```


#### [](
)方式二: 编写InfoContributor```
@Component
public class ExampleInfoContributor implements InfoContributor {


@Override
public void contribute(Info.Builder builder) {
builder.withDetail("example",
Collections.singletonMap("key", "value"));
}
} ```


![在这里插入图片描述](https://static001.geekbang.org/infoq/48/48a3fe7265b896a84f89dd8828288e4c.png)
**会输出以上方式返回的所有info信息,即配置文件和代码迭代的所有info信息**


* * *


[](
)3、定制Metrics信息 (运行时指标)
------------------------------------------------------------------------------------


### [](
)1、SpringBoot支持自动适配的Metrics


![在这里插入图片描述](https://static001.geekbang.org/infoq/1a/1a72f01aba142848459dfcc897562d92.png)


* * *


[](
)2.增加定制Metrics
----------------------------------------------------------------------------```
@RestController
public class TestController
{
Counter counter;
public TestController(MeterRegistry meterRegistry){
counter = meterRegistry.counter("myservice.method.running.counter");
}
@GetMapping("/test")
public String test()
{
//该请求每发一次,就会增加一次记录数,来记录当前请求被调用的次数
counter.increment();
return "hhhhh";
}
}


//也可以使用下面的方式
@Bean
MeterBinder queueSize(Queue queue) {
return (registry) -> Gauge.builder("queueSize", queue::size).register(registry);

# **最后**
**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://ali1024.coding.net/public/P7/Java/git)**
![image.png](https://static001.geekbang.org/infoq/54/545ac16dd7a5b0c407683c9933f8f36f.png)
复制代码


用户头像

VX:vip204888 领取资料 2021.07.29 加入

还未添加个人简介

评论

发布
暂无评论
SpringBoot2---指标监控,Java架构师之路