LTTNG:与流行的图书馆一起使用

LTTNG: using with a popular library

我有一个非常简单的问题,我还没有找到答案。

比如说,我有一个共享库 X,它同时被 100 个 运行 应用程序 A0、A1、... A99 使用。我已经使用“X-Provider”作为提供商名称对我的图书馆和 LTTNG 进行了检测。我的用户如何区分发生在 A10 和 A15 中的 X-Provider 事件?

使用 lttng 命令行实用程序,将要记录的 vpid 上下文字段添加到您的事件记录中,例如:

$ lttng add-context -u -t vpid

这针对当前录制会话的所有用户 space 频道;您当然可以 select 特定的录制会话 and/or 频道(参见 lttng-add-context(1))。

您需要在启动跟踪器之前使用此命令 (lttng start)。

您的所有事件记录都将有一个名为 vpid 的上下文字段,它是发出它们的进程的虚拟 ID。

现在,您需要找到一种方法将此类 VPID 关联到实例 ID(A10、A15 等)。您可以使用您自己的特定于应用程序的策略来执行此操作,或者您可以在启动应用程序时简单地记录一个指示实例 ID/name 的初始事件,例如:

tracepoint(x_provider, app_state, app_id);

然后,在读取结果跟踪时,您可以将 x_provider:app_state 事件记录信息与您的库发出的事件记录相关联。例如,使用 Babeltrace 2 Python bindings:

import bt2

vpid_app_ids = {}

for msg in bt2.TraceCollectionMessageIterator('/path/to/trace'):
    if type(msg) is not bt2._EventMessageConst:
        continue

    vpid = int(msg.event.common_context_field['vpid'])

    if msg.event.name == 'x_provider:app_state':
        app_id = int(msg.event.payload_field['app_id'])
        vpid_app_ids[vpid] = app_id
    else:
        app_id = vpid_app_ids[vpid]

        # Continue to process `msg.event` knowing the instance ID is
        # `app_id`...

我没有测试上面的例子,但你明白了要点。