RFC-0175:ELF Runner stdio 转发默认值

RFC-0175:ELF Runner stdio 转发默认设置
状态已接受
领域
  • 组件框架
说明

通过默认将 stdout/stderr 转发到 LogSink,改善组件开发者体验。

问题
  • 91082
Gerrit 更改
  • 686908
作者
审核人
提交日期(年-月-日)2022-06-03
审核日期(年-月-日)2022-07-06

总结

ELF runner 更改为默认将 stdout 和 stderr 转发到 LogSink(如果有)。

设计初衷

此 RFC 基于 RFC-0069 构建,RFC-0069 指定了 ELF 运行程序的一项功能,用于支持向 fuchsia.logger.LogSink 转发 stdout 和 stderr 文件。自实现该功能以来,我们发现在许多情况下,组件具有 LogSink,但在从组件 v1 迁移到 v2 时缺少重要的日志消息,因为它们的 stdout/stderr 消息在转换过程中会被静默丢弃。

Fuchsia 的测试运行程序默认捕获并输出 stdout 和 stderr,但 ELF 运行程序的不同行为经常导致用户感到困惑,而这种行为需要显式转发。

如果代码仅在不常使用的故障模式中使用 stdio,那么未配置的 stdout 或 stderr 问题会更加严重,从而导致正式版崩溃报告缺少关键信息。例如,ZX_ASSERT 宏向 stderr 报告失败的断言,而 HLCPP FIDL 绑定会向 stderr 报告某些类型的解析失败情况。

利益相关方

教员:hjfreyer@google.com

审核者

  • geb@google.com(组件框架)
  • yaNeuraly@google.com(RFC-0069 作者)

咨询人员:hjfreyer@google.com、abdulla@google.com、miguelfrde@google.com、surajmalhotra@google.com、wez@google.com、shayba@google.com

社交:此 RFC 是组件框架团队电子邮件和离线讨论的结果。

设计

如果 ELF 组件的作者在其 program 部分中未指定 forward_stdout_toforward_stderr_to 字段,则 ELF 运行程序会尝试为未指定的数据流设置转发。在此配置中,如果未能将 stdio 流转发到 LogSink,系统将保持静默,并且仍会启动组件。

实现

我们将放宽将 stdio 转发到 LogSink 的行为,以便组件在请求转发但没有 LogSink 时仍会启动。

如果在组件清单中未指定任何值,ELF 运行程序将假定默认值为 forward_stdout_to: "log"forward_stderr_to: "log"

如果初始化该转发时出错,ELF 运行程序仍将为已请求或默认转发转发的已发布组件提供 stdout 和/或 stderr 句柄。

性能

我们预计此项变更不会产生明显的性能差异。

工效学设计

具有实用的默认行为应该会减少组件开发者需要做出的决策数量,从而提高工效学设计。

实现此变更后,我们将删除 sdk/lib/syslog/elf_stdio.shard.cml,并将其客户端切换到主 Syslog 分片,主 Syslog 分片将与 ELF 组件具有相同的行为。

向后兼容性

如果组件不包含 LogSink 且使用默认 stdio 转发配置,则尝试在其命名空间中打开 LogSink 时,组件管理器的日志中会出现路由错误。在首次发布新的默认值时,我们将在不使用 LogSink 的平台组件清单中添加显式 forward_std{out,err}_to: "none" 字段。将来,可以使用更复杂的命名空间探测来确定组件是否应该具有 LogSink 可用,从而消除这些错误消息。

安全注意事项

此设计不会通过向组件授予任何其他功能来增加组件的权限,只有在组件的清单请求 LogSink 并且组件被路由该功能时,才会启用转发。

隐私注意事项

这会导致系统向系统日志中写入额外的日志消息,其中可能包含用户生成的数据。日志记录流水线已设有审核和擦除隐私敏感数据的控件,因此此处无需进行任何更改。

测试

现有的 stdio 转发功能集成测试将进行扩展,以涵盖默认场景。

文档

很多组件开发者指南需要更新,这通常是为了移除必须设置 stdio 转发的警告。这表示这项变更将降低开发或迁移组件的认知复杂性。

缺点、替代方案和未知情况

缺点:增加了“魔力”

与大多数组件功能不同,此更改增加了启动 ELF 组件的行为,而无需在清单中指定任何内容。不过,这种行为变更并不会增加向组件授予的权限。

此 RFC 中提议的行为尝试了在组件框架设计原则(显式性、最小权限)和开发者对类似 POSIX 的现有系统(stdio 无所不在且非常有用)中的预期之间的折衷。

替代方案:对运行程序进行合理化

如果我们更改测试运行程序,使其实际使用 ELF 运行程序作为其基本实现,我们可以使 ELF 运行程序和测试运行程序的行为更相似。 目前,ELF 和测试运行程序共享 Rust 库中的实现代码,但它们可以通过允许运行程序委托给另一个运行程序来实现其实现,从而共享实现代码。

因为许多其他原因,这是一个颇具吸引力的方向。与更改 ELF 运行程序的默认设置相比,这是一项更大的任务,作者认为我们仍然希望将此 RFC 的行为作为 ELF 运行程序中的默认行为,以确保统一的开发者体验。

早期技术和参考资料

此 RFC 提议对 RFC-0069 中所述的功能进行扩展。