问题清单(待逐个修复)

2026-10-14 · 基于提交 58b335d(工作区干净,网关为该版本,check_all 已通过)

怎么读这份清单

编号问题程度来源
I-01where / eval 里「字段 = 数字」按字符串比较高今天实测
I-02GBK 特有字节在 64 KB 窗口之后时被判成 UTF-8中前几轮记录
I-03CSV 上传中途失败时,前面的行已经入库高前几轮记录
I-04编码未知时预览按 UTF-8 显示,可能是乱码低前几轮记录
I-05文件中途混用编码时,页面和服务器判断可能不一致低前几轮记录
I-06上传过程中不能换文件低前几轮记录
I-07上传和竞态的界面测试只在模拟 DOM 里跑过中前几轮记录
I-08eval 末尾多一个逗号不报错低今天实测
I-09多个空值分组系列显示为「(空值2)」低前几轮记录
I-10最近几轮的行为变化,已存查询结果可能改变中前几轮记录
I-11全量回归耗时长,Codex 环境里 180 秒跑不完中Codex 审查
I-12chart-dense-groups.cjs 用旧页面跑会吃光内存中前几轮记录
I-13自动识别编码时每个上传多占约 64 KB 内存低前几轮记录
I-14数字字段上 if 条件里的「有值」和正则判断失效(VictoriaLogs 的问题)高今天实测
I-15stats … by _time span=1h 不报错,静默返回空结果中今天实测

1. 查询结果不对

I-14 数字字段上 if 条件里的「有值」和正则判断失效

高今天实测

现象:VictoriaLogs 1.53 里,一个数据块把字段存成数字(同一块里有 9 个以上不同的整数)时,format if (n:*)、stats count() if (n:*) 这类管道里的条件一条都不匹配,正则条件 n:~"…" 也一样;放在 filter 里、写成 !n:"" 或 n:1* 都正常。是否触发看数据怎么落块,所以回归用例 060 以前能过,今天开始稳定失败。

写入 n=1..20 共 20 条
| stats values(n)   → [](修复前)
| stats count       → 20

已修:values() 和 list() 生成的条件改成 !n:""(回归用例 087)。还没修:网关里另有约 25 处在 if 条件里用 字段:*(如 eval 的 isnotnull、mvexpand、chart 的补全等),以及 eval 的 match()/like() 正则,在数字字段上可能同样出错。建议修法:统一换成 !字段:"",正则条件先把数字转成文字再匹配;改动面较大,需要单独一轮并补用例。也可以给 VictoriaLogs 报这个 bug。

I-15 stats … by _time span=1h 不报错,静默返回空结果

中今天实测

现象:助理自动生成仪表盘时写了 index=* | stats count by _time span=1h。网关把 span、=、1h 都当成了分组字段,生成 stats by (_time, span, "=", "1h"),结果为空,也不报错。Splunk 里 stats 的 by 后面可以写 span,按时间分桶。

| stats count by _time span=1h  → 0 行
| timechart span=1h count       → 正常

影响:用户或助理照 Splunk 习惯这么写,会以为没有数据。现在助理加面板前会先跑一次查询,空结果的面板会被拒绝,所以不会再出现空面板,但搜索页仍会静默返回空。建议修法:stats 的 by 子句支持 span=(等同先 bin _time),至少要报错;修时按规矩补回归用例。

I-01 where / eval 里「字段 = 数字」按字符串比较

高今天实测

现象:字段值是 1.0、01 这类写法时,where n=1 一条都查不到,eval z=if(n=1,"y","n") 也得到 n。Splunk 的 where 和 eval 里,两边都是数字时按数值比较,这两条应该算相等。大于、小于已经按数值比较,只有等于和不等于有这个问题,所以 where n>=1 AND n<=1 能查到,where n=1 却查不到,前后不一致。

写入 n="1.0" 和 n="10" 两条
| where n=1            → 0 条(应为 1 条)
| eval z=if(n=1,...)   → 两条都是 n(应为 1.0 那条是 y)
翻译结果:filter n:="1"(按文字精确匹配)

注意:search n=1 在 Splunk 里本来就按文字匹配,不算这个问题;where n="1" 右边是带引号的字符串,也应按文字比较。

