19. 可观测性、指标与运维

本章说明可观测性如何同时回答服务是否存活、业务是否可用、数据是否新鲜以及异常是否正在收敛。根平台、注册服务节点、发现服务节点、内容分发平台、链下信任索引器、数据库和官网后端分别产生运行与业务证据;网站可以用旧快照改善访问体验,但旧快照不能替代后台真实健康状态。指标必须带来源、时间、状态和延迟,未知值不得当作零。

本章的观测证据分为四层:服务接口或源码定义的原始事实、后台聚合得到的运行指标、官网页面使用的展示数据,以及运维流程产生的烟测和告警记录。记录指标时至少同时保留 sourceobservedAtdataStatuslag,使“接口没有数据”“数据为零”“展示了旧快照”能够被区分。官网页面的展示结果只能说明前端获得了某次响应,不能代替节点、数据库或链下信任索引器的独立核验。

观测层 核心问题 典型证据
存活 进程是否能响应 liveness 响应、进程状态
就绪 依赖和配置是否满足 readiness、数据库和上游状态
业务 注册、发布、发现是否可用 烟测请求、响应和关联标识
数据 指标和索引是否新鲜 时间窗口、游标、最新序列
运维 故障是否被发现和收敛 日志、告警、恢复记录

19.1 服务健康与就绪模型

检查顺序应从“能否响应”逐步推进到“能否完成业务”:先核对进程和 /health,再核对就绪状态及数据库连接,随后检查根平台、注册服务节点、发现服务节点、内容分发平台和链下信任索引器之间的依赖。一个接口返回 200 只能作为该检查点的证据;只有依赖检查、数据状态和注册/发现业务烟测均通过,才可将服务标记为业务可用。summary 长期失败时,即使页面仍能显示旧快照,也应保持后台失败状态。

liveness 只证明进程能够响应,readiness 还应检查必要依赖和配置,业务烟测则验证注册、发布、发现等真实路径。健康检查应记录目标、响应码、耗时、依赖状态和时间;数据库可连接不等于索引器已追上游事件,摘要接口有响应也不等于统计完整。恢复确认至少需要连续成功的健康检查和对应业务烟测。

状态 能证明什么 不能证明什么
liveness 进程能够响应检查 依赖正常、业务可用
readiness 配置和必要依赖就绪 全网发布和索引完成
业务烟测通过 指定路径在测试条件下可用 所有资源和所有负载均正常
数据过期 最近数据未及时更新 资源已经撤销
指标缺失 当前无法取得指标 指标值为零

19.2 注册指标

注册指标应围绕一次资源登记建立可追踪链路。推荐将 requestId 绑定到注册请求,将 resourceDid、资源版本或内容摘要绑定到登记事实,再将发布序列、分发批次和索引版本绑定到后续阶段。客户端重复点击或网络重试可以产生多个请求记录,但不能因此把同一资源版本重复计入登记成功;VC 为空时应如实记录返回结果,不能把空值解释为有效凭证。周期统计只在聚合层按统一时区计算,前端不得根据页面刷新次数自行累加。

注册指标至少区分请求接收、校验拒绝、登记成功、VC 返回、根平台受理、发布完成和发现可见。去重应使用请求或资源版本关联标识,而不能按 IP 粗略去重;生产统计应排除明确标记的烟测。TODAY、THIS WEEK、THIS MONTH 使用统一时区和半开时间区间,周期值不能因缓存或降级与累计值混淆。

指标 计数单位 关联键 统计注意事项
注册请求 请求或登记尝试 requestId 区分重试和重复提交
登记成功 资源版本登记 resourceDid + version 不等于根平台发布
VC 返回 返回的凭证结果 resourceDid + credentialId 空 VC 不计为有效凭证
根平台发布 发布事实或发布批次 resourceDid + sequence 异步状态单独统计
可发现 索引可查版本 resourceDid + indexVersion 需结合新鲜度

19.3 发布与传播指标

阶段 开始时间 完成时间 主要证据
注册受理 注册服务节点接收请求 登记记录形成 请求标识、资源 DID、响应状态
根平台发布 发布任务创建 根平台可信发布证明形成 发布序列、资源包摘要
内容分发 分发批次发送 内容可校验取得 批次、游标、内容摘要
索引可见 发现服务节点接收 查询能够返回 索引时间、来源、版本

