python flask 自动上报trace到OpenTelemetry Collector
添加trace,flask连接OpenTelemetry Collector,OpenTelemetry Collector负责收集所有的trace日志信息,然后自动export导出到jaeger。网上教程很多了,这里我们就说一些遇到的坑。
1. flask 添加trace
我们用OpenTelemetry官方提供的半自动方式,不需要修改代码本身,只修改启动命令即可。
如下基本的flask app。
from flask import Flask, request
app = Flask(__name__)
@app.route("/server")
def server_request():
return "hello"
if __name__ == "__main__":
app.run(port=18080)
安装包。
# requirement.txt
opentelemetry.instrumentation.flask
opentelemetry-instrumentation
opentelemetry-sdk
opentelemetry-distro
opentelemetry-exporter-otlp
pip install -r requirement.txt
命令启动app
opentelemetry-instrument --traces_exporter otlp --exporter_otlp_traces_endpoint http://localhost:4317 --resource_attributes service.name=testapp --propagators tracecontext,baggage python myapp.py
命令解释
- --traces_exporter otlp
- --exporter_otlp_traces_endpoint http://localhost:4317 这里写的是OpenTelemetry Collector上报地址,注意加http,不然默认走https导致失败。
- --resource_attributes service.name=testapp 这里写的是自定义服务名称,最终显示在jaeger UI里。
- --propagators tracecontext,baggage 根据你的OpenTelemetry Collector设置propagators,比如不支持
b3
,这里就不能设置,否则报错。
2. 搭建测试环境
搭建一个本地的OpenTelemetry Collector来测试一下。
使用官方的demo docker-compose来搭建conllector jaeger 整合的本地测试环境。
官方demo:https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/examples/demo
我们精简一下 docker-compose.yml
,官方的demo东西太多了。
version: "2"
services:
# Jaeger
jaeger-all-in-one:
image: jaegertracing/all-in-one:latest
restart: always
ports:
- "16686:16686"
- "14268"
- "14250"
# Collector
otel-collector:
image: ${OTELCOL_IMG}
restart: always
command: ["--config=/etc/otel-collector-config.yaml", "${OTELCOL_ARGS}"]
volumes:
- ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
ports:
- "1888:1888" # pprof extension
- "8888:8888" # Prometheus metrics exposed by the collector
- "8889:8889" # Prometheus exporter metrics
- "13133:13133" # health_check extension
- "4317:4317" # OTLP gRPC receiver
- "55679:55679" # zpages extension
depends_on:
- jaeger-all-in-one
启动容器
docker-compose up -d
访问jaeger UI http://localhost:16686/
然后运行第一步骤中的命令和代码,就可以在jaeger中看到trace记录了。
参考文档: https://help.aliyun.com/document_detail/413964.htm
https://ibit.tech/archives/opentelemetry-python
https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/examples/demo