RFC-0175:ELF Runner stdio 转发默认设置 | |
---|---|
状态 | 已接受 |
领域 |
|
说明 | 通过默认将 stdout/stderr 转发到 LogSink,改善组件开发者体验。 |
问题 | |
Gerrit 更改 | |
作者 | |
审核人 | |
提交日期(年-月-日) | 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_to
或 forward_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 中所述的功能进行扩展。