SpringBoot应用接入Prometheus的全过程解析

普罗米修斯:Prometheus是一个开放性的监控解决方案,用户可以非常方便的安装和使用Prometheus并且能够非常方便的对其进行扩展

下面将实现一个SpringBoot应用接入Prometheus的全过程

1.2 安装

Linux 安装

  • 官网指定下载包: https://prometheus.io/download/

下载本地安装启动

wget https://github.com/prometheus/prometheus/releases/download/v2.26.0/prometheus-2.26.0.linux-amd64.tar.gz

tar -zxvf prometheus-2.26.0.linux-amd64.tar.gz
cd prometheus-2.26.0.linux-amd64

# 启动命令
./prometheus

启动完毕之后,本地访问
http://127.0.0.1:9090/graph 可以看到默认提供的界面

2. SpringBoot应用接入

我们演示的SpringBoot为2.0+,因此直接选择 io.micrometer 的依赖包来实现;更低版本的不能使用这种姿势,可以直接使用官方提供的client来实现;这里不进行扩展

2.1 依赖配置

借助SpringBoot的actuator来提供扩展端点(所以本文采用的是Prometheus的拉工作模式)

SpringBoot版本为 2.2.1.RELEASE

核心依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-registry-prometheus</artifactId>
    </dependency>
</dependencies>

yaml配置文件,需要指定Prometheus相关的参数,一个demo如下

spring:
  application:
    name: prometheus-example
management:
  endpoints:
    web:
      exposure:
        include: "*"
  metrics:
    tags:
      application: ${spring.application.name}

注意

  • management.endpoints.web.exposure.include 这里指定所有的web接口都会上报
  • metrics.tags.application 这个应用所有上报的metrics 都会带上 application 这个标签

上面配置完毕之后,会提供一个 /actuator/prometheus 的端点,供prometheus来拉取Metrics信息

2.2 应用启动

对于SpringBoot而言,此时就不需要额外做什么,就可以实现应用的基本信息上报了

一个简单的demo如下

@RestController
@SpringBootApplication
public class Application {
    private Random random = new Random();
true
    // 一个用于演示的http接口
    @GetMapping(path = "hello")
    public String hello(String name) {
        int sleep = random.nextInt(200);
        try {
            Thread.sleep(sleep);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "hello sleep: " + sleep + " for " + name;
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }

    // 注意,这个是注册的核心代码块
    @Bean
    MeterRegistryCustomizer<MeterRegistry> configurer(@Value("${spring.application.name}") String applicationName) {
        return (registry) -> registry.config().commonTags("application", applicationName);
    }
}

到此,springboot应用的监控就算是完成了;接下来配置一下prometheus的服务端

3. prometheus 配置与实测

在前面下载的包下面,有一个配置文件 prometheus.yml ,新增一个Job

- job_name: 'prometheus-example'
true# 抓取频率
  scrape_interval: 5s
  # 抓取的端点
  metrics_path: '/actuator/prometheus'
  static_configs:
  	# 目标机器,数组,也就是说支持集群拉取
    - targets: ['127.0.0.1:8080']

修改配置之后,需要重启一下,当服务启动之后,可以在控制台上我们的应用信息

SpringBoot应用接入Prometheus的全过程解析

接下来访问Graph,选择metric:
http_server_requests_seconds_count 可以看到一条抓起metric的记录

SpringBoot应用接入Prometheus的全过程解析

前面我们定义了一个Controller,接下来简单访问几次,然后再看一下,会发现多一条记录

SpringBoot应用接入Prometheus的全过程解析

这些数据由框架层直接集成,实现REST接口的相关信息上报,借助这个metric,我们可以实现qps的统计

3.1 qps统计

sum(rate(http_server_requests_seconds_count{application="prometheus-example"}[10s]))

SpringBoot应用接入Prometheus的全过程解析

  • rate: 用于统计增长趋势,要求上报的Metric为Counter类型(只增不减)
  • irate: 与rate相似,区别在于rate统计的是一段时间内的平均增长速率,无法反应这个时间窗口内的突发情况(即瞬时高峰),irate通过区间向量中最后两个样本数据来计算增长速率,但是当选用的区间范围较大时,可能造成不小的偏差
  • sum: 求和,适用于统计场景

更多内置函数,可以参考: PromQL内置函数

3.2 耗时统计

除了qps,另外一个经常关注的指标就是rt了,如上面接口的平均rt,通过两个Metric的组合来实现

sum(rate(http_server_requests_seconds_sum{application="prometheus-example"}[10s])) / sum(rate(http_server_requests_seconds_count{application="prometheus-example"}[10s]))

SpringBoot应用接入Prometheus的全过程解析

将sum聚合去掉之后,则可以看到各接口的访问情况

SpringBoot应用接入Prometheus的全过程解析

4. Grafana 大盘配置

面板监控,还是Grafana的比较强大,特别是grafana本身提供了很多模板可以直接导入

安装可以参考: 210318-linux grafana大盘接入mysql

4.1 大盘配置

grafana启动之后,配置数据源Promethues

SpringBoot应用接入Prometheus的全过程解析

接下来配置SpringBoot的应用配置面板,可以直接使用现成的模板,比如 12856

SpringBoot应用接入Prometheus的全过程解析

导入完毕之后,大盘展示如下

SpringBoot应用接入Prometheus的全过程解析

可以看一下请求耗时的统计promql

SpringBoot应用接入Prometheus的全过程解析

4.2 大盘模板哪里找

如何找直接可用的大盘呢?

  • 官网的大盘上查找即可
  • 如 https://grafana.com/grafana/dashboards?dataSource=prometheus&search=spring
  • 选择一个,点进去之后,右边的 Copy ID toClipboard 对应的数字就是我们需要的

SpringBoot应用接入Prometheus的全过程解析

5. 小结

上面整个流程走下来会发现SpringBoot项目接入Prometheus成本很低,基本上没有太多的编码工作,就可以配置给功能集全的监控大盘,简直不要太嗨

高度封装的便捷性在这里体现得非常突出了,但是搞完之后,再回想一下,我get到了什么?

好像什么都没get到,如果我的服务只提供grpc/dubbo接口,现在假设让我们接入监控,好像还是抓瞎,这该怎么玩?(欢迎在评论区留言)

原文链接:
http://spring.hhui.top/spring-blog/2021/04/19/210419-SpringBoot整合Prometheus实现应用监控/

 想了解更多可以关注公众号“w的编程日记”回复Java获得更多资料

上一篇:线程执行者(十一)执行者分离任务的启动和结果的处理


下一篇:【prometheus】Prometheus的服务发现