已合并
【msserviceprofiler】【需求】【Tracing 3/3】支持vLLM Hook Tracing导出Perfetto及Jaeger双写 #451
【msserviceprofiler】【需求】【Tracing 3/3】支持vLLM Hook Tracing导出Perfetto及Jaeger双写 #451
已合并
ChaseChe77创建于 11 天前
ChaseChe77
ChaseChe77成员
11 天前

PR 合入模板

1. 修改描述

  • 修改原因:
    前两笔 PR 已分别提供 OpenTelemetry Hook Tracing 基础能力,以及 vLLM/vLLM-Ascend 业务埋点和 Jaeger 链路展示能力。

    本 PR 作为 Tracing 系列第三部分,补充 Hook Span 到 Perfetto/Chrome Trace JSON 的可选导出能力,使开发者在启用 vLLM 原生 Tracing 后,可以选择仅将链路导出到 Jaeger,或者同时生成可通过 Perfetto UI 分析的本地 JSON 文件。

    本 PR 同时完善 vLLM Hook Tracing 使用资料,明确 Jaeger-only、Jaeger与Perfetto双写、容器网络、真实推理负载、Profiling 共存和异常定位流程。

    前置 PR:

  • 修改内容:

    1. 扩展 python -m ms_service_profiler.trace 命令:

      • 新增可选参数 --perfetto-output <path.json>
      • 未指定 --perfetto-output 时,继续使用原有 OTLPForwarderService,不改变 MindIE Motor 原有 Trace 转发行为。
      • 指定 --perfetto-output 时,启动独立的 PerfettoForwarderService
      • vLLM 原生 Tracing 仍是前置条件,Perfetto Forwarder 本身不创建 Span。
    2. 新增 PerfettoTraceExporter

      • 将标准化 Hook Span 数据转换为 Perfetto 兼容的 Chrome Trace JSON。
      • 使用 Complete Event(ph=X)记录 Span 名称、开始时间、持续时间、PID、TID和属性。
      • 保留 trace_idspan_idparent_span_id、Span Kind、Span Status、Service Name和 Resource Attributes。
      • 使用 Flow Event(ph=s/f)展示 Request Span与调度、模型执行 Span 之间的 Link 关系。
      • 支持先收到目标 Span、后收到源 Span时的延迟 Link 关联。
      • 增量写入过程中持续保持 JSON 文件格式有效。
      • 仅接受带有 Hook Span Magic Header 的标准化数据,不转换原有 Profiling 数据或旧版 Binary OTLP 数据。
      • Span位置和待关联 Link 设置最大缓存数量,避免无界内存增长。
    3. 新增独立的 PerfettoForwarderService

      • 使用独立 Linux Abstract Unix Socket MSP_PERFETTO_SOCKET
      • 与原有 MindIE OTLP Forwarder 解耦,不修改原有跨进程协议。
      • 使用有界接收队列,避免无界数据积压。
      • 支持 SIGINTSIGTERMKeyboardInterrupt 安全退出。
      • 服务退出前停止 Socket、排空队列并关闭 JSON 文件。
    4. 增加 Perfetto 输出路径安全校验:

      • 输出路径必须以 .json 结尾。
      • 校验路径字符合法性。
      • 拒绝符号链接、目录和其他非普通文件。
      • 已存在文件必须属于当前用户。
      • 使用 O_NOFOLLOW 防止打开过程中跟随符号链接。
      • 父目录权限设置为 0750,输出文件权限设置为 0640
    5. 保持 Jaeger 与 Perfetto 两个出口相互隔离:

      • Jaeger 继续由 vLLM 全局 OpenTelemetry Provider及原生 OTLP Exporter负责。
      • Perfetto 通过附加 Span Processor接收 ms_service_profiler.hook.* Scope的 Hook Span。
      • Perfetto Forwarder未启动或写入失败时,Jaeger和推理主链路不受影响。
      • 本实现不支持 Perfetto-only,vLLM必须通过 --otlp-traces-endpoint 开启原生 Tracing。
    6. 新增和更新使用资料:

      • 新增 docs/zh/vLLM_hook_tracing_instruct.md
      • 更新 msserviceprofiler_trace_data_monitoring_instruct.md
      • 更新 vLLM_service_oriented_performance_collection_tool.md
      • 更新 mkdocs.yml,注册 vLLM Hook Tracing使用指南。
      • 资料覆盖功能边界、数据流、埋点配置、Jaeger-only、Jaeger与Perfetto双写、容器网络、真实推理负载、Jaeger分析方法、验收层级、Profiling共存和常见异常。
    7. 补充 UT,覆盖:

      • Hook Span到 Chrome Trace Complete Event的转换。
      • Request Link到 Perfetto Flow Event的转换。
      • Link源 Span延迟到达场景。
      • 非Hook数据包拒绝场景。
      • 非法输出路径拒绝场景。
      • 独立 Perfetto Socket使用。
      • Forwarder数据接收、导出、队列排空和资源关闭。
      • CLI未指定参数时保持原有 OTLP Forwarder。
      • CLI指定 --perfetto-output 时启动 Perfetto Forwarder。

