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

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

默认将 stdout/stderr 转发到 LogSink,从而改进了组件开发者体验。

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

摘要

ELF 运行程序更改为默认将 stdout 和 stderr 转发到 LogSink(如果可用)。

设计初衷

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

Fuchsia 的测试运行程序默认会捕获并输出标准输出和标准错误输出,而用户经常会因 ELF 运行程序的不同行为而感到困惑,因为该运行程序需要显式转发。

如果代码仅在不常使用的失败模式下使用 stdio,未配置的 stdout 或 stderr 带来的意外会更加明显,导致生产崩溃报告缺少关键信息。例如,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 是 Component Framework 团队通过电子邮件和线下讨论得出的成果。

设计

如果 ELF 组件的作者在其 program 部分中未指定 forward_stdout_toforward_stderr_to 字段,则 ELF 运行程序将尝试为未指定的串流设置转发。在此配置中,如果无法将 stdio 流转发到 LogSink,系统将不会发出任何提示,并且组件仍会启动。

实现

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

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

如果初始化转发时出现错误,ELF 运行程序仍会向请求或默认转发的已启动组件提供 stdout 和/或 stderr 句柄。

性能

我们预计此次更改不会导致出现明显的性能差异。

工效学设计

提供实用的默认行为应该可以减少组件开发者需要做出的决策数量,从而改善人体工学。

在完成此更改的实现后,我们将删除 sdk/lib/syslog/elf_stdio.shard.cml,并将其客户端切换到主要的 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 中所述功能的扩展。