转载

你是如何知道你线上QPS是多少的


为什么需要监控 QPS?

QPS 是衡量后端服务性能的关键指标,可以帮助你及时发现性能瓶颈和问题。

Prometheus 是什么?

Prometheus 是一个开源监控框架,用于收集和存储时序数据,例如度量标准和日志。

如何配置 Prometheus 监控后端服务?

在springboot 应用中完成指标 my_app_requests_total 的暴露,在 prometheus.yml 配置文件中指定要监控的指标。

Grafana 是什么?

Grafana 是一个开源的可视化工具,用于创建和共享交互式仪表盘,展示 Prometheus 等监控系统收集的数据。

如何可视化 QPS 数据?

在 Grafana 中创建一个仪表盘,添加一个图形面板,显示 my_app_requests_total{method="GET"} 度量标准。

从0到1 实现线上 QPS的监控 的核心流程

SpringBoot添加actuator和prometheus依赖,然后使用 actuator暴露prometheus 端点;SpringBoot中配置prometheus数据采集Bean,实现端点数据的url 暴露服务。

Prometheus启动文件中添加监控的后台服务信息,如数据采集间隔、服务IP:PROT等;进行指标数据的拉取和时序数据的打标。

Grafana配置:使用 Metrics browser配置监控的指标:包括uri、outcome等等;完成 Transform配置数据转换:最后进行Labels to fields配置图例名称的配置。

1. 配置 Spring Boot 项目

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.propertiesapplication.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. 错误分布 - 状态码各个请求分布

2. 配置 Prometheus

下载并启动 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 是要监控的服务地址。

3. 启动 Prometheus

在 Prometheus 的根目录下运行:

./prometheus --config.file=prometheus.yml

4. 配置 Grafana

下载并启动 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 分钟内每秒请求的平均增长率。

5. 查看和分析 QPS

在 Grafana 中创建一个面板,将 QPS 指标添加到面板中,使用上述 PromQL 表达式进行绘制。

你可以查看 QPS 的实时趋势、历史趋势,以及不同时间范围的 QPS 数据。

6. 优化和调整

根据 QPS 监控结果,你可以调整 Spring Boot 应用程序的性能,如添加缓存、优化数据库查询、增加服务器等。

调整 Prometheus 的采集间隔和配置,以获取更精确的数据。

进一步优化 Grafana 面板,添加告警规则等。

Java

评论