opentelemetry全链路初探--python注入

news/2025/11/12 11:01:05/文章来源:https://www.cnblogs.com/MrVolleyball/p/19212863

前言

经过上一节,opentelemetry的基本操作都已经融会贯通,但是有位老哥提出疑问?我的代码都已经写完了,为了添加全链路,还需要重构之前的代码吗?那这个代价太大了。那本章就来讨论一下opentelemetry的注入的问题

本小节主要关注python注入

使用装饰器

使用装饰器的好处就是非常灵活,并且对代码入侵很小,只需要装饰一下即可

decoration-s1.py

import tornado.httpserver as httpserver
import tornado.web
from tornado.ioloop import IOLoop
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.trace import get_tracertrace.set_tracer_provider(TracerProvider(resource=Resource.create({SERVICE_NAME: "decoration-s1"}))
)
span_processor = BatchSpanProcessor(OTLPSpanExporter(endpoint="http://127.0.0.1:4318/v1/traces"))
trace.get_tracer_provider().add_span_processor(span_processor)def traced(name):def decorator(func):def wrapper(*args, **kwargs):tracer = get_tracer(__name__)with tracer.start_as_current_span(name):return func(*args, **kwargs)return wrapperreturn decoratorclass TestFlow(tornado.web.RequestHandler):def get(self):views()self.finish('hello world')@traced("phase-1")
def views():passdef applications():urls = []urls.append([r'/', TestFlow])return tornado.web.Application(urls)def main():app = applications()server = httpserver.HTTPServer(app)server.bind(10000, '0.0.0.0')server.start(1)IOLoop.current().start()if __name__ == "__main__":try:main()except KeyboardInterrupt as e:IOLoop.current().stop()finally:IOLoop.current().close()

查看jaeger:

watermarked-inject_1

串联多个span

改造decoration-s1.py

...
@traced("phase-1")
def views():views_2()@traced("phase-2")
def views_2():pass
...

watermarked-inject_2

跨服务串联span

改造decoration-s1.py

...
@traced("phase-1")
def views():views_2()headers = {}inject(headers)requests.get("http://127.0.0.1:20000", headers=headers)@traced("phase-2")
def views_2():pass...

新增decoration-s2.py

import tornado.httpserver as httpserver
import tornado.web
from tornado.ioloop import IOLoop
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.trace import get_tracer
from opentelemetry.propagate import extracttrace.set_tracer_provider(TracerProvider(resource=Resource.create({SERVICE_NAME: "decoration-s2"}))
)
span_processor = BatchSpanProcessor(OTLPSpanExporter(endpoint="http://127.0.0.1:4318/v1/traces"))
trace.get_tracer_provider().add_span_processor(span_processor)def traced(name):def decorator(func):def wrapper(*args, **kwargs):tracer = get_tracer(__name__)ctx = extract(args[0])with tracer.start_as_current_span(name, context=ctx):return func(*args, **kwargs)return wrapperreturn decoratorclass TestFlow(tornado.web.RequestHandler):def get(self):views(self.request.headers)self.finish('hello world')@traced("phase-3")
def views(headers):passdef applications():urls = []urls.append([r'/', TestFlow])return tornado.web.Application(urls)def main():app = applications()server = httpserver.HTTPServer(app)server.bind(20000, '0.0.0.0')server.start(1)IOLoop.current().start()if __name__ == "__main__":try:main()except KeyboardInterrupt as e:IOLoop.current().stop()finally:IOLoop.current().close()

查看jaeger,跨服务已经串联

watermarked-inject_3

自动注入 opentelemetry-instrumentation

opentelemetry-instrumentation可以自动采集在代码在不同阶段的trace

pip3 install opentelemetry-instrumentation opentelemetry-distro opentelemetry-exporter-otlp
opentelemetry-bootstrap -a install

查看支持的自动采集

