RFC-0035:自动流跟踪 | |
---|---|
状态 | 已拒绝 |
领域 |
|
说明 | 通过向我们的 FIDL 绑定添加跟踪事件,可实现跨 Fuchsia 流程的端到端流程,而无需手动处理自定义 ID。 |
作者 | |
提交日期(年-月-日) | 2019-02-28 |
审核日期(年-月-日) | 2019-02-28 |
遭拒原因
未收到响应(无论是活动事件还是“即发即弃”的通话)的消息会带有 交易 ID 设置为 0,因此无法使用 建议的方案
有些使用 zx_channel_call(),它会将 事务 ID,并等待回复。 (此模式允许并发调用方依赖于内核同步, 避免在分配事务 ID 时锁定用户空间。) 同样,建议的方案也无法区分这两种环境。
内核跟踪支持应该会提供 Google Cloud 审核,并且优先考虑改进该机制, 而不是在 FIDL 绑定中推送。
最后,按照 SDK 依赖项取舍顺序,使用 FIDL 和 FIDL 由于在 Fuchsia 上广泛使用 FIDL,因此绑定都非常接近顶部。 因此,在绑定中添加遥测和指标会导致 这对我们来说并不安全。 一些构建和选择启用方面的欺骗行为是可以想象的, 未来提案的一部分
摘要
向我们的 FIDL 绑定添加跟踪事件可实现 在 Fuchsia 上处理流程,而无需手动操作自定义 ID。
设计初衷
有很多种可跨流程实现流程事件的技巧 紫红色的边界。 我们能够以一种不会使 API 复杂化的方式实现其中的大多数自动化操作 并且需要的手动工作更少。
设计
Fuchsia FIDL 函数的标准属性,添加了流开始/结束 事件映射到各自生成的绑定
该属性设置跟踪的类别,并使用协议 函数。 目前,在 Fuchsia 上跟踪仅支持一个类别,因此虽然 属性可能包含 N 个类别,但我们预计只能选择一个类别 并将使用列表中的第一个。
protocol Example {
[Trace = "CATEGORY"]
ExampleFn(bool test) -> (bool status);
};
唯一的跨进程 ID 是序数 ID、交易 ID(包含 和传输机制 ID(对于 Zircon) channels:发送进程信道句柄的 koid,以及相关的 (接收进程句柄的 koid)与 非加密哈希
通过 zx 通道使用 FIDL 的稳定跟踪记录 ID 示例
我们建议结合使用以下标识符:
- FIDL 通道服务器端的 koid,可以是
通过 zx_object_get_info() 获取的;
主题
ZX_INFO_HANDLE_BASIC
,使用 koid 在服务器端,相关 koid 在客户端; - 事务性消息的方法序数(注意:这是 目前是一个 uint32 哈希值,很快就会演变 为 uint64 哈希值,请参阅 RFC-0029);
- 最后是事务性消息的事务 ID。
这三种标识符应当如何组合,尽量减少 跟踪记录 ID 冲突,优先级如下:
- 两个不同消息之间,顺序相同, 同一个客户端和服务器;
- 两个不同邮件(具有不同的序数)以及 同一个客户端和服务器;
- 两个不同邮件(具有不同的序数)以及 不同的客户端和服务器。
目前,Koid 分配大多是依序进行的。 因此,最低位数的熵将高于 最高位。 同样,交易 ID 也按顺序分配,因此可提供 也就是最低位的熵。 无论最高位如何,方法序数都会经过加密哈希处理 留待系统使用,那么可以放心地假设所有位都 相同的熵。
因此,在当前条件下,合理的算法为 OR:
koid & OxFFFF << 48
ordinal & 0xFFFFFFFF << 16
transaction ID & 0xFF << 0
轨迹时长也会在 FIDL 绑定的接收端开始。 对于 C++/Rust 等语言,这使用 RAII 限定作用域,并允许 事件与另一个用户流事件进行拼接
工效学设计
这让我们的跟踪系统更易于使用,对我们来说 以及基础架构
文档和示例
应更新文档,以说明如何添加跟踪记录(如概述 )。
向后兼容性
此变更与 API 和 ABI 兼容。
性能
停用跟踪类别时开销较小, 每个 dje@google.com 测试(在 NUC 上)所需的时间超过 5 纳秒。 我们还可以从 IR 中删除跟踪注释,假设 。
安全
无安全方面的影响。
缺点、替代方案和未知问题
替代方案
内核跟踪记录机制
在通道读取和通道写入时利用现有的 ktrace 流事件。
如果没有此功能,则可以尝试 只需使用底层服务器上现有的 ktrace 流事件 通道读取和写入。 不过,这是不希望的,因为这些信道对所有 FIDL 都是通用的, 接口,这意味着只能指定一个类别。 也就是说,用户必须启用 通道读取和通道写入类别,这意味着所有通道读取 以及写入事件(而不仅仅是用于 FIDL 的事件) 接口)。 这会导致跟踪记录查看器输出更难读取,产生不必要的 ktrace 缓冲区使用情况,并且还依赖于 FIDL 实现细节。