125k

注册表健康状况

公共注册表的监控方式和评分标准。

注册表加入目录后可能发生变化或离线。注册表健康检查会持续监控,让用户了解注册表是否正常工作,也帮助维护者尽早发现问题。

我们会检查注册表是否在线、是否符合注册表格式,以及能否与 shadcn CLI 配合使用。检查结果会汇总为状态和评分。

**注册表健康检查仅适用于 shadcn/ui 注册表目录中的注册表。**它不会监控或影响私有注册表、直接在项目中配置的注册表,或通过 owner/repo/item 地址使用的 GitHub 注册表。

注册表发布后才会开始监控。监控不会决定注册表能否加入目录,检查失败也不会导致其被撤下。未来版本的注册表目录可能会在常规浏览中隐藏不可用的注册表,但仍会将它保留在 API 中。

检查内容

频率检查项检查内容
每小时注册表索引索引在线、有效且配置正确。
每日注册表项轮换抽样的项目可下载并通过验证。
每周CLI轮换抽样的项目可通过 shadcn add --dry-run 使用。

项目检查会在约 30 天内轮流覆盖整个目录。定时任务尽力运行,因此我们使用每次实际观察的时间,而不假定所有计划中的检查都已执行。

状态

状态会显示注册表当前的运行情况:

状态含义
Observing正在至少 24 小时内收集前 24 次索引检查结果。
Healthy初始观察期已结束,近期检查均已通过。
Degraded注册表在线,但近期有一项或多项检查失败。
Unavailable注册表索引已至少 24 小时未通过检查。

初始观察期结束前,注册表也可能变为 Unavailable。出现以下情况时,我们会将注册表标记为 Degraded:

  • 索引连续三次检查失败。
  • 最新索引不符合注册表模式。
  • 至少完成 10 次检查后,抽样项目的通过率仍低于 90%。
  • 最近两次 CLI 检查均失败。

状态可能会先于总评分对近期问题作出反应。因此,注册表即使评分较高,也可能处于 Degraded 状态。

每种状态都会附带一条简短、易读的原因说明。API 使用方可以读取稳定的 statusReason.code,也可以显示 statusReason.message。监控器的原始错误不会公开。

可用性检查失败后,注册表需要连续两次通过索引和模式检查才能恢复。其他降级状态会在相应失败检查恢复正常后解除。

评分

每个注册表都会获得一个满分为 100 分的总评分,由四个部分相加得出。各部分的分值并非各自按 100 分计算。

组成部分分值衡量内容
可靠性45过去 7 天和 30 天内注册表索引的可用情况。
正确性25索引和抽样项目是否符合注册表模式。
可安装性20抽样项目能否通过 shadcn CLI 安装。
注册表配置10HTTPS、JSON 响应、项目名称唯一性以及注册表名称是否匹配。

评分衡量的是可靠性和兼容性,不代表受欢迎程度、代码质量、设计质量或注册表包含的项目数量。

分值计算方式

近期的可用性比更早的记录权重更高:

Reliability = 45 * (0.65 * availability7d + 0.35 * availability30d)

正确性部分中,索引最多占 10 分,抽样项目最多占 15 分:

Correctness = 10 * indexSchemaPassRate30d
            + 15 * sampledItemPassRate30d

可安装性根据 CLI 检查结果计算:

Installability = 20 * dryRunPassRate30d

注册表配置部分包含四项检查,每项 2.5 分。如果尚未观察到某项配置信号,在能够检查之前,该项先计 1.25 分。

每个组成部分都四舍五入到小数点后三位。公开评分是这些舍入后数值的总和。

新注册表的评分

新注册表的历史数据不足以支撑可靠评分。我们会将早期结果与所有受监控注册表的平均值进行平滑处理。随着检查数据不断积累,该注册表自身结果所占的比重会逐渐增加。

这样可以避免一次成功检查就得到满分,或一次失败检查就得到零分。这也解释了为什么处于 Observing 状态的注册表仍可能获得接近总体平均值的评分。

供 API 使用方参考的平滑公式为:

(successes + globalMean * priorWeight) / (observations + priorWeight)

先验权重根据各项检查的频率设定:

指标先验权重
可用性24
索引模式有效性12
抽样项目有效性10
CLI 检查3

当整个注册表目录的数据不足以计算平均值时,可用性先验值设为 85%,其他测量比率的先验值设为 90%。公式、权重或阈值发生变化时,必须更新 scoreVersion。

API 中的健康数据

/r/registries.json 会为每个注册表添加可选的 health 对象,其中包括:

  • 当前的 status 和 statusReason。
  • 总评分 score 及其组成部分 breakdown。
  • 经过平滑处理的 availability7d 和 availability30d 可用率,取值范围为 0 到 1。
  • firstObservedAt、checkedAt 和 lastSuccessfulCheck 时间戳。
  • 供集成使用的 schemaVersion 和 scoreVersion。

该对象还包含两个标记:

  • monitoringLimited 表示最近一次注册表索引请求受到 CDN 或 WAF 挑战阻拦。挑战响应不会计为可用性或抽样项目验证失败。
  • 连续七天不可用后,hidden 会变为 true。

目前注册表目录不会使用 hidden 标记。

监控限制

所有检查都来自同一个托管运行器。因此,延迟只作为内部诊断数据保存,不会影响评分,以免某些地区获得不公平的优势。

CDN 和 WAF 挑战也会单独处理。挑战只表示我们的运行器无法完成检查,并不代表该注册表对所有人都不可用。

后续计划

在注册表目录使用健康数据之前,我们会先收集并审查基线数据。监控数据达到可靠水平后,排名、筛选和健康状态界面会作为单独更新发布。