【中间件】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']
修改配置之后,需要重启一下,当服务启动之后,可以在控制台上我们的应用信息
接下来访问 Graph,选择 metric: http_server_requests_seconds_count
可以看到一条抓起 metric 的记录
前面我们定义了一个 Controller,接下来简单访问几次,然后再看一下,会发现多一条记录
这些数据由框架层直接集成,实现 REST 接口的相关信息上报,借助这个 metric,我们可以实现 qps 的统计
3.1 qps 统计
sum(rate(http_server_requests_seconds_count{application="prometheus-example"}[10s]))
-
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]))
将 sum 聚合去掉之后,则可以看到各接口的访问情况
4. Grafana 大盘配置
面板监控,还是 Grafana 的比较强大,特别是 grafana 本身提供了很多模板可以直接导入
安装可以参考: 210318-linux grafana 大盘接入 mysql
4.1 大盘配置
grafana 启动之后,配置数据源 Promethues
接下来配置 SpringBoot 的应用配置面板,可以直接使用现成的模板,比如 12856
导入完毕之后,大盘展示如下
可以看一下请求耗时的统计 promql
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