RFC-0175:ELF 執行器 stdio 轉送預設值

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。自實作該功能以來,我們發現許多情境中,元件在從元件 v1 遷移至 v2 時會發生 LogSink,但遺失重要記錄訊息,因為 stdout/stderr 訊息會在遷移期間遭到捨棄。

Fuchsia 的測試執行器預設會擷取並列印 stdout 和 stderr,但使用者經常會對 ELF 執行器的不同行為感到困惑,因為 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 是元件架構團隊透過電子郵件和離線討論的結果。

設計

如果 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,並將其用戶端切換至主要系統記錄分片,這會對 ELF 元件產生相同行為。

回溯相容性

如果元件沒有 LogSink,且使用預設的 stdio 轉送設定,當元件嘗試在自己的命名空間中開啟 LogSink 時,元件管理服務的記錄中就會產生路由錯誤。在推出新預設值的初期,我們會將明確的 forward_std{out,err}_to: "none" 欄位新增至沒有 LogSink 的平台元件資訊清單。日後,只要使用更精密的命名空間探查功能,判斷元件是否應提供 LogSink,即可消除這些錯誤訊息。

安全性考量

這項設計不會授予任何額外功能,因此不會提高元件的權限。只有在元件的資訊清單要求 LogSink,且該能力已路由傳送至元件時,才會啟用轉送功能。

隱私權注意事項

這會導致額外的記錄訊息寫入系統記錄,其中可能包含使用者產生的資料。記錄管道已設有控制項,可稽核及清除隱私權敏感資料,因此這裡不需要變更任何內容。

測試

stdio 轉送功能已有整合測試,將擴充涵蓋預設情境。

說明文件

許多元件開發人員指南需要更新,通常是為了移除必須設定 stdio 轉送的警告。這表示這項變更可降低開發或遷移元件的認知複雜度。

缺點、替代方案和未知事項

缺點:增加「魔法」

這項變更會新增啟動 ELF 元件的行為,不需要在資訊清單中指定任何項目 (與大多數元件功能不同)。不過,這項行為變更並非授予元件更多權限。

本 RFC 提案的行為,是試圖在元件架構設計原則 (明確性、最低權限) 和現有類 POSIX 系統開發人員的期望 (stdio 無所不在且實用) 之間取得平衡。

替代方案:合理化執行器

如果我們變更測試執行工具,實際使用 ELF 執行元件做為基本實作項目,就能讓 ELF 執行元件和測試執行工具的行為更相似。目前 ELF 和測試執行器共用 Rust 程式庫的實作程式碼,但其實可以讓執行器委派給其他執行元件實作,藉此共用實作程式碼。

此外,還有許多其他原因,都讓這項發展方向極具吸引力。這項工作比變更 ELF 執行元件的預設值要複雜許多,而且作者認為我們仍希望將這項 RFC 的行為設為 ELF 執行元件的預設值,以確保開發人員體驗一致。

既有技術和參考資料

這項 RFC 建議擴充 RFC-0069 中所述的功能。