Spring actuator 集成 Prometheus

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,可以通过命令修改默认启动端口

请求地址:http://localhost:9090/

8、查看Prometheus控制台

也可以通过在Graph搜索定义的指标名称,查看具体情况 

组件自带的部分监控指标

http_server_requests_seconds_count:请求数
http_server_requests_seconds_max :http请求数峰值 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值