传播指标以资源 DID、版本、内容摘要和发布序列贯穿各阶段,分别记录事件发生、接收、验证、分发和索引时间。端到端延迟是最后可查时间减首次受理时间,不能用某一段耗时替代。重试和重复批次保持幂等计数;游标停滞、序列缺口和节点离线进入积压或失败指标。

传播链路至少应能回答“资源在哪一阶段停止”:注册服务节点已受理但根平台尚未发布,根平台已发布但内容分发未完成,分发完成但发现服务节点尚未索引,或索引已完成但查询条件未命中。可用如下关联关系核对,而不以某个页面上的资源数量代替链路事实:

resourceDid + version
  -> publicationSequence
  -> distributionBatch / contentDigest
  -> discoveryIndexVersion / indexedAt
  -> queryRequestId / visibleAt

同一资源版本的重试应复用幂等键或被标记为重试;如果只有某一阶段的记录,应在运维结果中明确“已受理”“传播中”或“尚未可查”,而不是简单报告为成功。

19.4 发现查询指标

查询类型 必须记录 解释边界
DID 精确查询 DID、耗时、结果数、来源 命中不等于当前可信
结构化查询 条件、耗时、命中和过滤结果 条件匹配不等于可调用
语义查询 原始描述、转换条件、排序结果 相关性不替代控制和治理验证
失败查询 状态码、错误类型、requestId 空结果不能等同于服务故障

发现指标区分 DID 精确查询、结构化条件查询和语义查询,记录请求耗时、结果数、空结果、拒绝、超时和服务端错误。相关性不等于可信度,结果仍须经过状态、凭证、发布证明和新鲜度检查;错误响应保留关联标识,便于从官网请求追到发现服务节点日志。

查询指标至少记录查询模式、标准化后的输入摘要、请求标识、服务节点、命中数量、耗时、响应状态和数据状态。语义查询的原始任务描述可以用于排障和质量分析,但日志与统计不应保存不必要的个人或敏感内容;可用摘要、长度和哈希替代全文。空结果需要结合请求是否合法、索引是否新鲜和资源是否在节点覆盖范围内判断,不能直接归为发现服务故障。DID 精确查询命中后仍须核对资源状态、发布证据和版本。

19.5 索引新鲜度与同步指标

同步状态 = 上游最新序列 - 本地游标 + 最近成功时间 + 最近错误
不确定的新鲜度 -> 标记 unknown,不填充为 0

重建索引、增量同步、暂停同步和同步失败应使用不同状态值;运维人员据此判断是没有新事件、处理延迟还是同步链路中断。 同步观测包括当前事件游标、上游最新序列、落后距离、最近成功时间、最近失败原因、索引更新时间和待处理数量。latest_sequence 持续增长只说明上游存在可观测的新事件,不能单独证明本节点完成索引;落后距离未知时显示未知而不是零。重建索引与增量同步分开标记。

新鲜度判断应同时观察上游最新序列、本地已处理游标、最近成功同步时间和最近错误。链下信任索引器的 latest_sequence 继续增长,只能证明上游仍有可观察事件;还必须核对本地游标是否推进、是否存在序列或摘要缺口,以及发现服务节点是否完成对应索引。没有上游序列、接口失败或节点尚未产生数据时,状态应为 unknownunavailable,不应伪装成落后距离为零。

19.6 治理与授权指标

治理指标记录事件来源、链上位置、事件类型、索引游标、节点状态变化和最后同步时间。授权资格、资源控制权与发布结果分别观测;治理事件被索引不等于所有资源状态已更新,节点正常也不等于每条授权材料都有效。验证失败保留证据和原因。治理观测还应保留原始事件摘要,并分别记录链下信任索引器的接收、解码、投影和对外提供时间;资源控制权由资源自身的签名和 DID 文档证明,节点授权由治理路径证明,二者应在指标和故障分析中分开。

19.7 网络级与节点级统计

Network 页面可同时呈现网络级聚合和节点级明细,但聚合来源、更新时间和缺失节点必须可追溯。所有周期统计采用同一时区、边界和去重规则;使用旧快照时携带快照时间和降级标识。聚合值不简单相加不同口径的累计值。

