Pull Request已成功合入, 合并人@ascend-robot
(感谢 ChaseChe77 的贡献)变更摘要
本 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兜底调用。 -
新增
PerfettoTraceExporter(ms_service_profiler/tracer/perfetto_exporter.py):export()仅接受以PERFETTO_EVENT_MAGIC开头的标准化数据包,将 Span 转换为 Chrome Trace Complete Event(ph=X),记录pid、tid、开始时间、持续时间及trace_id、span_id、parent_span_id、kind、status、service.name等属性;通过 Flow Event(ph=s/f)表达 Link 关系,支持目标 Span 先到、源 Span 后到的延迟关联;_span_positions与_pending_links均受MAX_TRACKED_SPANS上限约束,_append_events在文件末尾追加写入并保持 JSON 格式始终有效。 -
新增
PerfettoForwarderService(ms_service_profiler/tracer/perfetto_forward_service.py):使用独立 Linux Abstract Unix SocketMSP_PERFETTO_SOCKET,通过AbstractSocketServer接收数据并设置队列容量上限(MAX_QUEUE_SIZE、WARNING_QUEUE_SIZE);注册SIGINT/SIGTERM信号处理和KeyboardInterrupt兜底,退出时依次停止 Socket、排空队列并关闭 Exporter。 -
输出路径安全校验(
perfetto_exporter.py中validate_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。


/lgtm


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:
修改内容:
扩展
python -m ms_service_profiler.trace命令:--perfetto-output <path.json>。--perfetto-output时,继续使用原有OTLPForwarderService,不改变 MindIE Motor 原有 Trace 转发行为。--perfetto-output时,启动独立的PerfettoForwarderService。新增
PerfettoTraceExporter:ph=X)记录 Span 名称、开始时间、持续时间、PID、TID和属性。trace_id、span_id、parent_span_id、Span Kind、Span Status、Service Name和 Resource Attributes。ph=s/f)展示 Request Span与调度、模型执行 Span 之间的 Link 关系。新增独立的
PerfettoForwarderService:MSP_PERFETTO_SOCKET。SIGINT、SIGTERM和KeyboardInterrupt安全退出。增加 Perfetto 输出路径安全校验:
.json结尾。O_NOFOLLOW防止打开过程中跟随符号链接。0750,输出文件权限设置为0640。保持 Jaeger 与 Perfetto 两个出口相互隔离:
ms_service_profiler.hook.*Scope的 Hook Span。--otlp-traces-endpoint开启原生 Tracing。新增和更新使用资料:
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使用指南。补充 UT,覆盖:
--perfetto-output时启动 Perfetto Forwarder。2. 功能验证
9 passed。58 passed。scripts/check_mkdocs.sh资料导航检查通过。707 insertions + 30 deletions = 737,低于1000行限制。vllm.scheduler.schedulevllm.model.executevllm_ascend.model_runner.executevllm.output.process3. 代码检视
要求:
58 passed。4. 安全自检
典型安全编码问题
False,Forwarder继续运行并记录告警。0750权限创建。0640权限创建。O_NOFOLLOW防止跟随符号链接。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资料导航。变更通知(消息知会 + 邮件知会):
--perfetto-output,需在版本说明中知会。6. 冒烟修改
PR 来源:
--perfetto-output时原有 OTLP Forwarder正常。--perfetto-output时能够生成合法 JSON。