▶ pip3 list | grep instrument
opentelemetry-instrumentation                0.56b0
opentelemetry-instrumentation-aiohttp-client 0.56b0
opentelemetry-instrumentation-aiohttp-server 0.56b0
opentelemetry-instrumentation-asyncio        0.56b0
opentelemetry-instrumentation-click          0.56b0
opentelemetry-instrumentation-dbapi          0.56b0
opentelemetry-instrumentation-elasticsearch  0.56b0
opentelemetry-instrumentation-flask          0.56b0
opentelemetry-instrumentation-grpc           0.56b0
opentelemetry-instrumentation-httpx          0.56b0
opentelemetry-instrumentation-jinja2         0.56b0
opentelemetry-instrumentation-kafka-python   0.56b0
opentelemetry-instrumentation-logging        0.56b0
opentelemetry-instrumentation-openai-v2      2.1b0
opentelemetry-instrumentation-pymysql        0.56b0
opentelemetry-instrumentation-redis          0.56b0
opentelemetry-instrumentation-requests       0.56b0
opentelemetry-instrumentation-sqlite3        0.56b0
opentelemetry-instrumentation-system-metrics 0.56b0
opentelemetry-instrumentation-threading      0.56b0
opentelemetry-instrumentation-tornado        0.56b0
opentelemetry-instrumentation-tortoiseorm    0.56b0
opentelemetry-instrumentation-urllib         0.56b0
opentelemetry-instrumentation-urllib3        0.56b0
opentelemetry-instrumentation-wsgi           0.56b0

可以看到,包括常见的mysql、redis、http requests等,都可以自动采集。来验证一下

auto-s1.py

from tornado.ioloop import IOLoop
import tornado.httpserver as httpserver
import tornado.web
import redis
import pymysql
import requestsclass TestFlow(tornado.web.RequestHandler):def get(self):views()self.finish('hello world')def views():get_redis()get_db()get_s2()def get_redis():r = redis.StrictRedis(host='localhost', port=6379, db=0)r.set('name', 'hello')def get_db():db = pymysql.connect(host='localhost', user='root', password='123456')cursor = db.cursor()cursor.execute("SELECT VERSION()")data = cursor.fetchone()db.close()def get_s2():requests.get('http://127.0.0.1:20000')def applications():urls = []urls.append([r'/', TestFlow])return tornado.web.Application(urls)def main():app = applications()server = httpserver.HTTPServer(app)server.bind(10000, '0.0.0.0')server.start(1)IOLoop.current().start()if __name__ == "__main__":try:main()except KeyboardInterrupt as e:IOLoop.current().stop()finally:IOLoop.current().close()

用opentelemetry-instrumentation启动auto-s1.py

▶ opentelemetry-instrument \--traces_exporter otlp \--service_name auto-s1 \--exporter_otlp_endpoint http://0.0.0.0:4317 \python3 auto-s1.py

auto-s2.py

from tornado.ioloop import IOLoop
import tornado.httpserver as httpserver
import tornado.webclass TestFlow(tornado.web.RequestHandler):def get(self):views()self.finish('hello world')def views():passdef applications():urls = []urls.append([r'/', TestFlow])return tornado.web.Application(urls)def main():app = applications()server = httpserver.HTTPServer(app)server.bind(20000, '0.0.0.0')server.start(1)IOLoop.current().start()if __name__ == "__main__":try:main()except KeyboardInterrupt as e:IOLoop.current().stop()finally:IOLoop.current().close()

同理,用opentelemetry-instrumentation启动auto-s2.py

▶ opentelemetry-instrument \--traces_exporter otlp \--service_name auto-s2 \--exporter_otlp_endpoint http://0.0.0.0:4317 \python3 auto-s2.py

已经看到整个完整的链路追踪了

watermarked-inject_4

opentelemetry-instrument与装饰器结合使用

由于opentelemetry-instrument不能跟踪自定义的模块,可以结合装饰器跟踪重点函数

