vlambda博客
学习文章列表

【中间件】SpringBoot 整合 Prometheus 实现应用监控

【中间件】SpringBoot 整合 Prometheus 实现应用监控

1. prometheus 安装

教程文档: https://www.prometheus.wang/quickstart/install-prometheus-server.html

1.1 什么是 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();

    // 一个用于演示的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'
   # 抓取频率
    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 对应的数字就是我们需要的

5. 小结

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

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

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

下一篇博文将介绍如何实现自定义的数据收集上报

II. 其他

0. 项目

  • 工程:https://github.com/liuyueyi/spring-boot-demo
  • 源码: https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/420-prometheus-basic

1. 一灰灰 Blog

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激

下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

  • 一灰灰 Blog 个人博客 https://blog.hhui.top
  • 一灰灰 Blog-Spring 专题博客 http://spring.hhui.top
一灰灰blog