诊断信息持久化服务

Fuchsia 诊断持久性服务将诊断数据从 设备重新启动。

工作原理

当服务触发时,Persistence 会读取多组诊断数据并 将数据存储到磁盘。持久性将存储的数据发布到自己的 在下次启动时检查层次结构。

持久性由配置文件中的条目配置。每个条目指定一个 服务名称、服务中的标记和一组选择器。服务 name 配置 FIDL 服务。

持久保留数据的请求由 FIDL 传送至 Persistence,请求 应保留标记的选择器。没有定期采样。每个 消息包含一个标记。

每个代码都受到两个方面的限制:大小有限制, 受限。

请求到达得过快将被延迟,直到退避时间结束。 在退避期内收到的多个请求将合并为一个请求。

如果请求的选择器提取了过多的数据,就会存储错误 该字符串将覆盖之前为该请求存储的所有数据。

如何使用持久化

如需保留数据并发布,请按以下步骤操作:

定义数据

确定要保留的数据。如果它尚未被写入 检查并添加代码,以进行发布。请注意,Google Cloud 服务可能会抓取数据 请求发送后保留一段时间,尤其是在 退避时间。

将数据列入许可名单

持久性从 FeedbackArchiveAccessor 读取数据,因此您需要 检查在该流水线的配置文件中列入许可名单的数据。

配置持久性

将文件放入 //src/diagnostics/config/persistent 或 //vendor/*/diagnostics/config/persistence. 文件必须命名为 *.persist。将文件添加到 BUILD.gn 中的 persistent_files 中。

.persist 文件采用 JSON5 格式。每个文件都包含一个 对象数组。 每个对象都具有以下架构:

{
        tag: 'any-name-you-like', // lowercase and hyphens only
        service_name: 'service-name', // lowercase and hyphens only
        max_bytes: 1000, // limit on size of JSON-format data persisted
        min_seconds_between_fetch: 60, // limit on frequency
        selectors: [
            'INSPECT:core/component:root/path:leaf_name',
            'INSPECT:core/component:root/*:another_leaf',
        ],
},

所有字段均为必填字段。可以从任何组件中提取数据 只能由将该服务路由至这些组件的组件请求。

每项服务的标记名称必须是唯一的。配置文件名可以任意设置 无法在配置目录之间复制。

获得隐私权批准

隐私权需要检查持久性配置。如需申请审核,请按以下步骤操作:

  • 获取 CL +2
  • 将 cphoenix@ 和 miguelfrde@ 添加到 CL。
  • 我们将对该 CL +1,并将隐私权团队添加到该 CL。
  • 负责隐私保护的人员将会对该 CL +2(或提出疑虑)。
  • 当隐私权功能为 CL +2 时(此过程可能需要大约一周的时间),它会显示 获得所有者批准后即可提交。

路由和使用服务

每个服务名称都将发布为 fuchsia.diagnostics.persist.DataPersistence-service-name。这必须通过 任何组件将使用为该服务定义的标记。

该服务的 FIDL 协议位于 //src/diagnostics/persistence/fidl/persist.fidl.函数调用为

protocol DataPersistence {
    Persist(string:MAX_NAME_SIZE tag) -> (PersistResult result);
};

预期结果为 PersistResult::QUEUED

使用已发布的数据

下次启动时,存储的数据将在延迟一段时间后发布到“检查” (目前为 120 秒)。

对于 INSPECT:core/test_component:root/path:number 的选择器和某项服务 下为 my-servicemy-tag 标记,数据可在以下位置找到: core/diagnostics-persistence:root/persist/my-service/my-tag/core\test_component/root/path:number