Python服务上报Trace到SkyWalking需装skywalking-python并设环境变量,Flask用@sw.entry装饰器,FastAPI需ASGI中间件,异步函数须用sw.async_trace包裹;Elastic APM须最早初始化、配置正确且网络可达,禁与SkyWalking混用。

Python服务怎么自动上报Trace到SkyWalking
直接装 skywalking-python 并初始化即可,但默认不捕获 HTTP 框架(如 Flask/FastAPI)的入口请求,必须手动注册中间件或装饰器。
- 用
pip install skywalking-python,别用旧版skywalking-agent(已弃用) - 启动前设环境变量:
SW_AGENT_NAME=your-service-name、SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 - Flask 需加
@sw.entry()装饰器在视图函数上;FastAPI 要自己写 ASGI 中间件,否则 root span 为空 - 异步函数(
async def)默认不支持,得用sw.async_trace()显式包裹,不然子 span 全丢
Elastic APM 的 Python 客户端为什么收不到 Span
大概率是没启用自动 instrumentation,或者 elastic-apm 启动时机太晚——它必须在所有框架导入前就初始化。
- 不能在
app.py底部才调elasticapm.instrument(),得放在最顶上,甚至比from flask import Flask还早 - 确认
ELASTIC_APM_SERVICE_NAME和ELASTIC_APM_SERVER_URL环境变量已设置,后者默认是http://localhost:8200,不是 9200 - Flask 默认只捕获 request/response,DB 查询要额外装
elastic-apm[flask]或[sqlalchemy],否则 ORM 调用不出 span - 日志里出现
"Failed to send metrics to APM Server"通常意味着网络不通或 Server 未开 intake API
两个 APM 同时接会冲突吗
会。两个 agent 都劫持 urllib/requests 等底层模块,后加载的那个大概率覆盖前一个的 hook,导致部分链路断裂或数据重复上报。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 绝对不要同时 import
skywalking和elasticapm—— 即使没初始化也危险 - 如果公司已用 SkyWalking 做基础设施监控,就别再塞 Elastic APM;反之亦然。混用只适合临时对比场景,且需用不同进程隔离
- 想做多后端上报?选一个作为主 agent,另一个用 OpenTelemetry SDK 手动导出,而不是拉两个 full agent
本地调试时 Trace 总是断掉一截
常见于开发机没连通 Collector,或用了 localhost 但容器/WSL 网络隔离导致地址不可达。
立即学习“Python免费学习笔记(深入)”;
- SkyWalking:检查
SW_AGENT_COLLECTOR_BACKEND_SERVICES是不是写了localhost:11800,Docker 内要用宿主机 IP 或host.docker.internal - Elastic APM:
ELASTIC_APM_SERVER_URL若指向http://localhost:8200,WSL2 用户得换http://host.docker.internal:8200 - Python 进程退出太快(比如 CLI 脚本),agent 来不及 flush 数据,加
atexit.register(elasticapm.flush)或sw.cleanup() - 用
curl -v http://127.0.0.1:11800测试 Collector 是否响应,返回 404 是正常,返回 Connection refused 就真连不上
最常被忽略的是 agent 初始化顺序和网络可达性——不是配置写错了,而是它根本没跑起来。先确认日志里有 “started” 字样,再查 trace ID 是否出现在 UI 里。

















