
一介闲人
一介闲人
为什么需要监控 QPS?
QPS 是衡量后端服务性能的关键指标,可以帮助你及时发现性能瓶颈和问题。
Prometheus 是什么?
Prometheus 是一个开源监控框架,用于收集和存储时序数据,例如度量标准和日志。
如何配置 Prometheus 监控后端服务?
在springboot 应用中完成指标 my_app_requests_total 的暴露,在 prometheus.yml 配置文件中指定要监控的指标。
Grafana 是什么?
Grafana 是一个开源的可视化工具,用于创建和共享交互式仪表盘,展示 Prometheus 等监控系统收集的数据。
如何可视化 QPS 数据?
在 Grafana 中创建一个仪表盘,添加一个图形面板,显示 my_app_requests_total{method="GET"} 度量标准。
SpringBoot添加actuator和prometheus依赖,然后使用 actuator暴露prometheus 端点;SpringBoot中配置prometheus数据采集Bean,实现端点数据的url 暴露服务。
Prometheus启动文件中添加监控的后台服务信息,如数据采集间隔、服务IP:PROT等;进行指标数据的拉取和时序数据的打标。
Grafana配置:使用 Metrics browser配置监控的指标:包括uri、outcome等等;完成 Transform配置数据转换:最后进行Labels to fields配置图例名称的配置。
SpringBoot添加actuator和prometheus依赖,然后使用 actuator暴露prometheus 端点;SpringBoot中配置prometheus数据采集Bean,实现端点数据的url 暴露服务。
添加依赖
在 pom.xml
文件中添加 Spring Boot Actuator 和 Prometheus 依赖:
<dependencies>
<!-- Spring Boot Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
</dependency>
<!-- Micrometer Prometheus Registry -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
</dependencies>
在 application.properties
或 application.yml
中配置 Actuator 暴露的端点
# 暴露所有 Actuator 端点
management.endpoints.web.exposure.include=*
# 暴露 Prometheus 端点
management.endpoints.web.exposure.include=prometheus
management.metrics.web.server.request.metric-name = http.server.requests
或
management:
endpoints:
web:
exposure:
includ: * # 暴露所有 Actuator 端点
include: prometheus # 暴露 Prometheus 端点
metrics:
web:
server:
request:
metric-name: http.server.requests
创建一个配置类,配置 Prometheus 数据采集 Bean:
@SpringBootApplication
@ServletComponentScan
public class OneApplication {
public static void main(String[] args) {
SpringApplication.run(OneApplication.class, args);
}
// 非常重要
@Bean
MeterRegistryCustomizer<MeterRegistry> configurer(
@Value("${spring.application.name}") String applicationName) {
return (registry) -> registry.config().commonTags("application", "spring-boot-app");
}
}
这个应用程序可能是一个 Web 服务,使用 Spring Boot 框架开发,并且可能集成了一些监控功能,如使用 Micrometer 进行指标监控。
MeterRegistry
是 Micrometer 库中的核心组件,用于收集和管理指标,例如记录请求计数、请求时长、内存使用等, 这个是非入侵的。
通过这个 configurer
Bean,我们为所有的指标添加了一个通用的标签,使得在监控系统中查看指标时,可以清晰地知道这些指标来自哪个应用程序。
启动springboot项目后,查看输出的指标:http://localhost:8080/actuator/prometheus
# HELP http_server_requests_seconds
# TYPE http_server_requests_seconds summary
# http_server_requests_seconds_count 表示请求次数3次
http_server_requests_seconds_count{application="hello",exception="None",method="POST",outcome="SUCCESS",status="200",uri="/prometheus/post/{id}",} 3.0
# http_server_requests_seconds_sum 表示3次请求总响应时长是 3.021s
http_server_requests_seconds_sum{application="hello",exception="None",method="POST",outcome="SUCCESS",status="200",uri="/prometheus/post/{id}",} 3.0210991
http_server_requests_seconds_count{application="hello",exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus",} 110.0
http_server_requests_seconds_sum{application="hello",exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus",} 3.8388842
# HELP 是对这个指标的描述
# HELP http_server_requests_seconds_max
# 这个指标类型
# TYPE http_server_requests_seconds_max gauge
# http_server_requests_seconds_max 表示所有请求中,最长响应时间的一次是 2.00s
http_server_requests_seconds_max{application="hello",exception="None",method="POST",outcome="SUCCESS",status="200",uri="/prometheus/post/{id}",} 2.0021618
http_server_requests_seconds_max{application="hello",exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus",} 0.0345458
数据统计标识:
序号 | 标识 | 描述 |
---|---|---|
1 | http_server_requests_seconds_count | 请求量 |
2 | http_server_requests_seconds_sum | 请求总耗时 |
3 | http_server_requests_seconds_max | 请求最大耗时 |
指标的最后的部分是类型, 主要的类型有:
Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要)
一般 需要的 常规 指标 数据, 都可以通过上面的指标统计出来的。
1. 当前在线总数, 折线图, 时间线和人数
2. 吞吐量 - 每个时间点处理的请求数 - 折线图
3. 接口响应时长 - 每个接口的响应时长,横坐标是时间线,折线图
4. 错误分布 - 状态码各个请求分布
下载并启动 Prometheus,从 Prometheus 官网下载相应版本的 Prometheus,并解压。
配置 Prometheus 启动文件 prometheus.yml
在 prometheus.yml
中添加以下内容:
global:
scrape_interval: 15s # 采集间隔
scrape_configs:
- job_name: 'prometheus'
metrics_path: '/actuator/prometheus' # 从 Spring Boot Actuator 的 Prometheus 端点采集数据
static_configs:
- targets: ['localhost:9090'] # 替换为你的服务 IP 和端口
scrape_interval 定义了 Prometheus 从目标拉取数据的时间间隔,这里是 15 秒。
job_name 是监控任务的名称,这里叫 prometheus。
metrics_path 是 Prometheus 采集数据的路径,这里指向 Spring Boot Actuator 的 Prometheus 端点。
targets 是要监控的服务地址。
在 Prometheus 的根目录下运行:
./prometheus --config.file=prometheus.yml
下载并启动 Grafana,从 Grafana 官网下载并启动 Grafana。
打开 Grafana 页面,登录后添加 Prometheus 作为数据源。
在 Configuration
-> Data Sources
中添加一个新的数据源,选择 Prometheus,并输入 Prometheus 的 URL(默认是 http://localhost:9090
)。
在 Create
-> Dashboard
-> Add Query
中,使用 PromQL 表达式进行指标查询。
例如,使用 下面的公式统计qps
rate(http_server_requests_seconds_count{uri="/api/v1/prometheus/test"}[5m])
上面是一个 PromQL表达式,PromQL (Prometheus Query Language)是 Prometheus 的查询语言,用于从 Prometheus 的时间序列数据库中检索和操作数据。它可以用来计算和聚合指标数据,以生成有用的统计信息,例如计算速率、总和、平均值等。
http_server_requests_seconds_count 这是一个指标名称,通常是在使用 Spring Boot Actuator 与 Micrometer 集成时,用于统计 HTTP 服务器请求的数量。这个指标会记录每个请求的计数,根据不同的标签(如 uri
)进行区分。
{uri="/api/v1/prometheus/test"}
这是一个标签选择器,用于筛选出 http_server_requests_seconds_count
指标中 uri
标签等于 /api/v1/prometheus/test
的时间序列数据。通过使用标签选择器,可以将指标数据进行分类和筛选,以便你只关注特定的请求或服务。
[5m]
这表示时间范围,这里是 5 分钟。这个时间范围用于指定 rate
函数的计算窗口。
rate()
函数用于计算时间序列在给定时间范围内的每秒平均增长率。具体计算步骤如下:
它首先查看在指定的 5 分钟([5m]
)时间窗口内的 http_server_requests_seconds_count
指标数据。
然后计算该指标,在这个时间窗口内的每秒平均增长率。对于 http_server_requests_seconds_count
指标,这可以看作是在过去 5 分钟内每秒请求的平均增长率。
在 Grafana 中创建一个面板,将 QPS 指标添加到面板中,使用上述 PromQL 表达式进行绘制。
你可以查看 QPS 的实时趋势、历史趋势,以及不同时间范围的 QPS 数据。
根据 QPS 监控结果,你可以调整 Spring Boot 应用程序的性能,如添加缓存、优化数据库查询、增加服务器等。
调整 Prometheus 的采集间隔和配置,以获取更精确的数据。
进一步优化 Grafana 面板,添加告警规则等。
评论