Python+Falcon+OpenTelemetry无法向OTEL Collector发送追踪数据
问题背景
通过opentelemetry-instrument自动为Falcon应用埋点,向OTEL Collector发送追踪数据时出现StatusCode.DEADLINE_EXCEEDED错误,所有服务通过docker-compose部署。
排查与解决方案
1. 修复环境变量传递问题
你的启动命令中,环境变量分多行单独定义,在Shell中这种写法不会将变量传递给后续的opentelemetry-instrument进程,导致应用使用默认配置尝试连接,从而触发超时。
正确写法有两种:
方式一:用export声明变量
export OTEL_RESOURCE_ATTRIBUTES=service.name=terminus export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT='http://otel-collector:4317' export OTEL_EXPORTER_OTLP_ENDPOINT='http://otel-collector:4317' export OTEL_EXPORTER_OTLP_PROTOCOL=grpc export OTEL_EXPORTER_OTLP_INSECURE=true opentelemetry-instrument gunicorn -c conf.py
方式二:将变量作为命令前缀单行传递
OTEL_RESOURCE_ATTRIBUTES=service.name=terminus OTEL_EXPORTER_OTLP_TRACES_ENDPOINT='http://otel-collector:4317' OTEL_EXPORTER_OTLP_ENDPOINT='http://otel-collector:4317' OTEL_EXPORTER_OTLP_PROTOCOL=grpc OTEL_EXPORTER_OTLP_INSECURE=true opentelemetry-instrument gunicorn -c conf.py
2. 验证容器间网络连通性
在Falcon应用容器内执行以下命令,测试与OTEL Collector的端口连通性:
# 测试端口是否可达 nc -zv otel-collector 4317 # 或使用telnet telnet otel-collector 4317
如果连接失败,检查docker-compose配置:
- 确保Falcon应用和OTEL Collector在同一个Docker网络中
- 确认OTEL Collector服务名拼写正确(你的配置中是
otel-collector)
3. 统一OpenTelemetry依赖版本
你使用的依赖版本存在明显差异:opentelemetry-distro和opentelemetry-instrumentation-falcon是0.43b0(beta版),而opentelemetry-exporter-otlp是1.22.0,版本不匹配可能引发兼容性问题。
将依赖版本统一为同一系列,例如:
opentelemetry-distro = "0.43b0" opentelemetry-exporter-otlp = "0.43b0" opentelemetry-instrumentation-falcon = "0.43b0"
或升级到稳定版(推荐):
opentelemetry-distro = "1.23.0" opentelemetry-exporter-otlp = "1.23.0" opentelemetry-instrumentation-falcon = "0.45b0" # 对应1.23.0的instrumentation版本
4. 检查OTEL Collector运行状态
查看OTEL Collector容器日志,确认服务正常启动并监听端口:
# 查看Collector日志 docker-compose logs otel-collector
在Collector容器内执行以下命令,确认端口监听状态:
netstat -tulpn | grep 4317
如果Collector未正常监听,检查配置文件中的receivers.otlp.protocols.grpc.endpoint是否为0.0.0.0:4317(你的配置是正确的),同时确认容器启动时未出现端口暴露失败的情况。
另外,Collector的exporter指向jaeger-all-in-one:4317,需确保Jaeger服务正常运行,否则Collector可能出现阻塞,但这通常不会导致Falcon应用连接Collector超时,可作为后续排查点。
内容的提问来源于stack exchange,提问作者mifol68042

