tencent cloud

文档反馈

通过 OpenTelemetry-Python 接入 Python 应用(推荐)

最后更新时间:2024-11-01 17:52:57
    说明:
    OpenTelemetry 是工具、API 和 SDK 的集合,用来检测、生成、收集和导出遥测数据(指标、日志和跟踪),帮助用户分析软件的性能和行为。关于 OpenTelemetry 的更多信息请参考 OpenTelemetry 官方网站
    OpenTelemetry 社区活跃,技术更迭迅速,广泛兼容主流编程语言、组件与框架,为云原生微服务以及容器架构的链路追踪能力广受欢迎。
    本文将通过相关操作介绍如何通过社区的 OpenTelemetry-Python 方案接入 Python 应用。
    OpenTelemetry-Python 方案对于 Python 系的常用依赖库和框架,包括 Flask、Django、FastAPI、MySQL Connector 等,提供了自动埋点,在不需要修改代码的情况下就能实现链路信息的上报。其他支持自动埋点的依赖库和框架请参考 OpenTelemetry 社区提供的 完整列表

    前提条件

    此方案支持 Python 3.6 及以上版本。

    示例 Demo

    所需依赖如下:
    pip install flask
    pip install mysql-connector-python
    pip install redis
    pip install requests
    示例代码 app.py 通过 Flask 框架提供3个 HTTP 接口,对应的 MySQL 和 Redis 服务请自行搭建,或直接购买云产品。
    from flask import Flask
    import requests
    import time
    import mysql.connector
    import redis
    
    backend_addr = 'https://example.com/'
    
    app = Flask(__name__)
    
    # 访问外部站点
    @app.route('/')
    def index():
    start = time.time()
    r = requests.get(backend_addr)
    return r
    
    # 访问数据库
    @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:" + val
    
    app.run(host='0.0.0.0', port=8080)

    前置步骤:获取接入点和 Token

    1. 登录 腾讯云可观测平台 控制台。
    2. 在左侧菜单栏中选择应用性能监控 > 应用监控,单击应用列表 > 接入应用
    3. 在右侧弹出的数据接入抽屉框中,单击 Python 语言。
    4. 接入 Python 应用页面,选择您所要接入的地域以及业务系统
    5. 选择接入协议类型OpenTelemetry
    6. 上报方式选择您所想要的上报方式,获取您的接入点Token
    说明:
    内网上报:使用此上报方式,您的服务需运行在腾讯云 VPC。通过 VPC 直接联通,在避免外网通信的安全风险同时,可以节省上报流量开销。
    外网上报:当您的服务部署在本地或非腾讯云 VPC 内,可以通过此方式上报数据。请注意外网通信存在安全风险,同时也会造成一定上报流量费用。

    接入 Python 应用

    步骤1:安装所需的依赖包

    pip install opentelemetry-instrumentation-redis
    pip install opentelemetry-instrumentation-mysql
    pip install opentelemetry-distro opentelemetry-exporter-otlp
    
    opentelemetry-bootstrap -a install

    步骤2:添加运行参数

    通过如下命令启动 Python 应用:
    opentelemetry-instrument \\
    --traces_exporter otlp_proto_grpc \\
    --metrics_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 \\
    --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

    接入验证

    启动 Python 应用后,通过8080端口访问对应的接口,例如 https://localhost:8080/。在有正常流量的情况下,应用性能监控 > 应用监控 > 应用列表 中将展示接入的应用,应用性能监控 > 应用监控 > 应用详情 > 实例监控中将展示接入的应用实例。由于可观测数据的处理存在一定延时,如果接入后在控制台没有查询到应用或实例,请等待30秒左右。

    Django 应用注意事项

    如果您的应用使用 Django 框架,通过 OpenTelemetry-Python 方案接入前需要注意如下事项:
    1. 推荐使用 uWSGI 方式部署服务,部署方式请参考 通过 uWSGI 托管 Django 应用,直接通过 python 命令启动可能会造成上报失败。
    2. OpenTelemetry-Python 的引入,可能会导致 Django 应用不再使用默认的配置文件,需要通过环境变量重新指定配置文件:
    export DJANGO_SETTINGS_MODULE=mysite.settings

    自定义埋点(可选)

    当自动埋点不满足您的场景或者需要增加业务层埋点时,您可参照下述内容,使用 OpenTelemetry API 添加自定义埋点。本文仅展示最基本的自定义埋点方式,OpenTelemetry 社区提供了更多灵活的自定义埋点方式,具体使用方法可参考 OpenTelemetry 社区提供的 Python 自定义埋点文档
    from opentelemetry import trace
    import requests
    backend_addr = 'https://example.com/'
    app = Flask(__name__)
    @app.route('/') def index(): r = requests.get(backend_addr) # 对于requests.get()发起的外部请求,OpenTelemetry-Python会自动埋点 slow() # 调用一个自定义函数 return r def slow(): tracer = trace.get_tracer(__name__)
    # 自定义函数不在OpenTelemetry-Python自动埋点范围内,因此增加一个自定义埋点 with tracer.start_as_current_span("child_span") time.sleep(5) return
    
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持