You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenTelemetry Python自动插装时gevent monkey patch报错求助

解决OpenTelemetry自动插装与Gevent Monkey Patch冲突问题

问题原因

opentelemetry-instrument命令在启动Flask应用前,会预先加载urllib3等依赖库,这些库会提前导入ssl模块。而你在应用代码中执行monkey.patch_all()时,ssl等模块已经被加载,导致Gevent无法完成完整patch,进而引发RuntimeError: cannot release un-acquired lock这类锁机制冲突。直接执行flask run正常,是因为此时你的代码最先执行,monkey.patch_all()在任何依赖模块导入前完成了patch操作。

解决方案

方案1:提前执行Monkey Patch(推荐)

创建单独的启动脚本,在加载OpenTelemetry插装逻辑前先执行Gevent的monkey patch:

# start.py
from gevent import monkey
monkey.patch_all()

# 调用OpenTelemetry的启动入口
from opentelemetry.instrumentation.bootstrap import run
run()

用该脚本替代原opentelemetry-instrument命令执行:

python start.py --traces_exporter console --metrics_exporter console flask run

方案2:禁用冲突的OpenTelemetry插装

如果不需要追踪urllib3请求,可通过环境变量禁用其插装,避免提前导入ssl模块:

export OTEL_PYTHON_INSTRUMENTATION_URLLIB3_ENABLED=false

之后执行原命令:

opentelemetry-instrument --traces_exporter console --metrics_exporter console flask run

注意:此方案会丢失urllib3相关链路追踪数据,需根据业务需求权衡。

方案3:手动初始化OpenTelemetry插装

放弃opentelemetry-instrument自动插装,改为在代码中手动初始化,确保Monkey Patch最先执行:

# app.py
from gevent import monkey
monkey.patch_all()

# 手动初始化OpenTelemetry
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import ConsoleSpanExporter
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
from opentelemetry.instrumentation.flask import FlaskInstrumentor

trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(
    SimpleSpanProcessor(ConsoleSpanExporter())
)

from random import randint
from flask import Flask, request

app = Flask(__name__)
FlaskInstrumentor().instrument_app(app)

@app.route("/rolldice")
def roll_dice():
    return str(do_roll())

def do_roll():
    return randint(1, 6)

启动命令改为:

flask run

内容的提问来源于stack exchange,提问作者elskndd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:21:05