侧边栏壁纸
博主头像
憨憨大头个人博客博主等级

心存希冀,目有繁星

  • 累计撰写 110 篇文章
  • 累计创建 13 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Prometheus实现监控Spring Boot工程

Administrator
2024-09-03 / 0 评论 / 0 点赞 / 34 阅读 / 16108 字

在这篇分享如何在业务系统中使用Prometheus来监控业务系统指标,业务系统使用Spring Boot构建

在本示例中我们会使用Prometheus监控Spring Boot的各种指标,比如

  • http平均耗时

  • 当前 tomcat 连接数

  • tomcat 最大连接数

  • jvm相关指标

  • http 请求数

  • 系统运行时间

并在Grafana 进行展现,效果如下

image-20240708152729674

关键技术介绍

我们会在spring boot 工程中引入micrometer-registry-prometheusspring-boot-starter-actuator来实现指标的暴露,下面对这两个组件进行一个介绍

micrometer-registry-prometheus

Micrometer它是Java生态中一个组件,可以把它理解为metric界的SLF4J。

Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API,它提供了多种度量指标类型(Timers、Guauges、Counters等),同时支持接入不同的监控系统,例如 Influxdb、Graphite、Prometheus 等。这里我们使用micrometer-registry-prometheus针对prometheus的实现。

spring-boot-starter-actuator

Spring Boot Actuator是Spring Boot提供用于对应用系统进行自省和监控的功能模块,基于此开发人员可以方便地对应用系统某些监控指标进行查看、统计、审计、指标收集等。Actuator提供了基于Http端点或JMX来管理和监视应用程序。

系统配置

Spring Boot 工程配置

1. 添加 maven 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

2. 在application.properties,开启监控的端点,这里我们的系统名称为 backend

#监控的端点
management.endpoints.web.exposure.include=*
#应用程序名称,在prometheus 上会显示
management.metrics.tags.application=${spring.application.name}
#tomcat 指标需要开启
server.tomcat.mbeanregistry.enabled=true

3. 启动服务查看,访问actuator/prometheus接口,是否能获取相关指标

image-20240708152754927

Prometheus

Prometheus 的使用

Micrometer简介

Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API,应用程序只需要使用 Micrometer 的通用 API 来收集性能指标即可。Micrometer 会负责完成与不同监控系统的适配工作。这就使得切换监控系统变得很容易。Micrometer 还支持推送数据到多个不同的监控系统。Micrometer类似日志系统中SLF4J。

Micrometer中有两个最核心的概念,分别是是计量器(Meter)和计量器注册表(MeterRegistry),下面来分别看下这两个概念。

计量器(Meter)

Meter用来收集性能指标数据(Metris),总共有四种类型的Meter,分别是Counter,Gauge,Timer,Summary。

每个Meter都有自己的名称,同时Meter可以指定一系列的tag。tag是以key-value的形式出现,这样我们就可以根据tag对指标进行过滤。除了每个Meter独有的标签外,也可以通过MeterRegistry添加通用的tag。

MeterRegistry.Config config = simpleMeterRegistry.config();
    config.commonTags("tag1","value1","tag2","value2");
Counter

Counter只允许增加值,Counter所表示的计数值是double类型,默认情况下增加的值是1.0

@Autowired
private SimpleMeterRegistry simpleMeterRegistry;
​
@Bean
public Counter counter1(){
    return Counter.builder("test.count1").register(simpleMeterRegistry);
}
​
@Bean
public Counter counter2(){
    return simpleMeterRegistry.counter("test.count2");
}
​
@Test
public void test(){
    counter1.increment();
}
​
Gauge

Cauge是表示单个的变化的值,例如温度,气压。与Counter的区别在于,Gauge的值不总是增加的

public void guage(){
    Gauge.builder("guaua1", this::getValue).register(simpleMeterRegistry);
}
​
public double getValue(){
    return ThreadLocalRandom.current().nextDouble();
}
​

Gauge对象一旦被创建,就不能手动对其中的值进行修改。在每次取样时,Gauge 会返回当前值

Timer

