Files
2026-03-01 01:43:46 +08:00

2.5 KiB

这是我的请求记录表:

对应的 mapper 等文件在:

D:\MyCode\Work\yd-hy\ibs-plus\plus-service\src\main\java\com\cmcc\plus\gateway

D:\MyCode\Work\yd-hy\ibs-plus\plus-service\src\main\resources\mapper\gateway

表结构:

@TableName(value = "gw_forward_record")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GwForwardRecord implements Serializable {
    /**
     * 记录ID
     */
    @TableId(type = IdType.AUTO)
    private Long recordId;

    /**
     * 请求UUID
     */
    private String uuid;

    /**
     * 请求时间
     */
    private LocalDateTime requestTime;

    /**
     * 接口路径
     */
    private String requestUrl;

    /**
     * 请求方法
     */
    private String method;

    /**
     * 目的地址
     */
    private String targetEndpoint;

    /**
     * 请求响应码
     */
    private Integer httpCode;

    /**
     * 链路追踪ID
     */
    private String traceId;

    /**
     * 网关地址
     */
    private String gatewayEndpoint;

    /**
     * 请求匹配的路由ID
     */
    private Long routeId;

    /**
     * 请求耗时(ms)
     */
    private Integer costTime;

    @Serial
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}

我现在有一个需求,需要给前端提供一个曲线图数据查询接口:

接口创建在 com.cmcc.plus.web.controller.gateway.GwForwardRecordController 下。

注意一定要保证代码执行效率。因为这是网关请求记录表,是一个量级非常大的表。

图中包含 5 条线:2xx、4xx、5xx、其他状态码(请求次数,对应表httpCode字段)、平均耗时(ms,对应表 costTime 字段)

我的图标左侧 Y 轴为 请求次数,右侧 Y 轴 平均耗时。下方 X 轴为时间坐标轴。

我想给我前端一个通用方法,查询某个时间段的这五个指标(也就是针对 requestTime 的过滤)。costTime(比如前端传 200ms-300ms 的查询)同时支持通过 requestUrl、method、targetEndpoint、httpCode、gatewayEndpoint 的过滤。

请仔细设计返回前端的结构体,做到最标准和效率。

仔细设计 requestUrl、targetEndpoint、gatewayEndpoint 是否可以使用模糊查询,前提是保证效率,因为这个表是一个非常大的表。

针对时间粒度。帮我提供时间区间内 5 分钟(例如 00:00:00 的数据就是 00:00:00-00:04:59),1小时,1天,一周,一月。时间粒度均为左闭右开。这个粒度根据前端选择进行聚合。不用一次全聚合出来。