当前位置: 首页 > news >正文

实用指南:Spring Cloud Gateway 实战:全局过滤器日志统计与 Prometheus + Grafana 接口耗时监控

实用指南:Spring Cloud Gateway 实战:全局过滤器日志统计与 Prometheus + Grafana 接口耗时监控

目录

  • 一、背景介绍
  • 二、全局过滤器实现接口日志与耗时统计
    • 1. 代码实现
    • 2. 日志内容
  • 三、为什么选择 Prometheus + Grafana?
  • 四、接入思路
  • 五、代码实现:接入 Prometheus
    • 1. 引入依赖
    • 2. 修改全局过滤器,记录耗时指标
    • 3. 开启 Prometheus 端点
  • 六、配置 Prometheus
  • 七、在 Grafana 中展示
    • 1. 常用 PromQL
  • 八、总结

一、背景介绍

在微服务架构下,API 网关作为统一入口,往往需要具备日志监控、权限校验、流量控制等能力。
其中,记录接口访问情况和请求耗时,不仅能帮助开发者定位问题,还能为后续性能优化提供数据支撑。

本文将带你从全局过滤器日志统计入手,逐步扩展到 Prometheus + Grafana 可视化监控,实现一套完整的接口性能监控方案。


二、全局过滤器实现接口日志与耗时统计

Spring Cloud Gateway 中,过滤器(Filter)是一个核心组件:

由于我们需要对 所有接口统一统计,这里使用 GlobalFilter

1. 代码实现

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
@Slf4j
public class MyGlobalFilter implements GlobalFilter, Ordered {
private static final String BEGIN_VISIT_TIME = "begin_visit_time";
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 记录请求开始时间exchange.getAttributes().put(BEGIN_VISIT_TIME, System.currentTimeMillis());return chain.filter(exchange).then(Mono.fromRunnable(() -> {Long beginVisitTime = exchange.getAttribute(BEGIN_VISIT_TIME);if (beginVisitTime != null) {log.info("访问接口主机:{}", exchange.getRequest().getURI().getHost());log.info("访问接口端口:{}", exchange.getRequest().getURI().getPort());log.info("访问接口URL:{}", exchange.getRequest().getURI().getPath());log.info("访问接口参数:{}", exchange.getRequest().getURI().getRawQuery());log.info("访问接口时长:{} 毫秒", System.currentTimeMillis() - beginVisitTime);log.info("===========分割线=============");}}));}@Overridepublic int getOrder() {return 0; // 优先级最高}}

2. 日志内容

  • 请求主机(Host)
  • 请求端口(Port)
  • 请求路径(Path)
  • 请求参数(Query)
  • 请求耗时(ms)

这些日志对于性能分析和问题排查非常有用。


三、为什么选择 Prometheus + Grafana?

日志虽然能看,但 无法实时监控和统计趋势。这时我们需要一个监控系统。

两者结合,就能实现 实时接口耗时监控 + 告警


四、接入思路

  1. 在全局过滤器中,记录每次请求的耗时。
  2. 使用 Micrometer MeterRegistry 上报指标。
  3. Spring Boot Actuator 暴露 /actuator/prometheus 接口。
  4. Prometheus 定时拉取数据。
  5. Grafana 展示监控大盘。

五、代码实现:接入 Prometheus

1. 引入依赖

<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.12.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>3.2.3</version>
</dependency>

2. 修改全局过滤器,记录耗时指标

import io.micrometer.core.instrument.MeterRegistry;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
public class MetricsGlobalFilter implements GlobalFilter, Ordered {
private static final String BEGIN_VISIT_TIME = "begin_visit_time";
@Autowired
private MeterRegistry meterRegistry;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {exchange.getAttributes().put(BEGIN_VISIT_TIME, System.currentTimeMillis());return chain.filter(exchange).then(Mono.fromRunnable(() -> {Long beginTime = exchange.getAttribute(BEGIN_VISIT_TIME);if (beginTime != null) {long cost = System.currentTimeMillis() - beginTime;String path = exchange.getRequest().getURI().getPath();// 日志打印log.info("接口 {} 耗时 {} ms", path, cost);// 上报 Prometheus 指标meterRegistry.timer("gateway_requests", "path", path).record(cost, TimeUnit.MILLISECONDS);}}));}@Overridepublic int getOrder() {return 0;}}

3. 开启 Prometheus 端点

management:
endpoints:
web:
exposure:
include: prometheus
endpoint:
prometheus:
enabled: true

访问:

http://localhost:8222/actuator/prometheus

你会看到类似的输出:

在这里插入图片描述


六、配置 Prometheus

prometheus.yml 中添加:

scrape_configs:
- job_name: 'spring-cloud-gateway'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['192.168.121.1:8222']

在这里插入图片描述


七、在 Grafana 中展示

  1. Grafana 添加数据源 → Prometheus。
  2. 新建 Dashboard → 添加图表。

1. 常用 PromQL

效果图:

Grafana监控大盘示例


八、总结

日志统计 → 指标监控 → 可视化分析 的完整链路:

  • 全局过滤器:记录接口访问日志与耗时。
  • Prometheus:采集和存储耗时指标。
  • Grafana:可视化接口性能趋势,并可设置告警。
http://www.hskmm.com/?act=detail&tid=21094

相关文章:

  • GTSAM 中自定义因子(Custom Factor)的详解和实战示例 - 指南
  • AtCoder AGC073 A 题解
  • CF506C Mr. Kitayuta vs. Bamboos 51nod1457 小K vs. 竹子 题目分析
  • 北京 意大利 硕士学签/D签 vfs代办 材料清单
  • temp
  • 我有园子了
  • 使用 Jenkins 的流水线方案实施 CI/CD
  • 加密的病例单
  • 详细介绍:视频融合平台EasyCVR构筑智慧交通可视化管理与智能决策中枢
  • docker 在x86上build arm 镜像
  • 9.29软工
  • 不一样的.NET烟火,基于Roslyn的开源代码生成器
  • 复刻江协旋钮控制模块
  • 告别硬编码!5个让Web自动化脚本更稳定的定位策略
  • 从零开始,使用Idea工具搭建一个springboot项目
  • 最优/极值问题的算法选择
  • 第三方控件库的添加和使用
  • C4NR PVP服务器1.2 天穹炮塔更新
  • 树形dp [JOI Open 2020] 发电站 / Power Plant
  • 深入解析:灵画-AI绘画小程序
  • AT_arc156_b [ARC156B] Mex on Blackboard
  • 产品排序
  • 环形链表II-leetcode
  • ubuntu20.04安装nvidia显卡
  • [线段树系列 #6] 标记永久化
  • 9.29
  • c语言switch和if语句
  • Qt(制作一个方便的文本编辑器)
  • Java EE初阶启程记05---线程安全 - 指南
  • DataGridView表格控件使用说明