建议修法:where / eval 的等于、不等于,右边是数字字面量时,翻译成按数值比较(LogsQL 的范围过滤或 math 计算后比较),字段值不是数字时再退回文字比较。要补回归用例和单元测试,并检查 count(eval(n=1)) 等同样走这段代码的地方。

2. CSV 上传

I-02 GBK 特有字节在 64 KB 窗口之后时被判成 UTF-8

中前几轮记录

现象:自动识别编码只看「第一个非 ASCII 字节起的 16 个非 ASCII 字节或 64 KB」。如果这一段里只有很少几个中文,恰好又都是合法 UTF-8(比如「漏」的 GBK 编码 C2 A9),而真正能看出是 GBK 的字节在这之后,就会判成 UTF-8,读到后面时报 400。

现在的绕法:用户在上传页手动选 GBK。

建议修法(二选一,需要你定):一是判成 UTF-8 后读到不合法的字节时,如果前面判断依据很少,自动从头按 GBK 重来(需要能重读文件,网页上传可以,流式 API 不行);二是保持现状,但报错信息里直接提示「请指定 encoding=gbk 重新上传」。

I-03 CSV 上传中途失败时,前面的行已经入库

高前几轮记录

现象:文件边读边写入。读到一半遇到编码错误、某一行格式不对或者连接断开时,返回失败,但前面已经写进去的行留在库里。用户改好文件再传一次,前半部分就重复了。

建议修法:每次上传生成一个 upload_id,写进每条事件;失败时在返回里给出 upload_id 和已写入行数,并提供按 upload_id 删除或在搜索里排除的办法。VictoriaLogs 不支持事务,没法真正回滚,只能做到「可识别、可清理」。也可以先整份校验再写入,但大文件要先存到临时文件,2 GB 上限下需要评估磁盘。

I-04 编码未知时预览按 UTF-8 显示,可能是乱码

低前几轮记录

现象:开头不够判断编码时,页面预览先按 UTF-8 显示,上传时交给服务器识别。GBK 文件的预览里「漏」会显示成「©」这样的字,但实际上传结果是对的。用户可能被预览吓到,手动改成错误的编码。

建议修法:编码未知时,预览旁边加一句提示,并提供「按 GBK 预览」的切换。

I-05 文件中途混用编码时,页面和服务器判断可能不一致

低前几轮记录

页面只读开头一段来模拟服务器的判断规则,极端情况下(同一个文件前半 UTF-8、后半 GBK)两边的结论可能不同。这种文件本身就是坏的,最终会上传失败,影响的只是预览里显示的编码。

I-06 上传过程中不能换文件

低前几轮记录

为了修切换文件的竞态,上传期间选文件框被禁用,要等这次上传结束。大文件上传时没有「取消」按钮。

建议修法:加一个取消按钮(中止请求),取消后恢复选文件框。取消时同样会留下已写入的行,和 I-03 一起考虑。

I-07 上传和竞态的界面测试只在模拟 DOM 里跑过

中前几轮记录

078 到 083 的界面测试用 node 加模拟 DOM 跑真实的页面代码,没有在真实浏览器或手机上点过完整的上传流程(选文件、预览、改时间列、上传、看结果)。

建议修法:用无头浏览器(比如 Playwright 容器)补一条端到端测试;或者你在手机上实际传一个 GBK 文件和一个带 source 列的文件试一下。

I-13 自动识别编码时每个上传多占约 64 KB 内存

低前几轮记录

判断窗口从 4 KB 放大到 64 KB 后,服务器要先攒够这一段才开始解析。单个上传影响很小;只有大量并发上传时才需要关注,可以和限流(P-02)一起看。

3. 语法和显示的小问题

I-08 eval 末尾多一个逗号不报错

低今天实测

| eval x=1, 正常执行,末尾的空赋值被悄悄忽略。Splunk 会报语法错误。结果本身没错,但用户打漏了后半句时不会得到提示。建议修法:split_top_commas 之后遇到空片段就报错。

I-09 多个空值分组系列显示为「(空值2)」

低前几轮记录

图表里有不止一个分组值为空的系列时,系列名显示成「(空值)」「(空值2)」。Splunk 里没有这种写法,它统一叫 NULL。建议和 Splunk 一样用 NULL,并确认 usenull / nullstr 选项要不要支持。

I-10 最近几轮的行为变化,已存查询结果可能改变

中前几轮记录

