归因 LogSink 连接

当 Fuchsia 组件想要写入日志时,必须获取其环境中的 fuchsia.logger.LogSink(通常由 Archivist 实例提供)的连接。

典型的 Fuchsia 服务连接是匿名的,因此服务器和客户端之间没有相关的标识信息。客户端只会看到其命名空间中的服务(例如 /svc/fuchsia.logger.LogSink),而服务器会看到对其传入命名空间的匿名 Open() 请求。

同时,了解日志的来源也很重要,因为可信的出处元数据可以更好地监控、存储、查询和呈现日志。系统通过一项名为“归因日志记录”的功能来解决此问题,该功能可标识传入 LogSink 连接的来源。

组件管理器:CapabilityRequested 事件

Archivist 的清单会像其他服务功能一样 expose fuchsia.logger.LogSink,但它也会 use 来自框架的事件,将其绑定到其命名空间中的服务:

{
    event: "capability_requested",
    from: "framework",
    filter: { name: "fuchsia.logger.LogSink" },
},
{
    event_stream: "EventStream",
    subscriptions: [
        {
            event: "capability_requested",
            mode: "async",
        }
    ],
},

这会导致组件管理器将来自默认的 fuchsia.io 命名空间协议的传入请求重定向到 fuchsia.sys2.EventStream 协议。Archivist 通过此协议接收 Event,与 LogConnectionListener 类似,从组件管理器发送的 ComponentDescriptor 以及 LogSink 通道的句柄中检索归因元数据。描述符中包含的名称是在功能路由期间构建的。

LogSink 配置 capability_requested 事件不会影响功能路由本身,而只会将通道作为 Event(而非 Open())传送给 Archivist。这意味着,对于组件拓扑的其余部分,用于传递归因 LogSink 的 CML 保持不变。

如需了解详情,请参阅开放协议的生命周期事件文档