 q792602257andClaude Opus 5
|
865bbe3724
|
feat(observability): 抓取会话逐次尝试与升级路径记成 event
重试链路的关键信息是「升级路径」,而属性表达不了过程:同名属性后写覆盖先写,
三次尝试跑完只剩最后一次的状态码,前两次为什么失败、升到哪一级全被盖掉。
- site_session / rakuma_session:每次尝试各记一条 scrape.attempt event,带
attempt / outcome / status_code / 截断后的错误串;outcome 区分 http_error、
bad_status、challenge、validate_failed
- site_session 的每次升级各记一条 scrape.escalate:rewarm_on_home、浏览器兜底
recovered / failed。兜底失败也要记——不然链路里只剩「最终失败」,看不出浏览器
这一级试过没有,而「没装 playwright」和「装了也被挡」是两个查法(reason 取
BrowserFallback.unavailable_reason,为 None 时由 add_event 跳过)
- 三处 span.record_exception 换成 record_error,失败的错误码与可重试位跟着落下来
- 失败页面快照带上 url 与 profile,省得回头对是哪条通道的哪个地址
测试:test_scrape_telemetry.py 补一条会话层用例,用 MockTransport 让所有请求都回
挑战页,断言三次尝试各留一条 event(而不是只剩最后一次)、升级路径依次是
rewarm_on_home → browser,以及浏览器那一级的 outcome=failed 与 reason。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-08-28 16:18:25 +08:00 |
|
 q792602257andClaude Opus 5
|
8403b9b586
|
test(observability): 补抓取客户端与网关客户端的埋点测试
上一提交(8381896)的配套测试,钉住两个失败可见性问题:
- 抓取侧回归:失败分支原先写的是无参 `span.record_exception()`,而 exception
是必填位置参数——每次抓取失败都会在记异常时抛 TypeError,把真正的原因(反爬
阻断 / 解析失败)整个顶替掉,失败页面快照也永远落不下来(抛错在 snapshot
之前)。测试断言业务异常原样抛出、stage 能区分 fetch/parse/delegate、
parse 阶段确实落了快照且带得上 URL
- 网关侧:success=false code=6002 在 HTTP 层是 200,断言 span 记下了信封结论;
以及空转长轮询在 suppressed() 里确实不产 span,抑制之外照常产(防止空断言
是因为埋点根本没生效)
- 两个文件都各带一条成功路径对照,证明 ERROR 状态不是恒真
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-08-28 16:08:35 +08:00 |
|