第八课 SpringBoot2基础-指标监控
第八课 SpringBoot2基础-指标监控
tags:
- Spring Boot
- 2021尚硅谷
- 雷丰阳
文章目录
- 第八课 SpringBoot2基础-指标监控
- 第一节 SpringBoot Actuator简介
- 第二节 Actuator端点
- 2.1 最常使用的端点介绍
- 2.2 Health Endpoint
- 2.3 Metrics Endpoint
- 2.4 管理Endpoints
- 第三节 定制 Endpoint
- 3.1 定制 Health 信息
- 3.2 定制info信息
- 3.3 定制Metrics信息
- 3.4 定制Endpoint
- 第四节 可视化界面
第一节 SpringBoot Actuator简介
- 未来每一个微服务在云上部署以后,我们都需要对其进行监控、追踪、审计、控制等。SpringBoot就抽取了Actuator场景,使得我们每个微服务快速引用即可获得生产级别的应用监控、审计等功能。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- SpringBoot Actuator1.x与2.x有所不同
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RQsW2BDg-1635868831335)(.\printscreen\8.1.png)] - 看下依赖包, 发现micrometer这个包。是用来我们自定义监控指标的包。
- 使用方法:
- 引入场景
- http://localhost:8080/actuator/**
- 暴露所有监控信息为HTTP
management:
endpoints:
enabled-by-default: true #暴露所有端点信息
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
第二节 Actuator端点
2.1 最常使用的端点介绍
- 官网:https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.endpoints
- 最常使用的端点
| ID | 描述 |
| ---- | ---- |
|auditevents | 暴露当前应用程序的审核事件信息。需要一个AuditEventRepository组件。|
|beans |显示应用程序中所有Spring Bean的完整列表。|
|caches| 暴露可用的缓存。|
|conditions |显示自动配置的所有条件信息,包括匹配或不匹配的原因。|
|configprops| 显示所有@ConfigurationProperties。|
|env |暴露Spring的属性ConfigurableEnvironment|
|flyway |显示已应用的所有Flyway数据库迁移。需要一个或多个Flyway组件。|
|health |显示应用程序运行状况信息。|
|httptrace |显示HTTP跟踪信息(默认情况下,最近100个HTTP请求-响应)。需要一个HttpTraceRepository组件。|
|info |显示应用程序信息。|
|integrationgraph |显示Spring integrationgraph 。需要依赖spring-integration-core。|
|loggers| 显示和修改应用程序中日志的配置。|
|liquibase |显示已应用的所有Liquibase数据库迁移。需要一个或多个Liquibase组件。|
|metrics |显示当前应用程序的“指标”信息。|
|mappings |显示所有@RequestMapping路径列表。|
|scheduledtasks |显示应用程序中的计划任务。|
|sessions |允许从Spring Session支持的会话存储中检索和删除用户会话。需要使用Spring Session的基于Servlet的Web应用程序。|
|shutdown |使应用程序正常关闭。默认禁用。|
|startup |显示由ApplicationStartup收集的启动步骤数据。需要使用SpringApplication进行配置BufferingApplicationStartup。|
|threaddump |执行线程转储。| - 如果您的应用程序是Web应用程序(Spring MVC,Spring WebFlux或Jersey),则可以使用以下附加端点:
| ID | 描述 |
| ---- | ---- |
|heapdump |返回hprof堆转储文件。|
|jolokia |通过HTTP暴露JMX bean(需要引入Jolokia,不适用于WebFlux)。需要引入依赖jolokia-core。|
|logfile| 返回日志文件的内容(如果已设置logging.file.name或logging.file.path属性)。支持使用HTTPRange标头来检索部分日志文件的内容。|
|prometheus |以Prometheus服务器可以抓取的格式公开指标。需要依赖micrometer-registry-prometheus。| - 最常用的Endpoint
- Health:监控状况
- Metrics:运行时指标
- Loggers:日志记录
2.2 Health Endpoint
- 健康检查端点,我们一般用于在云平台,平台会定时的检查应用的健康状况,我们就需要Health Endpoint可以为平台返回当前应用的一系列组件健康状况的集合。
- 重要的几点:
- health endpoint返回的结果,应该是一系列健康检查后的一个汇总报告很多的健康检查默认已经自动配置好了,比如:数据库、redis等可以很容易的添加自定义的健康检查机制。
management:
endpoints: # 配置所有端点的默认行为
enabled-by-default: true # 默认开启所有的监控端点
web:
exposure:
include: '*' #以web方式暴露所有端点
endpoint: # 具体配置某个端点的默认行为
health:
show-details: always
- 查看:http://localhost:8080/actuator/health
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cGeVZWHf-1635868831338)(.\printscreen\8.2.png)]
2.3 Metrics Endpoint
- 提供详细的、层级的、空间指标信息,这些信息可以被pull(主动推送)或者push(被动获取)方式得到;
- 通过Metrics对接多种专业的监控系统比如:promethues
- 简化核心Metrics开发
- 添加自定义Metrics或者扩展已有Metrics.(业务埋点)
- http://localhost:8080/actuator/metrics 如果想看具体信息,需要发二次请求。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3XXI4Wsk-1635868831340)(.\printscreen\8.3.png)]
2.4 管理Endpoints
- 开启与禁用Endpoints
- 默认所有的Endpoint除过shutdown都是开启的。
- 需要开启或者禁用某个Endpoint。配置模式为
management.endpoint.<endpointName>.enabled = true
- 或者禁用所有的Endpoint然后手动开启指定的Endpoint
management:
endpoints: # 配置所有端点的默认行为
enabled-by-default: false # 默认开启所有的监控端点 这里禁用掉了
web:
exposure:
include: '*' #以web方式暴露所有端点
endpoint: # 具体配置某个端点的默认行为
health:
show-details: always
info:
enabled: true
beans:
enabled: true
metrics:
enabled: true
第三节 定制 Endpoint
3.1 定制 Health 信息
- 如果有定制化的组件,需要监控健康信息。可以参考DiskSpaceHealthIndicator的写法。使用抽象类。
package com.atguigu.health;
import org.springframework.boot.actuate.health.AbstractHealthIndicator;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.Status;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class MyComHealthIndicator extends AbstractHealthIndicator {
/**
* 真实的检查方法
* @param builder
* @throws Exception
*/
@Override
protected void doHealthCheck(Health.Builder builder) throws Exception {
// mongodb 获取链接进行测试
Map<String, Object> map = new HashMap<>();
if (1 == 1){
// 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("timeout", 3000);
}
builder.withDetail("code", 100)
.withDetails(map);
}
}
- http://localhost:8080/actuator/health
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4VbfFBHg-1635868831342)(.\printscreen\8.4.png)] - 还可以实现接口。
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();
3.2 定制info信息
- 第一种方法:编写配置文件
info:
appName: boot-admin
version: 2.0.1
mavenProjectName: @project.artifactId@ #使用@@可以获取maven的pom文件值
mavenProjectVersion: @project.version@
- 第二种方法:编写InfoContributor
package com.atguigu.acutuator.info;
import java.util.Collections;
import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.stereotype.Component;
@Component
public class AppInfoInfoContributor implements InfoContributor {
@Override
public void contribute(Info.Builder builder) {
builder.withDetail("msg", "你好")
.withDetail("hello", "niupi")
.withDetails(Collections.singletonMap("key", "value"));
}
}
- 如果同时用上面方法,返回的是合并后的info.
- http://localhost:8080/actuator/info
3.3 定制Metrics信息
- SpringBoot支持自动适配的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
- JVM metrics, report utilization of:
- 增加定制Metrics。比如实现某个接口调用次数指标的获取。
package com.atguigu.service.impl;
import com.atguigu.bean.City;
import com.atguigu.mapper.CityMapper;
import com.atguigu.service.CityService;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class CityServiceImpl implements CityService {
@Autowired
CityMapper cityMapper;
Counter counter;
// 构造器注入方式
public CityServiceImpl(MeterRegistry meterRegistry){
// 把指标cityService.saveCity.count注册进来
Counter counter = meterRegistry.counter("cityService.saveCity.count");
}
public City getById(Long id){
return cityMapper.getById(id);
}
public void saveCity(City city){
// 计数
counter.increment();
cityMapper.insert(city);
}
}
- http://localhost:8080/actuator/metrics
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KShyiupw-1635868831343)(.\printscreen\8.5.png)] - http://localhost:8080/actuator/metrics/cityService.saveCity.count
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LBwQCSRL-1635868831346)(.\printscreen\8.6.png)] - 也可以使用下面方法定制Metrics。
//也可以使用下面的方式
@Bean
MeterBinder queueSize(Queue queue) {
return (registry) -> Gauge.builder("queueSize", queue::size).register(registry);
}
3.4 定制Endpoint
package com.atguigu.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 {
// 这个注解代表端点的读信息 http://localhost:8080/actuator/myservice
@ReadOperation
public Map getDockerInfo(){
return Collections.singletonMap("info","docker started...");
}
// 这个注解代表端点的写操作
@WriteOperation
private void restartDocker(){
System.out.println("docker restarted....");
}
}
- 场景:开发ReadinessEndpoint来管理程序是否就绪,或者LivenessEndpoint来管理程序是否存活;
- 当然,这个也可以直接使用 https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-kubernetes-probes
第四节 可视化界面
- https://github.com/codecentric/spring-boot-admin
- 按照说明搭建一个spring-boot-admin可视化服务器。
- 代码中配置服务端依赖。
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.3.1</version>
</dependency>
- 代码中配置服务端
boot:
admin:
client:
url: http://127.0.0.1:8888
instance:
prefer-ip: true # 修改监控中注册的域名为ip
application:
name: boot-05-web-admin # 修改监控中注册的应用名
- 先运行服务端,在运行客户端。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l768KcUx-1635868831349)(.\printscreen\8.7.png)]