1、大致思路
集成Prometheus,必须要实现以下两点。
一、A客户端想要集成Prometheus,那A客户端就必须暴露一个能够供外部正常访问的接口,并将接口定义在Prometheus的配置文件中,由Prometheus Service去定时向这个接口发起请求,拉取(pull)数据。
二、只有符合Prometheus要求的数据规格,Prometheus Service才会将数据保存到内置的时序数据库中。
2、Spring Boot Actuator简单说明
首先,springboot自带的Actuator就具有健康检查(Health)、度量信息(Metrics)、环境信息等功能,只需要暴露指定端点就可以访问上述功能。
常见的 Actuator 端点:
/actuator/health:健康检查端点
/actuator/env:环境信息端点
/actuator/info:应用程序信息端点
/actuator/prometheus:暴露给 Prometheus 的监控数据端点(需要集成 Micrometer)
3、引入maven依赖
除了必须要引入Spring-Actuator的依赖包以外,还必须要引入一个第三方依赖
Spring官网给出的解释
Spring虽然对外提供了给Prometheus拉取数据用的端点,但是,还必须要把Spring收集到的数据转化成Prometheus可以拉取的数据规格(数据格式)。因此,就需要用上“**micrometer-registry-prometheus**”这个第三方依赖来将数据进行格式化。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.17</version> </parent> <dependencies> <!-- Spring Boot Web的启动器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- spring的Actuator--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--这个依赖可以实现将actuator的数据转换成Prometheus可以识别的数据类型--> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency> </dependencies>
4、定义配置文件
4.1 application.yml文件
# 定义项目的名称 application: name: UMR-Spring-Boot-Env # 项目启动使用的环境 profiles: active: dev
4.2 application-dev.yml文件
server: #项目启动的端口号 port: 9180 spring: config: import: - application-common.yml
4.3 application-common.yml文件(核心文件)
management: #默认和请求接口的端口一致,这里指定一个新的端口号,防止被人猜到 server: port: 8686 endpoints: web: #对外暴露actuator的哪些监控数据,注意单词不要写错了,写错了外部是无法访问接口的 exposure: include: - health - prometheus endpoint: # 启用之后,才能够正常调用 /actuator/prometheus 接口 prometheus: enabled: true #健康检查 health: #总是展示健康检查的详细信息 show-details: always metrics: tags: #应用程序名称,这个配置建议加上,Grafana官方提供的面板配置很多用了这个label application: ${spring.application.name} # 配置完成之后,启动项目 # 就可以正常访问 /actuator/health接口 或者 /actuator/prometheus ,因为目前只暴露了这两个接口
5、 定义测试接口
这里就不占用过多篇幅去写启动类以及Service层的代码,并且更严谨的方式是**定义一个切面来进行监控埋点**,这里只是简单的Demo
import com.tedu.main.core.api.dto.Result;
import com.tedu.main.core.api.dto.StudentInfoRequestDTO;
import com.tedu.main.core.service.StuService;
import io.micrometer.core.instrument.Metrics;
import io.micrometer.core.instrument.Tags;
import org.springframework.web.bind.annotation.*;
import java.util.concurrent.TimeUnit;
@RestController
public class RegistryController {
private final StuService service;
public RegistryController(StuService service) {
this.service = service;
}
@PostMapping("/registryStu")
public Result registryStu(@RequestBody StudentInfoRequestDTO dto) {
long startTime = System.currentTimeMillis();
long end;
String code;
try {
service.registry();
end = System.currentTimeMillis();
code = "S00000";
} catch (Exception e) {
end = System.currentTimeMillis();
code = "B12345";
}
// counter() 方法增加一个计数器指标(Metrics),记录请求接口的次数
// UMR_RegistryStu_Request_Count 是指标名称
// Tags.of() 定义的是标签内容
Metrics.counter("UMR_RegistryStu_Request_Count",
Tags.of("method", "/registryStu")
.and("currentLoginUser", dto.getStuName())
.and("code", code)
).increment();
long totalTime = end - startTime;
// UMR_RegistryStu_Request_Time 是指标名称
Metrics.timer("UMR_RegistryStu_Request_Time",
Tags.of("function", "registryStu")
.and("currentLoginUser", dto.getStuName()))
.record(totalTime, TimeUnit.MILLISECONDS);
return new Result(dto.getStuName(), code, null);
}
@PostMapping("/hello")
public String hello(StudentInfoRequestDTO dto) {
// UMR_RegistryStu_Request_Count 是指标名称
Metrics.counter("UMR_RegistryStu_Request_Count",
Tags.of("method", "hello-API")
.and("currentLoginUser", dto.getStuName())
.and("code", "S000")
).increment();
return "hello world";
}
}
6、 通过Postman请求
注意,获取采集数据的请求端口号是8686,并不是请求接口的9180端口
对_count数据继续说明
UMR_RegistryStu_Request_Time_seconds_count{application="UMR-Spring-Boot-Env",currentLoginUser="李四",function="registryStu",} 6.0
UMR_RegistryStu_Request_Time_seconds_count 是指标名称。
"UMR_RegistryStu_Request_Time"这块是我们自定义的,"_seconds_count"是引入的第三方组件组件帮我们生成的,"_count"结尾表示的是请求总数。
{ }括号里的是标签,除了application的值是从配置文件中获取的,其他的标签内容全是在代码中定义的。
6.0 是表示请求registryStu接口,“李四”用户总共访问了6次。(包含错误和失败)
对_sum数据进行说明
UMR_RegistryStu_Request_Time_seconds_sum{application="UMR-Spring-Boot-Env",currentLoginUser="李四",function="registryStu",} 14.113
"_sum"表示的是请求总的响应时间,6次请求总耗时14.113秒
对_max进行说明
UMR_RegistryStu_Request_Time_seconds_max{application="UMR-Spring-Boot-Env",currentLoginUser="李四",function="registryStu",} 5.013
"_max"表示某次请求最大的一次耗时5.013秒
对_total数据进行说明
李四请求了6次,其中5次请求返回的状态码是"S00000",1次请求返回的状态码是"B12345"
TYPE UMR_RegistryStu_Request_Count_total counter
UMR_RegistryStu_Request_Count_total{application="UMR-Spring-Boot-Env",code="S00000",currentLoginUser="李四",method="/registryStu",} 5.0
UMR_RegistryStu_Request_Count_total{application="UMR-Spring-Boot-Env",code="B12345",currentLoginUser="李四",method="/registryStu",} 1.0
7、Prometheus服务发现
使用静态配置,将Actuator暴露的采集接口/actuator/prometheus,更新到prometheus.yml配置文件中
移动到Prometheus安装目录,启动Prometheus
Windows:执行prometheus.exe文件
Linux系统:./prometheus --config.file=prometheus.yml
Prometheus默认的启动端口是9090,可以通过命令修改默认启动端口
8、查看Prometheus控制台
也可以通过在Graph搜索定义的指标名称,查看具体情况
组件自带的部分监控指标
http_server_requests_seconds_count:请求数
http_server_requests_seconds_max :http请求数峰值
版权归原作者 _UMR_ 所有, 如有侵权,请联系我们删除。