窗口 起点 终点 适用值
TODAY 当日零点 下一日零点 当日周期值
THIS WEEK 约定周起点 下一周期起点 周期值
THIS MONTH 当月一日 下月一日 月度周期值
ALL TIME 统计起始点 当前查询时刻 累计值

所有窗口使用同一时区和半开区间 [start, end);数据缺失、请求失败和真实零值必须分别编码,不能用零填充缺失值。

19.7.1 网络级指标

网络级指标描述统计范围内的节点和资源,包括节点数量、注册、发布、发现、治理同步和网络状态。每项指标应说明纳入条件、去重方式、来源接口和更新时间;节点缺少数据时,聚合结果标明覆盖范围和缺失情况,不能把未上报节点按零计入。

19.7.2 节点级指标

节点级指标按节点 DID 或稳定节点标识记录健康状态、授权状态、资源处理量、同步游标、索引新鲜度和最近错误。节点离线、未授权、尚未同步以及统计接口失败使用不同状态,避免以零值或空字符串掩盖真实情况。

19.7.3 注册、发布和发现指标

注册、发布和发现指标分别表示注册服务节点受理、根平台可信发布和发现服务节点索引可见,不能合并为一个“成功数”。同一资源版本通过 DID、版本和发布序列关联,重试、重复索引和旧快照不应造成虚假增长。

19.7.4 指标时间窗口

时间窗口采用统一时区和明确边界;周期值使用固定起止时刻,累计值从定义的统计起点计算。接口、官网 Network 页面和后台报表必须采用同一口径,避免服务器时区、请求时间或缓存生成时间差异造成周期值异常。

19.7.5 数据缺失和降级展示

指标缺失、接口失败、尚未产生数据和旧快照展示分别标记。页面可以显示带时间的旧数据,但必须体现降级状态;后台仍记录真实失败,禁止把缺失转成零,或把快照当作实时健康结论。

19.8 链上治理事件可见性

治理事件展示应区分链上事件时间、信任索引器接收和索引时间、官网接口生成时间及页面显示时间。事件序列或链上位置用于排序和追溯,双语描述是展示层映射,不能替代原始事件。链上或索引服务暂不可用时,应显示不可用或延迟状态。

19.9 日志、追踪与关联标识符

跨服务记录至少关联请求标识、资源 DID、版本、发布序列、事件游标和节点标识,并记录时间、级别、结果和错误摘要。日志不得写入私钥或敏感请求内容;公开接口的错误信息应足够定位问题但不泄露内部配置。

接口层的关联字段应与协议类型保持对应:节点间请求使用 requestIdrequestNoncebodyHashupstreamAuth;资源传播使用 publicationCursor、批次序列和资源包版本;发现查询使用请求标识、发现节点 DID、候选数量、检索后端和耗时;链下信任索引器还应记录最后处理 checkpoint、治理序列和同步时间。建议把这些字段组织成结构化日志,而不是只拼接在一条自由文本消息中。

{
  "requestId": "req-example",
  "resourceDid": "did:oan:SKDM:example-resource",
  "packageVersion": "1.0.0",
  "publicationCursor": 42,
  "nodeDid": "did:oan:INDS:example-node",
  "operation": "discovery_query",
  "result": "completed",
  "elapsedMs": 18
}

上例只展示可用于关联处理过程的公开或低敏字段;生产日志仍须按部署策略过滤资源描述、端点凭证、签名材料和内部错误堆栈。requestId 便于跨服务追踪,但不能作为授权凭证,也不能替代资源控制证明或治理事件序列。

19.10 快照、缓存与降级模式行为

状态 前端行为 后台含义
live 展示最新响应 接口和数据正常
stale 展示快照并标识时间 后台刷新失败或数据过期
unavailable 展示不可用原因 接口不可达或返回错误
unknown 不作可信判断 缺少足够证据

快照覆盖必须满足“完整响应、结构校验、来源更新、时间更新”四项条件;部分响应不能覆盖完整旧数据。 旧快照是用户体验机制,不是健康证明。前端可先显示浏览器侧快照,再后台刷新;成功后以完整新数据替换并更新来源和时间;失败时保留快照但显示降级状态,长期失败仍触发后台告警。无缓存首次访问才显示加载状态,不能让加载占位永久遮住已有数据。