Timer通常用来记录事件的持续时间。Timer会记录两类的数据,事件的数量和总的持续时间。Timer提供了不同方式来记录持续时间。第一种方式是使用record()方法来记录Runnable和Callable对象的运行时间,第二种方式是使用Timer.Sample来保存计时状态

public void record(){
    Timer timer = simpleMeterRegistry.timer("record");
    timer.record(() -> {
        try {
            Thread.sleep(3000);
        }catch (Exception e){
            e.printStackTrace();
        }
    });
}
​
public void sample(){
    Timer.Sample sample = Timer.start();
    new Thread(()->{
        try {
            Thread.sleep(3000);
        }catch (Exception e){
            e.printStackTrace();
        }
        sample.stop(simpleMeterRegistry.timer("sample"));
    });
}
​
summary

summary用来记录指标的分布,summary根据每个指标的值,把值分配到对应的bucket中。Micrometer默认的bucket的值从1到Long.MAX_VALUE,可以通过minimumExpectedValue和maximumExpectedValue来控制bucket的范围,如果指标的值较小,还可以通过scale来设置一个值对数值进行放大

public void summary(){
    DistributionSummary summary = DistributionSummary.builder("summary")
            .maximumExpectedValue(10L)
            .minimumExpectedValue(1L)
            .publishPercentiles(0.5, 0.75, 0.9)
            .register(simpleMeterRegistry);
​
    summary.record(1.0);
    summary.record(5.0);
    summary.record(4.5);
    summary.record(3.0);
​
    System.out.println(summary.takeSnapshot());
}
​

计量器注册表(MeterRegistry)

MeterRegistry负责创建和维护Meter。每一个监控系统有自己独有的registry

其中SimpleMeterRegistry是一个基于内存的注册表,它不支持导出数据到监控系统,主要用来进行本地开发和测试。

Micrometer支持多个不同的监控系统,通过CompositeMeterRegistry可以把多个计量器注册表组合起来,从而允许同时发布数据到多个监控系统中。

public void compositeRegistry(){
        CompositeMeterRegistry compositeMeterRegistry = new CompositeMeterRegistry();
        compositeMeterRegistry.add(new SimpleMeterRegistry());
        compositeMeterRegistry.add(new SimpleMeterRegistry(new SimpleConfig() {
            @Override
            public String get(String s) {
                return null;
            }
​
            //增加前缀
            @Override
            public String prefix() {
                return "simple";
            }
        },Clock.SYSTEM));
​
        Counter counter = compositeMeterRegistry.counter("test");
        counter.increment();
    }
​

Micrometer本身提供了一个静态的全局注册表Metrics.golbalRegistry。这个注册表一个组合注册表,使用Metrics类中的静态方法创建的计量器,都会被添加到这个全局注册表中

public void globalRegistry(){
    Metrics.addRegistry(simpleMeterRegistry);
    Counter global = Metrics.counter("global");
    global.increment();
}

Prometheus 配置

  1. prometheus.yml文件中进行配置业务系统采集点,5s 拉取一次指标,由于Prometheus server 部署在docker 中,所以访问主机IP 用host.docker.internal

#业务系统监控          
  - job_name: 'SpringBoot'
    # Override the global default and
    scrape_interval: 5s
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['host.docker.internal:8080']       

image-20240708152818008

Grafana 配置

访问https://grafana.com/grafana/dashboards/4701-jvm-micrometer/,并下载

image-20240708152840448

并在Grafana 导入,关联Prometheus数据源

图片

这会还看不到数据,因为Prometheus没启动,配置未生效

验证

Prometheus验证

启动Prometheus,并访问9093端口,查看是否能查询到业务系统指标,比如jvm_memory_used_bytes

image-20240708152906083

Grafana 验证

访问我们导入的大屏,可以看到已收集到相关数据,包括系统启动时间、运行时间、tomcat 连接池信息、JVM相关信息等

image-20240708152924105

总结

以上我们介绍了如何使用Prometheus来监控Spring Boot工程相关指标并使用Grafana 进行展现

0

评论区