Fuchsia 诊断持久性服务可在设备重新启动后保持诊断数据不变。
运作方式
当服务被触发时,持久性会读取一组诊断数据并将数据存储到磁盘。在下次启动时,持久性会在其自己的检查层次结构中发布存储的数据。
持久性通过配置文件中的条目进行配置。每个条目都指定了服务名称、该服务中的标记以及一组选择器。服务名称用于配置 FIDL 服务。
通过 FIDL 将持久保留数据的请求传递给 Persistence,请求持久保留相应标记的选择器。没有定期抽样。每条消息都包含一个标记。
每个标记都受到两方面的限制:大小上限和持久性速率限制。
如果请求到达速度过快,系统会将其延迟到退避时间过期后处理。 在退避期间到达的多个请求将合并为一个请求。
如果请求的选择器提取的数据过多,系统将改为存储错误字符串,这会覆盖该请求之前存储的所有数据。
如何使用持久性
如需保留数据并发布,请按照以下步骤操作:
定义数据
确定要保留哪些数据。如果尚未写入“检查”窗口,请添加代码以发布该事件。请注意,持久性可能会在发送请求后的一段时间内提取数据,尤其是在时间退避处于有效状态时。
将数据列入许可名单
持久性从 fuchsia.diagnostics.ArchiveAccessor.feedback
读取,因此您需要在相应流水线的配置文件中将检查数据列入许可名单。
配置持久性
将文件放入 //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
- 将 claytonmccray@、crjohns@ 和 bbosak@ 添加到 CL。
- 其中一人将为 CL 添加 +1,并添加隐私权审核者。
- 隐私权团队的某位成员会为该 CL +2(或提出疑虑)。
- 当 CL 因隐私权问题被 +2'd 时(可能需要大约一周的时间),它将显示所有者批准,然后您就可以提交了。
路由和使用服务
每个服务名称都将以 fuchsia.diagnostics.persist.DataPersistence-service-name 的形式发布在“diagnostics-persist-capabilities”字典中。此事件必须路由到将使用为相应服务定义的标记的任何组件。
相应服务的 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
下找到相应数据。