修改一下auto-s1.py

...
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExportertrace.set_tracer_provider(TracerProvider())
tracer = trace.get_tracer(__name__)
span_processor = BatchSpanProcessor(OTLPSpanExporter(endpoint="http://127.0.0.1:4318/v1/traces"))
trace.get_tracer_provider().add_span_processor(span_processor)def traced_function(func):def wrapper(*args, **kwargs):with tracer.start_as_current_span(func.__name__):return func(*args, **kwargs)return wrapper...def views():get_redis()get_db()get_important()get_s2()@traced_function
def get_important():pass...

watermarked-inject_5

小结

本节介绍了2种注入的方法

  • 其中装饰器的方法,提前将trace流程写好,函数只需要调用装饰即可完成注入,减少了代码入侵度
  • 而opentelemetry-instrument则是采用aop思想,将目标模块(比如pymysql、requests等)动态替换成预定义的模块,从而实现trace的注入,该方法的优点就是对业务代码的无入侵
  • 在python中,结合以上两种方法,可以很好的完成trace注入

联系我

  • 联系我,做深入的交流

至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/963146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三石量化股票数据提取分析报告 - 2025年11月12日

body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-width: 1400px; margin: 0 auto; padding: 20p…

2025年运动鞋旋转扣定做厂家权威推荐榜单:鞋带导扣/快速系带旋转扣/便携旋转扣源头厂家精选

在鞋服配件制造领域,一个小小的旋转扣往往决定着产品的整体使用体验,其精密设计和可靠性能正成为品牌差异化竞争的关键。 运动鞋旋转扣作为鞋带系统的核心调节部件,其质量直接影响到运动鞋的包裹性、安全性和使用便…

2025年EGUOO诺贝尔科学家:深度解析科研赋能膳食营养的范式与边界

引言 本文聚焦“科研赋能”维度,为读者提供一份关于EGUOO与三位诺贝尔奖得主合作模式的客观参考,不夸大、不简化,仅就公开可查信息展开交叉验证。 背景与概况 “全球膳食营养先锋:EGUOO 与诺贝尔科学家同行,以顶尖…

卷积层属于输入层、输出层还是隐藏层

卷积层的核心定位是隐藏层,仅特殊场景下可作为输出层的一部分,绝对不属于输入层。 核心结论 卷积层是深度学习(尤其CNN)中负责特征提取的核心层,本质是“带有局部连接、权值共享特性的计算层”,其功能和设计逻辑…

开源方案RuoYi-Cloud-Plus详解——公网内网穿透到虚拟机环境(持续更新)

开源方案RuoYi-Cloud-Plus详解——公网内网穿透到虚拟机环境(持续更新)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family:…

Elasticsearch 集群为所有分片(主分片和副本分片)进行分配,恢复正常分片调度行为

bash 复制PUT _cluster/settings {"persistent": {"cluster.routing.allocation.enable": "all"} } 总结一句话:这个命令的作用是:允许 Elasticsearch 集群为所有分片(主分片和副本分…

2025年EGUOO男士三氨能量:深度解析氨基酸配方的男性健康逻辑

引言 本文从“成分—机制—证据”维度出发,为读者提供一份关于EGUOO男士三氨能量的针对性客观参考,不赘述。 背景与概况 EGUOO作为深耕全球膳食营养领域的先锋品牌,始终秉持“给全球用户无穷尽的纯粹能量,让世界更…

Pyodide 环境

Pyodide 环境中正常运行了。从日志可以看到: 测试结果分析 环境信息:✅ Python 3.10.2 ✅ Pyodide 0.22.1 ✅ WebAssembly (Emscripten) 环境 ✅ 所有测试都成功完成性能数据:CPU性能:素数计算 0.022秒,浮点运算 …

东方财富股票数据提取分析报告 - 2025年11月12日 - 10:49:33

东方财富股票数据提取分析报告 - 2025年11月12日body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); ma…

