诊断信息持久化服务

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 下找到相应数据。