偶发:platform-llm 追踪测试在 CI 上捕获不到 llm.request span(provider_span_preserves_upstream_errors_and_closes_on_cancellation) #512
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
现象
PR #507 的 CI run 2900(sha
8514f109)里 job「AI game creator shell Rust crates」失败:断言位置是
Capture::provider_span()中的assert_eq!(provider_spans.len(), 1):一个名为llm.request的 span 都没被捕获到(0 个)。997eba2b)同一测试通过 → 偶发,不是稳定失败。定位
server-rs/crates/platform-llm/src/observability_tests.rs:293-333(provider_span_preserves_upstream_errors_and_closes_on_cancellation):with_subscriber(tracing_subscriber::registry().with(capture.clone()))采集 span,本地 TCP fixture 在另一个线程里服务请求。Box::pin(fixture.client.run(request())))→tokio::select!等 fixture 线程发出的entered信号 → 立刻断言 span 已存在、未关闭 →drop(future)取消 → 释放 fixture → 收尾断言。entered的语义只是「fixture 收到了请求」,而 span 由被测代码在请求路径上建立。CI 上同时跑 8 个 lane、机器负载高时,主测试任务可能在 span 建立之前就先观察到entered并执行断言,于是provider_spans.len() == 0。provider_span_covers_awaited_execution_and_keeps_parent_without_arguments与stream_callbacks_inherit_provider_span_and_keep_result用的是同一模式,理论上有同样风险。复现状态
本地连续 3 次跑整个
cargo test -p platform-llm --lib(161 tests、默认并行)均全绿,单机无法稳定复现;CI 上表现为负载相关的时序问题。影响
建议修法(任选其一)
capture.provider_span()换成带超时的轮询(例如 200ms 内每 5ms 检查),超时才失败,并在失败信息里带上已捕获的 span 名称,便于下次一眼看出是「没建立」还是「名字变了」。entered改在「请求已进入被测代码且 span 已建立」之后才发出(例如由被测路径上的 hook/一次性哨兵触发),断言时就不存在这个窗口。#[tokio::test(flavor = "current_thread")]),或在释放 fixture 前先让出执行权。验收
cargo test -p platform-llm --lib(默认并行)全绿。相关(同类偶发,未在本 issue 处理)
a07bff85)job「AI game creator shell Rust lane 1/2」:src/command_exec.rs:3409的测试在 shard 跑满 200.1s 后失败([rust-shards] shard 1/4 FAILED ... in 200.1s)——同类时间敏感/超时脆弱,建议单独跟踪。