2. 功能验证

    • 本 PR新增/修改功能专项 UT:9 passed
    • 完整 Tracing相关回归:58 passed
    • 本 PR涉及文件 pre-commit全部通过。
    • scripts/check_mkdocs.sh资料导航检查通过。
    • PR变更量:707 insertions + 30 deletions = 737,低于1000行限制。
    • 已在真实 vLLM-Ascend/NPU环境启动 vLLM原生 Tracing并发送真实推理请求。
    • Jaeger能够查询 vLLM原生 Span和 msserviceprofiler Hook Span。
    • Perfetto JSON能够生成有效 Complete Event。
    • Perfetto JSON已匹配以下 Hook Span:
      • vllm.scheduler.schedule
      • vllm.model.execute
      • vllm_ascend.model_runner.execute
      • vllm.output.process
    • Jaeger与Perfetto双写过程中未发现影响 vLLM启动或推理请求的异常。
    • image.png
    • image.png
    • 请补充 Jaeger Trace查询结果截图。
    • 请补充 Perfetto/Chrome Trace JSON校验结果或 Perfetto UI截图。
    • 请补充真实推理请求成功截图。
    • 已在真实 vLLM-Ascend/NPU环境启动 vLLM服务。
    • 已发送真实推理请求并确认请求成功。
    • 已验证 Jaeger-only场景。
    • 已验证 Jaeger与Perfetto双写场景。
    • 已验证 Perfetto JSON非空且包含预期 Hook Span。
    • 未发现 Tracing功能影响原有 Profiling或推理主链路。

3. 代码检视

  • 要求:

    • 合入代码大于 200 行,需三人以上会议检视。
    • 检视密度≥2个/100行。
    • 检视缺陷密度达不到要求的需给出说明。
    • 大于 1000 行代码原则上不允许合入,需进行备案。
    • 当前 PR共737行变更,未超过1000行,但超过200行,合入前需完成三人以上会议检视并补充检视记录。
    • 新增9条专项 UT。
    • 覆盖正常转换、Link关联、输入校验、旧数据拒绝、资源关闭和CLI兼容场景。
    • 完整 Tracing相关回归执行结果为 58 passed

4. 安全自检

典型安全编码问题

    • 校验输出路径类型、后缀、合法字符、文件类型、文件属主和符号链接。
    • Perfetto Exporter仅接受带有指定 Magic Header的 Hook Span数据包。
    • JSON解析或字段转换失败时记录告警并丢弃异常数据,不影响服务主流程。
    • 已处理空数据包、空属性、空Resource Attributes、空Links、空Socket数据和重复关闭场景。
    • 校验路径合法性、Exporter转换结果、Socket读取数据及服务初始化结果。
    • Exporter失败时返回 False,Forwarder继续运行并记录告警。
    • 父目录使用 0750 权限创建。
    • 输出文件使用 0640 权限创建。
    • 使用 O_NOFOLLOW 防止跟随符号链接。
    • 拒绝非普通文件、非当前用户所有文件及符号链接。
    • 已覆盖非法路径、非法数据包、JSON解析失败、Socket异常、Exporter异常、服务信号退出、队列排空和重复关闭等场景。
    • Perfetto异常采用旁路降级,不影响Jaeger和推理主链路。
    • 路径、数据转换和导出异常记录 warning/error。
    • 服务启动、退出及信号处理记录 info。
    • 日志不记录完整请求内容、Trace Headers或敏感模型输入。
    • 本 PR不新增正则表达式。
    • 本 PR不涉及除法运算。
    • Span持续时间使用非负值保护。
    • Span位置和待关联 Link缓存设置最大数量。
    • Socket接收队列设置明确容量上限。

5. 变更知会

  • 资料修改:

    • 新增 docs/zh/vLLM_hook_tracing_instruct.md
    • 更新 docs/zh/msserviceprofiler_trace_data_monitoring_instruct.md
    • 更新 docs/zh/vLLM_service_oriented_performance_collection_tool.md
    • 更新 mkdocs.yml资料导航。
    • 已通过资料导航和本地链接检查。
  • 变更通知(消息知会 + 邮件知会):

    • 合入前知会 msserviceprofiler、vLLM-Ascend及推理服务可观测性相关开发和维护人员。
    • 新增用户可感知参数 --perfetto-output,需在版本说明中知会。
    • 未指定该参数时保持原有 Trace Forwarder行为,不影响现有用户。

