| RFC-0175:ELF Runner stdio 转发默认值 | |
|---|---|
| 状态 | 已接受 |
| 区域 |
|
| 说明 | 默认情况下将 stdout/stderr 转发到 LogSink,从而改善组件开发者体验。 |
| 问题 | |
| Gerrit 更改 | |
| 作者 | |
| 审核人 | |
| 提交日期(年-月-日) | 2022-06-03 |
| 审核日期(年-月-日) | 2022-07-06 |
摘要
将 ELF 运行程序更改为默认将 stdout 和 stderr 转发到 LogSink(如果可用)。
设计初衷
此 RFC 基于 RFC-0069 构建,后者指定了一项功能,使 ELF 运行程序能够支持将 stdout 和 stderr 转发到 fuchsia.logger.LogSink。自实现该功能以来,我们发现了一些场景,其中组件具有 LogSink,但在从组件 v1 迁移到 v2 时会丢失重要的日志消息,因为它们的 stdout/stderr 消息在转换过程中会被静默丢弃。
Fuchsia 的测试运行程序默认捕获并打印 stdout 和 stderr,但用户经常会因 ELF 运行程序的不同行为而感到困惑,因为 ELF 运行程序需要显式转发。
当代码仅在不常用的失败模式下使用标准输入/输出时,未配置标准输出或标准错误的意外情况会更加严重,导致生产崩溃报告缺少关键信息。例如,ZX_ASSERT 宏会将失败的断言报告给 stderr,而 HLCPP FIDL 绑定会将某些类型的解析失败报告给 stderr。
利益相关方
教员:hjfreyer@google.com
审核者:
- geb@google.com(组件框架)
- yaneury@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_to 或 forward_stderr_to 字段,则 ELF 运行程序将尝试为未指定的流设置转发。在此配置中,如果未能将 stdio 流转发到 LogSink,系统不会发出任何提示,但组件仍会启动。
实现
我们将放宽将标准输入/输出转发到 LogSink 的行为,以便在组件请求转发但没有 LogSink 时,仍能启动这些组件。
如果组件的清单中未指定 forward_stdout_to: "log" 或 forward_stderr_to: "log",ELF 运行程序将采用默认值。
如果初始化转发时出现错误,ELF Runner 仍会向请求或默认转发的已启动组件提供 stdout 和/或 stderr 句柄。
性能
我们预计此项更改不会导致效果出现显著差异。
工效学设计
有用的默认行为应能减少组件开发者需要做出的决策数量,从而提高人体工程学效果。
在实现此变更并将其客户端切换到主 syslog 分片后,我们将删除 sdk/lib/syslog/elf_stdio.shard.cml,该分片将具有与 ELF 组件相同的行为。
向后兼容性
如果组件没有 LogSink 且采用默认的 stdio 转发配置,则当组件尝试在其命名空间中打开 LogSink 时,会在 Component Manager 的日志中生成路由错误。在首次推出新默认设置时,我们将向没有 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 中描述的功能进行扩展。