问题清单(待逐个修复)
2026-10-14 · 基于提交 58b335d(工作区干净,网关为该版本,check_all 已通过)
怎么读这份清单
- 每条有编号(I-01 起),之后修的时候直接说「改 I-03」就行。
- 严重程度:高 = 会悄悄给出错误结果或丢/坏数据;中 = 会报错、失败或体验明显不对,但不会给错结果;低 = 小问题或只影响少数写法。
- 来源:「今天实测」是我在当前网关上跑出来的;「前几轮记录」是之前每轮总结里写过的风险,这次没有逐条重新复现。
- 第 5 节是上线前要补的功能,第 6 节是 SPL 还没做的部分,它们不是 bug,但放在这里方便一起排期。
| 编号 | 问题 | 程度 | 来源 |
|---|---|---|---|
| I-01 | where / eval 里「字段 = 数字」按字符串比较 | 高 | 今天实测 |
| I-02 | GBK 特有字节在 64 KB 窗口之后时被判成 UTF-8 | 中 | 前几轮记录 |
| I-03 | CSV 上传中途失败时,前面的行已经入库 | 高 | 前几轮记录 |
| I-04 | 编码未知时预览按 UTF-8 显示,可能是乱码 | 低 | 前几轮记录 |
| I-05 | 文件中途混用编码时,页面和服务器判断可能不一致 | 低 | 前几轮记录 |
| I-06 | 上传过程中不能换文件 | 低 | 前几轮记录 |
| I-07 | 上传和竞态的界面测试只在模拟 DOM 里跑过 | 中 | 前几轮记录 |
| I-08 | eval 末尾多一个逗号不报错 | 低 | 今天实测 |
| I-09 | 多个空值分组系列显示为「(空值2)」 | 低 | 前几轮记录 |
| I-10 | 最近几轮的行为变化,已存查询结果可能改变 | 中 | 前几轮记录 |
| I-11 | 全量回归耗时长,Codex 环境里 180 秒跑不完 | 中 | Codex 审查 |
| I-12 | chart-dense-groups.cjs 用旧页面跑会吃光内存 | 中 | 前几轮记录 |
| I-13 | 自动识别编码时每个上传多占约 64 KB 内存 | 低 | 前几轮记录 |
| I-14 | 数字字段上 if 条件里的「有值」和正则判断失效(VictoriaLogs 的问题) | 高 | 今天实测 |
| I-15 | stats … 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,但已有的仪表盘或保存的查询可能受影响,需要你确认是否接受,或者要不要在文档里写一份「变更说明」:
- chart 多写分组字段(by a b c、over a by b c、over a b)以前能出(错误的)结果,现在直接报错。
- 命令参数里两头是单引号的值现在会去掉引号,比如
fillnull value='N/A'以前填'N/A',现在填N/A。 eval "a b"=1的目标字段名现在去掉双引号,以前引号算在字段名里。- 引号前是符号时(如
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)
这些在 开发与回归测试 和 多值字段复审 里列过,一直没做:
- P-01 API Key 管理:用户登录、管理员和普通用户两种角色、按 index 分权限已经做了(2026-10-15,见 用户登录和 index 权限)。2026-10-16:Key 只能写日志,不能再搜索;租户管理员在页面上新建/删除 Key,超级管理员在页面上开租户。还没做:Key 明文存储(配置文件和 tenants.json),示例 Key(demo-key-change-me 等)必须换掉,要改成哈希存储。登录会话只存在内存里,网关重启要重新登录;还没有单点登录(LDAP、OIDC)。
- P-02 限流和配额:一个租户猛发数据或猛查会影响其他租户。
- P-03 写入缓冲:网关没有本地队列,VictoriaLogs 短暂不可用时全靠客户端重试。
- P-04 公网采集入口:现在只有带密码的预览地址,外部采集端没法直接发数据,需要单独开放 HEC 和 OTLP 路径(建议 HTTPS)。
- P-05 HEC indexer acknowledgement(useACK)不支持。
- P-06 全文搜索超时:原待办,大范围全文查询的超时和取消还没处理。
- P-07 查找表权限:只有管理员(API Key、管理员用户)能改查找表和执行 outputlookup;普通用户即使能看全部 index(*)也不能改(2026-10-16 修正,之前按「能看全部 index」放行)。读取已按表控制(2026-10-16):每张表有「谁能用」(只有管理员 / 租户里所有人 / 能看指定 index 的用户),新表和 outputlookup 存的表默认只有管理员能用;下载、lookup、inputlookup、列表和助理都按它检查。
- P-08 高基数统计的内存:30 天范围、分组很多的 stats 内存问题没有解决;3 亿条压测在最近这些改动后没有重跑。
- P-09 demo 和 bench 测试数据还在库里,没有清理。
- P-10 没有和真实 Splunk 做过对照测试,兼容语义只依据公开文档和我们自己的回归用例。
6. SPL 还没做的部分(不是 bug)
完整列表见 SPL 命令覆盖。用到这些写法时会直接报错并说明原因,不会给出错误结果。比较常用的:
- 命令:transaction、join / append 和子搜索、makeresults、xyseries / transpose、convert。
- stats 缺 range、var、mode、earliest/latest(任意字段)。
- eventstats / streamstats 只支持 count、sum、avg、min、max 和时间类函数;多值字段要先 mvexpand;streamstats 不支持 window=、reset_*。
- eval 缺 strftime / strptime、mv* 系列、json_* 系列、md5 等。
- dedup 不支持 sortby;head 不支持条件;tail / reverse 不能用在 stats 之后;rename 不支持通配符;bin 只支持 _time span=;spath 不支持 path=;addtotals 不支持 col=t 和通配符。
- lookup 没有通配符、CIDR、按时间、不区分大小写匹配。
建议的修复顺序
- I-01(会给错结果,改动范围小)。
- I-03(上传失败留下半份数据),顺带 I-06 的取消按钮。
- I-11、I-12(让复审能跑完全量回归,后面每一条都受益)。
- I-02、I-04、I-07(上传体验)。
- I-08、I-09,以及 I-10 要你确认的行为变化。
- 第 5、6 节按上线计划排期。