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

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

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

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

摘要

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

设计初衷

此 RFC 基于 RFC-0069,后者指定了 ELF Runner 支持将 stdout 和 & stderr 转发到 fuchsia.logger.LogSink 的功能。在实现该功能后,我们发现,在从组件 v1 迁移到 v2 时,组件具有 LogSink 但会丢失重要日志消息,因为其 stdout/stderr 消息在转换过程中会被静默丢弃。

Fuchsia 的 测试 Runner 默认捕获并打印 stdout 和 stderr,而用户 经常会对 ELF Runner 的不同行为感到困惑,因为 ELF Runner 需要 显式转发。

当代码仅在不常用的失败模式中使用 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 是组件框架团队通过电子邮件和线下讨论得出的结果。

设计

如果 ELF 组件的作者在其 program 部分中将 forward_stdout_toforward_stderr_to 字段留空,则 ELF Runner 将尝试为未指定的流设置转发。在此配置中,任何将 stdio 流转发到 LogSink 的失败都将是静默的,并且组件仍将启动。

实现

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

如果组件的清单中未指定任何一个,ELF Runner 将假定默认值为 forward_stdout_to: "log"forward_stderr_to: "log"

如果初始化转发时出现错误,ELF Runner 仍会向请求或默认转发的已启动组件提供 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 无处不在且有用)之间做出妥协。

替代方案:合理化 Runner

如果我们更改测试 Runner 以实际使用 ELF Runner 作为其基本实现,则可以使 ELF Runner 和测试 Runner 的行为更加相似。 目前,ELF 和测试 Runner 共享来自 Rust 库的实现代码,相反,它们可以通过允许 Runner 将其实现委托给另一个 Runner 来共享实现代码。

出于许多其他原因,这是一个有吸引力的方向。与更改 ELF Runner 的默认值相比,这是一项规模大得多的任务,并且作者认为我们仍然希望将此 RFC 的行为作为 ELF Runner 中的默认行为,以确保统一的开发者体验。

在先技术和参考文档

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