springboot整合Micrometer实现自定义埋点监控

发布时间 2023-04-09 16:17:54作者: 柯南。道尔

springboot整合Micrometer实现自定义埋点监控

Actuator概述

spring-boot-starter-actuator是SpringBoot中的一个组件,用于监控SpringBoot中的应用,监控的指标有内存信息,线程信息,垃圾回收信息等等。SpringBoot2.x系列依赖的actuator中集成的度量统计API使用的框架就是Micrometer

Micrometer概述

Micrometer(千分尺),为流行的监控系统提供简易的测量客户端。数据记录在Micrometer中的目的是用来观测、告警以及反应当前环境的运行状态

MeterRegistry(指标注册表)

Meter(指标)是用于收集应用程序的一组测量值,Meter(指标)在Micrometer中有单独指标接口类型为Meter。Mircrometer中的Meter是从MeterRegistry(指标注册表)中创建的

常见的指标注册表:
内存注册表(SimpleMeterRegistry):在内存中保存每一个Meter(指标)的最新值,并且不会将数据导出到任何地方!!!(需要导出数据给监控系统的不要使用此注册表)
组合注册表(CompositeMeterRegistry):可以添加多个注册表,用于将各个注册表组合起来,可以同时将指标发布到多个监控系统
普罗米修斯注册表(PrometheusMeterRegistry):当使用普罗米修斯监控时,引入micrometer-registry-prometheus依赖时会提供此种收集器,用于将指标数据转换为普罗米修斯识别的格式和导出数据等功能

Meter(指标)

监控数据的整个过程都是围绕着Meter(指标),通过一个一个的Meter(指标)数据来进行观察应用的状态

常用的指标类型

  • Counter(计数器):单一计数指标,允许按固定数量递增,用来统计无上限数据
  • Gauge(仪表盘):用于统计有上限可增可减的数据。
  • Timer(计时器):用于测量短时延迟和事件频率

指标的命名

在Micrometer中,Meter的命名约定使用英语逗号分隔(".")。但对于不同监控系统,各自的命名规范有所不同,因此指标的命名会通过底层的接口(NamingConvention)进行转换,默认是蛇形命名,如果想要适配不同的监控系统,可以自定义注册表(MeterRegistry)中的命名转换

Tag(标签)

Mircrometer通过Tag(标签)实现了多维度的度量数据收集,通过Tag的命名可以推断出其指向的数据代表什么维度或是什么类型的度量指标(Meter)

private final Counter requestCounter = Metrics.counter("test.request.total", "task", "num1");

test.request.total 表示指标名
task与num1 表示一个标签,task是 tag key ,num1 是tag value,表示任务类型中num1任务的指标数据

windows环境下部署Micrometer+prometheus+grafana实现对java应用自定义埋点指标数据监控

prometheus server的下载与安装

官方下载地址:https://prometheus.io/download/

下载的是长期支持版本:prometheus-2.37.6.windows-amd64.zip

将下载完的压缩包解压后,启动prometheus.exe就可以运行服务了,prometheus.yml是配置文件

grafana的下载与安装

官方下载地址:https://grafana.com/grafana/download?pg=get&plcmt=selfmanaged-box1-cta1&platform=windows

下载的是压缩包版本:grafana-enterprise-9.4.3.windows-amd64.zip

将下载完的压缩包解压后,启动bin路径下的grafana-server.exe就可以运行服务了

创建springboot项目自定义埋点

引入依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.7.9</version>
        </dependency>
        <!--注解依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
            <version>1.18.26</version>
        </dependency>
        <!--测试依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <version>2.7.9</version>
        </dependency>
        <!--监控埋点依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.7.9</version>
        </dependency>
        <!--用于导出prometheus系统类型的指标数据-->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
            <version>1.9.8</version>
        </dependency>
    </dependencies>

相关代码

业务层
import io.micrometer.core.instrument.*;
import org.springframework.stereotype.Service;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author Administrator
 */
@Service
public class MonitorTestService {
    private final AtomicInteger userGauge1 = Metrics.gauge("test.thread.pool.s1.size", new AtomicInteger(0));

    private final AtomicInteger userGauge2 = Metrics.gauge("test.thread.pool.s2.size", new AtomicInteger(0));

    private final Counter requestCounter = Metrics.counter("test.request.total", "task", "s1");

    public AtomicInteger getGauge1() {
        return userGauge1;
    }

    public AtomicInteger getGauge2() {
        return userGauge2;
    }

    public Counter getRequestCounter() {
        return requestCounter;
    }
}
控制层
import com.shen.monitortest.modules.service.MonitorTestService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;


/**
 * @author Administrator
 */
@Slf4j
@RestController
@RequestMapping("/monitor")
public class MonitorTestController {
    @Resource
    private MonitorTestService monitor;

    @RequestMapping("/request")
    public String requestMonitor() {
        monitor.getGauge1().set(10);
        monitor.getGauge2().set(11);
        monitor.getRequestCounter().increment();
        log.info("{}", monitor.getGauge1());
        log.info("{}", monitor.getGauge2());
        log.info("{}", monitor.getRequestCounter());
        return "ok";
    }
}

参数配置

server:
  #服务运行端口
  port: 9091
management:
  endpoints:
    web:
      exposure:
        #开发页面中的所有端口(endpoint)
        include: '*'
      #访问的页面 ip+port/monitor  默认是/actuator
      base-path: /monitor
  server:
    #监听端口
    port: 7000

启动服务

启动springboot服务,访问页面http://localhost:7000/monitor/prometheus

可以看到prometheus类型的自定义的指标,除了自定义的指标spring-boot-starter-actuator还监控了一些java的基本状态如内容,线程数等等

通过静态配置prometheus,使prometheus拉取指标数据

进入prometheus路径下,修改配置文件prometheus.yml,添加springboot监控指标数据路径

保存配置文件并启动prometheus服务,访问页面http://localhost:9090/

菜单栏选择Status->Targets,可以看到prometheus与springboot-demo都在线

点击springboot-demo的Endpoint就可以看到拉取到的指标数据

grafana订阅prometheus数据源,创建仪表板实现数据可视化

配置数据源

进入grafana的bin路径下,执行grafana-server.exe

访问页面http://localhost:3000/

默认账号密码是admin

添加prometheus数据源,配置prometheus服务的url http://localhost:9090

导入仪表板模版,实现基本数据的可视化

访问grafana仪表板页面:https://grafana.com/grafana/dashboards/

搜索JVM (Micrometer),下载仪表板的json文件

下载得到JSON文件jvm-micrometer_rev9.json,回到grafana页面导入json,选择之前新建的数据源

导入之后就可以查看到从springboot拉取到的基本数据的可视化

新建仪表板(dashboard),新建画布(panel),实现自定义指标数据的可视化

新建一个仪表板和一个画布,新增对指标名为test.thread.pool.s1.size、test.thread.pool.s2.size的两个查询

编辑完后保存,由于两个指标一开始默认为0,如果想要看到变化就需要执行url请求来改变其数值

向springboot服务发送http://localhost:9091/monitor/request请求

此时再查看画布(pannel)会发现两个指标数值发生了变化

参考网址

Micrometer官方网址:https://micrometer.io/

Prometheus官方文档网址:https://prometheus.io/docs/introduction/overview/

Grafana官方文档网址:https://grafana.com/docs/grafana/latest/

https://www.jianshu.com/p/082571330190/

https://blog.51cto.com/u_13962087/5911953