快照记录应至少包含数据来源、生成时间、结构版本和数据状态,例如:

{
  "source": "official-discovery-summary",
  "capturedAt": "2026-09-10T10:00:00Z",
  "dataStatus": "stale",
  "schemaVersion": 1,
  "coverage": "official-nodes",
  "payload": { "resourceCount": 12 }
}

其中 resourceCount: 12 只是某次快照中的业务值,不代表当前实时数量。前端可以在刷新失败时继续展示它,但后台仍需记录刷新失败及其持续时间;当接口恢复时,只有通过结构校验的完整响应才能覆盖该快照。

19.10.1 旧快照加载

页面打开时先读取浏览器侧可用快照,并标明生成时间和来源。快照解析失败、结构版本不兼容或内容完整性校验失败时,应丢弃该快照并进入首次加载流程,不得把损坏数据渲染为正常统计。

19.10.2 后台数据刷新

旧快照显示后,前端在后台请求最新接口,不阻塞用户查看已有内容。请求应有超时和失败处理,刷新过程不改变用户正在查看的资源详情或查询结果,除非新响应通过完整结构校验。

19.10.3 新数据覆盖

只有完整且结构有效的新响应才覆盖旧快照,并同步更新缓存时间、来源和数据状态。新响应部分缺失时保留可用旧数据并标记降级,不能用空响应或零值覆盖有效内容。

19.10.4 长期失败与告警

连续失败、长期无数据和同步游标长期不增长应进入后台告警,记录接口、首个失败时间、最近成功时间和错误证据。页面继续展示快照不得抑制告警;恢复须由连续成功和业务检查确认。

19.10.5 无缓存时的首次加载

没有快照时才显示首次加载状态,并在成功、失败或超时后明确结束。失败状态应说明数据暂不可用,不得无限显示加载文字,也不得伪造零值或空的健康结论。

19.11 备份、恢复与灾难恢复

备份对象 恢复后核对 未通过时处理
节点身份和授权 DID、公钥、授权状态 停止节点对外服务
数据库 关键记录、迁移和索引 不启动写入任务
发布队列 未完成任务和幂等键 暂停重复投递
同步游标 游标连续性和上游序列 从可信位置补同步
网站产物 提交、哈希和配置对应 回退或重新构建

备份覆盖节点身份和授权材料、数据库、资源包、发布队列、同步游标、配置版本及网站部署产物;私钥和凭据单独加密并限制访问。恢复后先校验完整性、序列连续性和密钥对应关系,再启动写入任务,并通过健康检查、注册/发现烟测和索引追赶确认恢复。 恢复顺序应先恢复配置和节点身份,再恢复数据库及其迁移、资源包和发布队列,随后校验同步游标、治理授权状态和网站构建产物,最后恢复对外写入。恢复过程要防止旧队列重复发布,也要防止游标倒退造成重复投影;可先以只读或暂停写入方式启动,核对 resourceDid、版本、发布序列和授权状态后再开放写入。/health 通过只说明进程恢复,不能单独证明历史索引、治理投影和未完成发布任务已经恢复。

19.12 部署烟测与功能验证

烟测最小闭环:

  1. 记录部署提交、产物摘要和环境配置。
  2. 检查各服务健康、数据库连接和索引游标。
  3. 使用隔离身份完成注册及预期失败请求。
  4. 检查根平台发布、分发和发现精确/语义查询。
  5. 保存响应、日志、时间线和测试资源清理结果。 烟测使用隔离测试身份和测试资源,保存提交时间、关联标识、响应、日志和清理结果。注册成功不能替代发现验证;还须检查根平台发布、内容分发、索引收敛和数据库状态。任一关键步骤失败、响应不确定或产生未清理的生产数据,都不得宣告部署成功。 烟测结果应形成可复核的时间线,而不是只输出一个“通过”字符串。每一步记录目标地址或服务角色、提交号或产物摘要、请求标识、响应状态、耗时、关键响应字段和副作用清理结果;注册接口的受理成功、根平台发布成功和发现查询命中分别判定。对生产环境不适合写入真实资源时,应使用受控失败请求验证校验逻辑,并使用已有隔离测试资源验证发现路径。任何关键步骤结果不确定,都应保持部署状态为待核查。

