CRS 内部控制台

健康探针POST /v1/probe · crs.tongsou.com

调度器专用的同步接口。返回精简结构,不返回完整网页对象,探针页面不入库。

本页数据来自哪里

CONVENTION.md 适用范围 · 配置项、日志字段、指标名同样适用命名规则

⚠️ 探针不落任何 TiKV 表downloader:* 只有两张表:fetch_resultdomain_runtime,入口 C 内部强制 should_store = false,探针页面也不入网页库。本页的记录来自应用日志与指标,字段名同样遵守命名规范。

⚠️ 探针的状态(下次什么时候探、退避到多久、探了几次)在调度器的 scheduler:domain_health_runtime,唯一写入方是调度器。本页只记录「下载器这一侧被调用了什么、返回了什么」。

24 小时概况

量级为每域名每 30 秒到 24 小时一次,不破坏背压模型

probe count探针总次数
12,405
has_reached_origin = true确实到达对方
12,347
has_reached_origin = false我方自己的问题
58
should_render = true渲染探针
563

⚠️ 探针用 should_render = false 只发一个请求;一次完整渲染要拉 HTML + JS bundle + 若干 XHR,是 10~30 个请求。所以 30 秒一次探针 ≈ 2 请求/分钟,而正常抓取是 600~1800 请求/分钟。探针频率不受「礼貌」约束 —— 真正会把对方干崩的,恰恰是没有熔断时那一万条 URL 的集体撞墙。

has_reached_origin 是这个接口最重要的字段

它区分「下载器自己出问题」与「目标站出问题」

cause原因 24h count24h 次数 scheduler action调度器动作(引用,本服务不执行)
自身限速拒绝41不退避、不计 probe_count、原地重试
本地队列满11同上
Obscura 起不来6同上
到达对方但失败1,139正常退避

⚠️ 前三行合计 58 次,都是我方的问题,退避不该翻倍。否则我方一抖,所有暂停域名的恢复时间集体翻倍,故障范围被自身放大到全库。少了这个字段,我方抖一次的代价从「本机短暂不可用」变成「全库暂停域名恢复延迟翻倍」。

⚠️ 判据只有一条:这次请求有没有真的到达对方服务器。同一条判据也用在渲染超时与 Obscura 崩溃上 —— 那两类同样不计域名熔断。

探针记录

近期抽样 · should_render = false 时 text_length 与 health_signal 的 XHR 各项为 null

domain域名 url探测地址 should_render是否渲染 http_statusHTTP 状态 raw_text_length渲染前文本长度 text_length渲染后文本长度 has_reached_origin是否到达对方 fail_reason失败原因 actions操作
news.example.twhttps://news.example.tw/ false200180null true 限速
m.example.hkhttps://m.example.hk/ false502nullnull true网关够不到源站 限速
m.example.hkhttps://m.example.hk/ true2001682,904 true 限速
shop.example.jphttps://shop.example.jp/ true200960 true 限速
blog.example.comhttps://blog.example.com/ falsenullnullnull false自身限速拒绝 限速

⚠️ 第二、三行是两段式恢复的一次完整过程:先 should_render = false 拿到 2xx,再 should_render = true 确认内容。只用便宜探针会在「网关起了后端没起」时判定恢复,然后一万条 URL 抓回来全是空壳 —— 这在生产环境会真实发生。

⚠️ 第四行 text_length = 0:渲染探针拿到 200 但没有内容。本服务如实返回,判定归调度器content_layer_failure,DEV-scheduler.md §9.4)。

⚠️ 第五行 has_reached_origin = falsehttp_statusnull:请求压根没发出去。本行不构成对方的任何证据。

响应结构

CONTRACT.md §二 · 返回精简结构而非完整网页对象

field字段 type类型 note说明
domain域名string原样回传
http_statusHTTP 状态int全系统同一个名字
raw_text_length渲染前文本长度intshould_render = false 时也有
text_length渲染后文本长度int / nullshould_render = false 时为 null
health_signal健康信号object / null与 report 里的同一个结构,调度器只认一种形状
fail_reason失败原因string / null取值集尚未定义,见抓取状态页
has_reached_origin是否到达对方bool必须有

⚠️ 不返回完整网页对象。否则调度器要跟踪网页对象 schema —— 它现在只认 report 摘要,这条耦合不能加。加上了,下载器改一个字段就要动调度器。

⚠️ 布尔用前缀不用裸名词:has_reached_origin 而不是 reachedshould_render 而不是 render —— 后者既是动词(要不要渲染)又是名词(渲染产物),should_ 前缀把两者分开。