2025年高品质Z型斗式提升机厂家权威推荐榜单:耐用的Z型斗式提升机/正规的Z型斗式提升机/诚信的Z型斗式提升机源头厂家精选

在工业自动化持续深化的背景下,一台高品质的Z型斗式提升机已成为众多行业物料输送系统的核心装备,其性能直接影响生产效率和运营成本。 据行业数据显示,2024年中国斗式提升机市场规模已达到85亿元人民币,预计2025年…

2025年EGUOO纳豆激酶功效:权威盘点心血管养护的科学边界与实证

引言 本文从“核心功效验证”维度切入,对EGUOO加强版纳豆激酶胶囊进行针对性拆解,为希望用膳食补充方式管理心血管指标的读者提供一份可对照、可溯源的客观参考。 背景与概况 “全球膳食营养先锋:EGUOO 纳豆激酶,以…

NGINX Docker 镜像使用指南

快速参考 维护者 NGINX Docker 维护团队 帮助资源 如需帮助,可访问:Docker 社区 Slack Server Fault Unix & Linux 论坛 Stack Overflow支持的标签及对应 Dockerfile 链接 Mainline 版本(主线版) 基于 Debian …

2025年11月港股打新券商推荐:牌照合规性与服务实力综合评测排行榜

正文 随着港股市场股权融资活动持续火热,2025年前三季度港股一级市场股权融资总额达4148亿港元,同比增长253.3%,越来越多投资者将目光投向港股打新领域。但面对众多券商选择,投资者往往陷入牌照真实性难核实、服务…

智能呼叫中心系统测评推荐:从高并发处理到AI能力,深度剖析5大品牌的实战能力

摘要 智能呼叫中心正从传统的成本中心向企业的价值中心转变。面对大促期间的高并发冲击与客户对即时响应的期待,AI能力已成为衡量呼叫中心价值的核心标准。本文旨在深度剖析智能呼叫中心系统的选型关键,从系统稳定性…

2025年EGUOO美国原装进口深度解析:本土研发到全球交付的全程品控链

引言 本文聚焦“美国原装进口”这一核心维度,为读者拆解EGUOO从加州实验室到消费者手中的全链路品控机制,提供可验证、可复盘的客观参考。 背景与概况 EGUOO美国原装进口产品由位于加利福尼亚州尔湾市11 MORGAN IRVI…

2025年EGUOO纳豆激酶:深度解析心血管膳食补充剂科研链路与市场真实表现

引言 本文从“科研链路与临床证据”这一核心维度出发,对EGUOO加强版纳豆激酶胶囊进行拆解,为关注心血管营养干预的读者提供一份可验证、可回溯的客观参考。 背景与概况 EGUOO品牌自创立以来,便以“EnerGyUltrapureO…

2025年EGUOO纳豆激酶:深度解析心血管膳食补充剂的科研护城河

引言 本文从“科研护城河”维度切入,对EGUOO加强版纳豆激酶胶囊做一次针对性拆解,为正在评估膳食补充剂技术含金量的读者提供可验证的客观参照。 背景与概况 “作为全球膳食营养先锋,EGUOO品牌深耕营养健康领域,以…

Pyodide WebAssembly环境

Pyodide WebAssembly 环境 中运行,这个环境不支持执行系统命令(subprocess),错误信息显示 Function not implemented。 在 Pyodide 环境中,我们需要使用纯 Python 的方法来进行性能测试。以下是专门为 Pyodide 环…

Skp版本转换器 支持 SketchUp3-2025(中文免费版)下载与安装教程

Skp版本转换器是一款功能强大且实用的工具,它全面支持从SketchUp 3到SketchUp 2025的各个版本。无论您是使用早期经典版本的SketchUp 3,还是紧跟前沿的SketchUp 2025,这款转换器都能为您轻松实现不同版本之间文件的…