97 lines
2.5 KiB
Markdown
97 lines
2.5 KiB
Markdown
这是我的请求记录表:
|
|
|
|
对应的 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`
|
|
|
|
表结构:
|
|
|
|
```java
|
|
@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天,一周,一月。时间粒度均为左闭右开。这个粒度根据前端选择进行聚合。不用一次全聚合出来。
|