6. 冒烟修改

  • PR 来源:

    • CLI兼容、Perfetto导出、真实 vLLM请求、Jaeger展示和双写场景均已有UT或真实环境验证。
    • 建议在具备 vLLM-Ascend、NPU和Jaeger环境的流水线中增加真实链路冒烟。
    • 冒烟至少验证:
      • 未指定 --perfetto-output 时原有 OTLP Forwarder正常。
      • 指定 --perfetto-output 时能够生成合法 JSON。
      • 真实推理请求成功。
      • Jaeger可查询 Hook Span。
      • Perfetto JSON包含预期 Hook Span。
      • Perfetto异常不影响Jaeger和推理请求。
likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 ChaseChe77 的贡献)
ChaseChe77ChaseChe77成员
11 天前 关联了里程碑:MindStudio 26.2.0
ChaseChe77ChaseChe77成员
11 天前 关联了issue:[Feature]: 【推理】【DFX专项】【易用性】支持通过Hook机制实现自定义tracing埋点
atomgit-bot
atomgit-bot成员
11 天前 评论:

变更摘要

本 PR 是 Tracing 系列的第三部分,为 msserviceprofiler 补充 Hook Span 到 Perfetto/Chrome Trace JSON 的可选导出能力,实现 Jaeger 与 Perfetto 双写。核心改动是扩展 python -m ms_service_profiler.trace 命令:新增可选参数 --perfetto-output,未指定时保持原有 OTLPForwarderService 行为不变,指定时启动独立的 PerfettoForwarderService;同时新增 PerfettoTraceExporter 将带 Hook Span Magic Header 的标准化数据转换为 Chrome Trace JSON,并配套新增/更新使用文档与单元测试。

主要改动

  • CLI 新增 --perfetto-output 参数ms_service_profiler/trace.py):解析新增的 --perfetto-output 可选参数,未指定时仍启动 OTLPForwarderService,指定时改为启动 PerfettoForwarderService,并将启动失败日志从仅针对 OTLP 服务改为通用的 trace 服务报错,同时将 os.getuid 改为 getattr 兜底调用。

  • 新增 PerfettoTraceExporterms_service_profiler/tracer/perfetto_exporter.py):export() 仅接受以 PERFETTO_EVENT_MAGIC 开头的标准化数据包,将 Span 转换为 Chrome Trace Complete Event(ph=X),记录 pidtid、开始时间、持续时间及 trace_idspan_idparent_span_idkindstatusservice.name 等属性;通过 Flow Event(ph=s/f)表达 Link 关系,支持目标 Span 先到、源 Span 后到的延迟关联;_span_positions_pending_links 均受 MAX_TRACKED_SPANS 上限约束,_append_events 在文件末尾追加写入并保持 JSON 格式始终有效。

  • 新增 PerfettoForwarderServicems_service_profiler/tracer/perfetto_forward_service.py):使用独立 Linux Abstract Unix Socket MSP_PERFETTO_SOCKET,通过 AbstractSocketServer 接收数据并设置队列容量上限(MAX_QUEUE_SIZEWARNING_QUEUE_SIZE);注册 SIGINT/SIGTERM 信号处理和 KeyboardInterrupt 兜底,退出时依次停止 Socket、排空队列并关闭 Exporter。

  • 输出路径安全校验perfetto_exporter.pyvalidate_perfetto_output_path):要求路径以 .json 结尾、校验合法字符、拒绝符号链接与非普通文件、已存在文件必须属于当前用户,父目录以 0750 权限创建,文件以 0640 权限并带 O_NOFOLLOW 标志打开。

  • 新增/更新测试与资料:新增 test/ut/python/test_ms_service_profiler/test_perfetto_tracing.py(覆盖 Complete Event 转换、延迟 Link 关联、旧 OTLP 数据拒绝、非法路径拒绝)和 test_perfetto_forward_service.py(覆盖独立 Socket、数据导出与资源关闭);test_trace.py 拆分为未指定参数时保持 OTLP Forwarder、指定 --perfetto-output 时启动 Perfetto Forwarder 两条用例;mkdocs.yml 注册 vLLM Hook Tracing 使用指南,并在 conftest.py 中移除不再需要的 opentelemetry 模块 mock。

likedislike
atomgit-bot
atomgit-bot成员
11 天前 评论:

代码审查

✅ 未发现问题

likedislike
此处折叠了93条消息 查看更多
Masaka
Masaka成员
10 天前 评论:

/lgtm

likedislike
leo920320成员
10 天前 评论:

/approve

likedislike
ascend-robotascend-robot成员
10 天前 添加了label:approvedlgtm
ascend-robotascend-robot成员
10 天前 关闭了关联的issue
ascend-robotascend-robot成员
10 天前 合入了pull request