19.12.1 注册功能烟测

使用隔离身份和受控资源验证请求校验、控制签名、注册服务节点受理、重复提交和错误响应。若接口返回注册 VC,检查其结构以及与资源 DID、版本或摘要的关联;测试结束后清理测试数据并保存证据。

19.12.2 发现功能烟测

使用已发布的隔离测试资源执行 DID 精确查询和语义查询,核对资源 DID、版本、状态、来源、发布证据和索引时间。结果为空、返回旧版本或接口失败时,结合发布记录和同步游标判断传播延迟还是功能故障。

19.12.3 节点健康检查

逐一检查根平台、注册服务节点、发现服务节点、内容分发平台、链下信任索引器和官网后端的存活、就绪及依赖状态,记录响应码、耗时、版本和检查时间,不能只检查进程是否存在。

19.12.4 数据库和索引器检查

检查数据库连接、迁移状态、关键记录和索引器游标,核对上游最新序列、本地游标和 latest_sequence 的关系及其连续变化,区分没有新事件与同步停止。

19.12.5 失败后的部署处理

关键烟测失败时停止发布确认,保留日志、提交号、产物哈希和测试资源信息,按修复或回滚流程处理。只有重试成功、数据副作用已清理且证据完整,才能重新出具验收结果。

19.13 数据保留、删除与隐私操作

公开指标只返回必要的聚合数据;访问统计、请求关联标识和运维日志应由后台权限控制。浏览器侧本地身份私钥、备份内容和用户提交的敏感材料不得写入访问统计。删除操作要说明在线数据、备份副本和不可变审计记录的不同保留规则。

19.14 运维告警与长期失败检测

告警记录应至少包括服务、接口、首次失败时间、最近成功时间、连续失败次数、错误摘要、影响范围和当前状态。

状态 触发依据 恢复条件
间歇失败 窗口内少量请求失败 后续请求连续成功
连续失败 连续请求超过阈值失败 健康和业务检查连续成功
长期停滞 指标或游标超过允许时长未更新 数据恢复且序列重新推进
依赖故障 上游或数据库不可用 依赖恢复并完成回归烟测

同一故障使用稳定指纹去重;恢复告警必须同时有连续健康检查和对应业务烟测,不能只依据进程重新启动。 长期失败检测覆盖 summary、治理同步、发布队列和索引游标停滞。告警记录服务、接口、连续失败次数、首个失败时间、最近成功时间、错误摘要和影响范围,并对同一故障去重;恢复需有连续成功和业务验证。网站继续显示旧快照时,后台告警不得被抑制。 summary 接口等周期性检查应保存“最近一次成功”和“最近一次失败”两条事实,而不是只保留当前状态。告警事件至少关联服务角色、接口、时间窗口、连续失败次数、最近成功序列或时间、错误摘要和影响范围;同一接口的短暂网络抖动可合并为一个故障指纹,持续失败则升级处理。恢复时应先确认接口连续成功,再确认数据时间或游标重新推进,最后执行受影响的注册/发现业务烟测。浏览器继续显示旧快照不能暂停或清除这条告警。

19.15 公共服务状态与维护通信

公共状态信息说明受影响服务、开始时间、当前状态、数据延迟和下一次更新,不暴露密钥、内部地址或用户数据。维护期间可以保留只读查询或旧快照,但应标明时间点和不可用功能;恢复公告以实际检查和业务烟测为依据。

参考来源

来源 类型 链接
oan-root-services 代码仓:根平台状态、发布和分发指标 https://github.com/OpenAgenet/oan-root-services
oan-registrar-node 代码仓:注册服务状态、登记统计和健康接口 https://github.com/OpenAgenet/oan-registrar-node
oan-discovery-node 代码仓:同步、索引、查询和新鲜度指标 https://github.com/OpenAgenet/oan-discovery-node
oan-trust-indexer 代码仓:同步游标、投影状态和治理指标 https://github.com/OpenAgenet/oan-trust-indexer
OAN Yellow Paper arXiv 黄皮书:运行状态和信任证据边界 https://arxiv.org/abs/2606.03163
On this page