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
下。