如何为Apache mod_wsgi部署的Flask Docker应用启用Datadog追踪
解决Apache+mod_wsgi下Flask应用的Datadog追踪配置问题
因为mod_wsgi是将Python应用嵌入Apache进程中运行,直接用ddtrace-run启动Apache脚本不会生效——ddtrace-run只能注入当前进程,而Apache会fork出独立的WSGI子进程,这些子进程不会继承ddtrace的注入环境。下面是两种可行的配置方案:
方案1:在Flask代码中手动初始化Datadog追踪
这是最稳定的方式,直接在应用层面注入追踪逻辑:
确保Docker镜像中已安装
ddtrace包:pip install ddtrace在你的Flask应用入口文件(比如
app.py)顶部添加初始化代码:from ddtrace import patch_all from ddtrace.contrib.flask import TraceMiddleware # 自动patch所有支持的库(Flask、requests等) patch_all() # 初始化Flask应用 from flask import Flask app = Flask(__name__) # 配置TraceMiddleware,替换为你的服务名称 tracer = TraceMiddleware(app, tracer=None, service="your-flask-service-name")在Docker环境变量中配置Datadog必要参数:
DD_AGENT_HOST:Datadog Agent的地址(如果在同一Docker网络,通常是datadog-agent)DD_SERVICE:你的服务名称DD_ENV:环境标识(如prod、staging)DD_VERSION:服务版本号
方案2:通过mod_wsgi配置注入ddtrace
如果不想修改代码,可以通过Apache的mod_wsgi配置让WSGI进程加载ddtrace:
安装
ddtrace包(同上)。修改Apache的WSGI配置文件(比如
your-app.conf),添加以下配置:# 设置Datadog追踪的环境变量 SetEnv DD_TRACE_ENABLED true SetEnv DD_SERVICE your-flask-service-name SetEnv DD_AGENT_HOST datadog-agent # 配置WSGI进程参数,替换为你的应用路径 WSGIDaemonProcess flask-app processes=2 threads=15 python-path=/path/to/your/app WSGIProcessGroup flask-app WSGIScriptAlias / /path/to/your/app/wsgi.py process-group=flask-app application-group=%{GLOBAL}修改你的
wsgi.py文件(若不存在则创建),添加初始化代码:from ddtrace import patch_all patch_all() from app import app as application保持Docker入口点正常启动Apache(
/run-apache.sh),不需要用ddtrace-run包裹。
关键注意事项
- 确保Datadog Agent已在Docker环境中运行,且与应用容器在同一网络,能相互通信。
- 避免同时使用
ddtrace-run和代码初始化,可能导致冲突。 - 若使用方案1,无需额外修改Apache配置,代码层面的初始化会直接生效。
内容的提问来源于stack exchange,提问作者Darshan Patil
相关产品推荐
相关产品推荐

