过滤表达式
RelayCore 在多个面共享同一套过滤表达式:
- TUI 中的
/过滤栏 - CLI 的
relay-core-cli flows --filter - HTTP API 的
GET /api/v1/flows显式结构化参数 - MCP 工具
search_flows的filter字段
所有这些面最终都被同一份解析器解释。掌握了这套语法就能在任意地方使用。
基础语法
表达式由空格分隔的 token 组成,多个 token 隐式 AND。裸 token 在 URL 与 method 上做大小写不敏感的子串匹配。
# 主机名子串匹配
host:api
host:api.example.com
# 路径子串匹配
path:/v1/users
path:/graphql
# HTTP 方法(大小写不敏感)
method:GET
method:POST
# 状态码(精确、区间、比较)
status:404
status:400-499
status:>=500
status:<300
# 流级标志
err # 任意 has_error==true 的流(别名 error)
ws # WebSocket 流(别名 websocket)
# 裸文本子串(针对 URL + method 拼接)
health
users 组合使用
多个 token 隐式 AND:
# 失败的 POST 请求到 api 主机
host:api method:POST status:>=400
# 5xx 错误的 WebSocket
ws status:500-599
# 任何包含 health 的 2xx
health status:<300 状态码语法
状态码支持四种语法:
| 写法 | 含义 | 示例 |
|---|---|---|
| 精确 | 完全相等 | status:404 |
| 区间 | 闭区间 | status:400-499 |
| 下界 | >= 或 > | status:>=500 |
| 上界 | <= 或 < | status:<300 |
比较符与数字之间不能有空格。
HTTP API 结构化参数
当使用 HTTP API 的 GET /api/v1/flows 时,等价于 token 的方式是显式结构化参数:
| Token | 查询参数 |
|---|---|
host:api | ?host=api |
path:/v1/users | ?path=/v1/users |
method:POST | ?method=POST |
status:>=500 | ?status_min=500 |
status:<300 | ?status_max=299 |
status:400-499 | ?status_min=400&status_max=499 |
err | ?has_error=true |
ws | ?is_websocket=true |
对于简单筛选,结构化参数更直观;对于 ad-hoc 调试,token 形式更短。
大小写与子串语义
- 所有字符串字段的匹配都是 大小写不敏感 的。
- host 与 path 都是 子串 匹配,不是 glob——要
api.example.com完整子串,不是api.*.com。 - 方法比较特殊:精确匹配(不区分大小写),但只有标准 HTTP 方法(GET / POST / PUT / DELETE / PATCH / HEAD / OPTIONS)和
WS。 - 裸 token 在拼接的 "URL + method" 字符串上匹配,例如
health会同时命中 URL 含 "health" 与 method = "HEALTH"(后者不存在,实践中只命中前者)。
常见陷阱
- 裸 token 命中过多:
api会同时匹配 host 含 "api"、path 含 "api"、URL 含 "api" 的所有流。如果想精确到主机,加host:api前缀。 - 状态码比较符漏空格:
status:> 500是非法,必须status:>=500。 - 跨面表现差异:TUI 实时显示过滤结果;CLI 一次性查询;HTTP API 返回分页。语法相同但交互不同。