这些都是为了更接近 Splunk 做的有意修改,不是 bug,但已有的仪表盘或保存的查询可能受影响,需要你确认是否接受,或者要不要在文档里写一份「变更说明」:

  1. chart 多写分组字段(by a b c、over a by b c、over a b)以前能出(错误的)结果,现在直接报错。
  2. 命令参数里两头是单引号的值现在会去掉引号,比如 fillnull value='N/A' 以前填 'N/A',现在填 N/A。
  3. eval "a b"=1 的目标字段名现在去掉双引号,以前引号算在字段名里。
  4. 引号前是符号时(如 x.'a b')现在当成带引号的字段名,以前当成普通文字的一部分。

4. 测试和开发流程

I-11 全量回归耗时长,Codex 环境里 180 秒跑不完

中Codex 审查

85 个回归用例里有 65 个要写数据、固定等 3 秒落盘再查,全量跑一遍远超 180 秒。Codex 复审时跑到 058 就超时了,后面的用例它没验证到。Codex 的环境也没有 cargo,所以它一直没跑过 Rust 单元测试。

建议修法:给 run.sh 加并行(每个用例本来就用独立的 RUN 标记,互不干扰),或者把固定的 sleep 3 改成轮询到数据可见为止;另外在复审说明里告诉 Codex 用较长超时,或只跑和改动相关的用例。

I-12 chart-dense-groups.cjs 用旧页面跑会吃光内存

中前几轮记录

这个界面测试在修复前的页面上会一直分配内存,之前因此要求所有 node 调用都加 timeout 120 和 --max-old-space-size=1024。现在靠的是约定,测试脚本自己没有保护。建议在 run.sh 的公共函数里统一加上这两个限制,不再依赖每个用例自己写。

5. 上线前要补的功能(不是 bug)

这些在 开发与回归测试 和 多值字段复审 里列过,一直没做:

  1. P-01 API Key 管理:用户登录、管理员和普通用户两种角色、按 index 分权限已经做了(2026-10-15,见 用户登录和 index 权限)。2026-10-16:Key 只能写日志,不能再搜索;租户管理员在页面上新建/删除 Key,超级管理员在页面上开租户。还没做:Key 明文存储(配置文件和 tenants.json),示例 Key(demo-key-change-me 等)必须换掉,要改成哈希存储。登录会话只存在内存里,网关重启要重新登录;还没有单点登录(LDAP、OIDC)。
  2. P-02 限流和配额:一个租户猛发数据或猛查会影响其他租户。
  3. P-03 写入缓冲:网关没有本地队列,VictoriaLogs 短暂不可用时全靠客户端重试。
  4. P-04 公网采集入口:现在只有带密码的预览地址,外部采集端没法直接发数据,需要单独开放 HEC 和 OTLP 路径(建议 HTTPS)。
  5. P-05 HEC indexer acknowledgement(useACK)不支持。
  6. P-06 全文搜索超时:原待办,大范围全文查询的超时和取消还没处理。
  7. P-07 查找表权限:只有管理员(API Key、管理员用户)能改查找表和执行 outputlookup;普通用户即使能看全部 index(*)也不能改(2026-10-16 修正,之前按「能看全部 index」放行)。读取已按表控制(2026-10-16):每张表有「谁能用」(只有管理员 / 租户里所有人 / 能看指定 index 的用户),新表和 outputlookup 存的表默认只有管理员能用;下载、lookup、inputlookup、列表和助理都按它检查。
  8. P-08 高基数统计的内存:30 天范围、分组很多的 stats 内存问题没有解决;3 亿条压测在最近这些改动后没有重跑。
  9. P-09 demo 和 bench 测试数据还在库里,没有清理。
  10. P-10 没有和真实 Splunk 做过对照测试,兼容语义只依据公开文档和我们自己的回归用例。

6. SPL 还没做的部分(不是 bug)

完整列表见 SPL 命令覆盖。用到这些写法时会直接报错并说明原因,不会给出错误结果。比较常用的:

建议的修复顺序

  1. I-01(会给错结果,改动范围小)。
  2. I-03(上传失败留下半份数据),顺带 I-06 的取消按钮。
  3. I-11、I-12(让复审能跑完全量回归,后面每一条都受益)。
  4. I-02、I-04、I-07(上传体验)。
  5. I-08、I-09,以及 I-10 要你确认的行为变化。
  6. 第 5、6 节按上线计划排期。