export DJANGO_SETTINGS_MODULE=mysite.settings
gevent.monkey.patch_all() 需要尽早执行:gevent 通过 monkey patching 修改 Python 标准库中的阻塞式 I/O 操作,使其变为非阻塞式,以适应协程的并发模型。OpenTelemetry 的自动埋点探针也可能依赖或修改标准库的行为。如果 monkey patching 的顺序不当,或者 OpenTelemetry 探针在 gevent 完成 patching 之前加载了某些模块,就可能造成启动报错 RecursionError。from gevent import monkeymonkey.patch_all() # 尽可能早地执行# 之后再导入其他模块和 OpenTelemetry 相关库from flask import Flaskfrom opentelemetry import tracefrom opentelemetry.sdk.trace import TracerProvider# ... 其他 OpenTelemetry 配置和应用代码
--lazy-apps 参数,其作用是让每个 worker 独立加载应用,示例如下:[uwsgi]module = your_app:applicationmaster = trueprocesses = 4lazy-apps = true # 重要:延迟应用加载enable-threads = true
pip install flaskpip install mysql-connector-pythonpip install redispip install requests
from flask import Flaskimport requestsimport timeimport mysql.connectorimport redisbackend_addr = 'https://example.com/'app = Flask(__name__)# 访问外部站点@app.route('/')def index():start = time.time()r = requests.get(backend_addr)return r.text# 访问数据库@app.route('/mysql')def func_rdb():cnx = mysql.connector.connect(host='127.0.0.1', database="<DB-NAME>", user='<DB-USER>', password='<DB-PASSWORD>', auth_plugin='mysql_native_password')cursor = cnx.cursor()val = "null"cursor.execute("select value from table_demo where id=1;")val = cursor.fetchone()[0]cursor.close()cnx.close()return "rdb res:" + val# 访问Redis@app.route("/redis")def func_kvop():client = redis.StrictRedis(host="localhost", port=6379)val = "null"val = client.get('foo').decode("utf8")return "kv res:" + valapp.run(host='0.0.0.0', port=8080)
pip install opentelemetry-instrumentation-redispip install opentelemetry-instrumentation-mysqlpip install opentelemetry-distro opentelemetry-exporter-otlpopentelemetry-bootstrap -a install
opentelemetry-instrument \\--traces_exporter otlp_proto_grpc \\--metrics_exporter none \\--logs_exporter none \\--service_name <serviceName> \\--resource_attributes token=<token>,host.name=<hostName> \\--exporter_otlp_endpoint <endpoint> \\python3 app.py
<serviceName> :应用名,多个使用相同 serviceName 接入的应用进程,在 APM 中会表现为相同应用下的多个实例。应用名最长63个字符,只能包含小写字母、数字及分隔符“ - ”,且必须以小写字母开头,数字或小写字母结尾。<token> :前置步骤中拿到业务系统 Token。<hostName>:该实例的主机名,是应用实例的唯一标识,通常情况下可以设置为应用实例的 IP 地址。<endpoint> :前置步骤中拿到的接入点。myService,业务系统 Token 为 myToken,主机名为 192.168.0.10,接入点以 https://pl-demo.ap-guangzhou.apm.tencentcs.com:4317 为例,完整的启动命令为如下。opentelemetry-instrument \\--traces_exporter otlp_proto_grpc \\--metrics_exporter none \\--logs_exporter none \\--service_name myService \\--resource_attributes token=myToken,host.name=192.168.0.10 \\--exporter_otlp_endpoint https://pl-demo.ap-guangzhou.apm.tencentcs.com:4317/ \\python3 app.py
https://localhost:8080/。在有正常流量的情况下,应用性能监控 > 应用列表 中将展示接入的应用,单击应用名称/ID 进入应用详情页。再选择实例分析,即可看到接入的应用实例。由于可观测数据的处理存在一定延时,如果接入后在控制台没有查询到应用或实例,请等待30秒左右。from opentelemetry import traceimport requestsfrom flask import Flaskimport timebackend_addr = 'https://example.com/'app = Flask(__name__)@app.route('/')def index():r = requests.get(backend_addr) # 对于requests.get()发起的外部请求,OpenTelemetry-Python会自动埋点slow() # 调用一个自定义函数return r.textdef slow():tracer = trace.get_tracer(__name__)# 自定义函数不在OpenTelemetry-Python自动埋点范围内,因此增加一个自定义埋点with tracer.start_as_current_span("child_span")time.sleep(5)return
文档反馈