诊断信息持久化服务

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

运作方式

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

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

持久化数据的请求由 FIDL 传递给 Persistence,请求持久化该标记的选择器。不会进行定期抽样。每条消息包含一个标记。

每个代码都会受到两方面的限制:大小上限和持久化速率限制。

如果请求到达速度过快,系统会将其推迟到后退期限结束后再处理。在退避期内到达的多个请求将合并为一个请求。

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

如何使用持久性

如需将数据持久化并发布,请按以下步骤操作:

定义数据

确定要保留哪些数据。如果尚未将其写入 Inspect,请添加代码进行发布。请注意,在发送请求后,持久化功能可能会在一段时间后提取数据,尤其是在启用时间回退时。

将您的数据列入许可名单

持久性会从 fuchsia.diagnostics.ArchiveAccessor.feedback 读取数据,因此您需要在相应流水线的配置文件中将 Inspect 数据列入许可名单。

配置持久性

将文件放入 //src/diagnostics/config/persistence 或 //vendor/*/diagnostics/config/persistence。文件必须命名为 *.persist。将文件添加到 BUILD.gn 中的 persistence_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'd
  • 将 cphoenix@ 和 miguelfrde@ 添加到 CL。
  • 我们会为该 CL 评分 +1,并将隐私权团队添加到该 CL。
  • 隐私权团队的人员会将 CL 的优先级提升到 2(或提出疑虑)。
  • 当隐私权团队将 CL 评分为 +2 后(可能需要大约一周的时间),CL 将显示“OWNERS approval”(所有者批准),您就可以提交了。

路由和使用服务

每个服务名称都将发布为 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

使用已发布的数据

在下次启动时,软件更新检查完成后,系统会立即将存储的数据发布到 Inspect。

如果选择器为 INSPECT:core/test_component:root/path:number,服务为 my-service,代码为 my-tag,则数据将位于 core/diagnostics-persistence:root/persist/my-service/my-tag/core\test_component/root/path:number 下。