过滤表达式

RelayCore 在多个面共享同一套过滤表达式:

  • TUI 中的 / 过滤栏
  • CLIrelay-core-cli flows --filter
  • HTTP API 的 GET /api/v1/flows 显式结构化参数
  • MCP 工具 search_flowsfilter 字段

所有这些面最终都被同一份解析器解释。掌握了这套语法就能在任意地方使用。

基础语法

表达式由空格分隔的 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 返回分页。语法相同但交互不同。