诊断信息持久化服务

Fuchsia 诊断持久性服务会在设备重新启动后保留诊断数据。

运作方式

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

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

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

每个标记在两个方面都受到限制:大小限制,以及持久化速率受到限制。

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

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

如何使用持久性

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

定义数据

确定您要保留的数据。如果尚未写入 Inspect,请添加代码进行发布。请注意,请求发送后一段时间(尤其是在启用了时间退避时间的情况下),系统可能会通过持久性提取数据。

将您的数据列入许可名单

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

配置持久性

将文件放入 //src/diagnostics/config/persistent 或 //vendor/*/diagnostics/config/CPA 中。 文件必须命名为 *.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 操作(或提出疑虑)。
  • 当 Privacy 对 CL 进行 +2 推荐(此过程可能需要大约一周)后,它会显示所有者的批准,您可以提交该 CL。

路由和使用服务

每个服务名称都将以 fuchsia.diagnostics.persist.DataPersistence-service-name 的形式发布。此 API 必须传送到将使用为该服务定义的代码的任何组件。

该服务的 FIDL 协议位于 //src/diagnostics/persistent/fidl/persist.fidl 中。函数调用是

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

预期结果为 PersistResult::QUEUED

使用已发布的数据

下次启动时,存储的数据将在延迟(目前为 120 秒)后发布到 Inspect。

对于服务为 my-service、标记为 my-tagINSPECT:core/test_component:root/path:number 选择器,数据位于 core/diagnostics-persistence:root/persist/my-service/my-tag/core\test_component/root/path:number 下。