可以做网站的行业列举电子商务网站建设需要的语言
2026/2/18 19:50:48 网站建设 项目流程
可以做网站的行业,列举电子商务网站建设需要的语言,免费域名申请 知乎,搭建线上购物平台前言经过上一节#xff0c;opentelemetry的基本操作都已经融会贯通#xff0c;但是有位老哥提出疑问#xff1f;我的代码都已经写完了#xff0c;为了添加全链路#xff0c;还需要重构之前的代码吗#xff1f;那这个代价太大了。那本章就来讨论一下opentelemetry的注入的…前言经过上一节opentelemetry的基本操作都已经融会贯通但是有位老哥提出疑问我的代码都已经写完了为了添加全链路还需要重构之前的代码吗那这个代价太大了。那本章就来讨论一下opentelemetry的注入的问题本小节主要关注python注入使用装饰器使用装饰器的好处就是非常灵活并且对代码入侵很小只需要装饰一下即可decoration-s1.pyimport tornado.httpserver as httpserverimport tornado.webfrom tornado.ioloop import IOLoopfrom opentelemetry import tracefrom opentelemetry.sdk.trace import TracerProviderfrom opentelemetry.sdk.resources import SERVICE_NAME, Resourcefrom opentelemetry.sdk.trace.export import BatchSpanProcessorfrom opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporterfrom opentelemetry.trace import get_tracertrace.set_tracer_provider(TracerProvider(resourceResource.create({SERVICE_NAME: decoration-s1})))span_processor BatchSpanProcessor(OTLPSpanExporter(endpointhttp://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()查看jaegerwatermarked-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, headersheaders)traced(phase-2)def views_2():pass...新增decoration-s2.pyimport tornado.httpserver as httpserverimport tornado.webfrom tornado.ioloop import IOLoopfrom opentelemetry import tracefrom opentelemetry.sdk.trace import TracerProviderfrom opentelemetry.sdk.resources import SERVICE_NAME, Resourcefrom opentelemetry.sdk.trace.export import BatchSpanProcessorfrom opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporterfrom opentelemetry.trace import get_tracerfrom opentelemetry.propagate import extracttrace.set_tracer_provider(TracerProvider(resourceResource.create({SERVICE_NAME: decoration-s2})))span_processor BatchSpanProcessor(OTLPSpanExporter(endpointhttp://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, contextctx):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-instrumentationopentelemetry-instrumentation可以自动采集在代码在不同阶段的tracepip3 install opentelemetry-instrumentation opentelemetry-distro opentelemetry-exporter-otlpopentelemetry-bootstrap -a install查看支持的自动采集▶ pip3 list | grep instrumentopentelemetry-instrumentation 0.56b0opentelemetry-instrumentation-aiohttp-client 0.56b0opentelemetry-instrumentation-aiohttp-server 0.56b0opentelemetry-instrumentation-asyncio 0.56b0opentelemetry-instrumentation-click 0.56b0opentelemetry-instrumentation-dbapi 0.56b0opentelemetry-instrumentation-elasticsearch 0.56b0opentelemetry-instrumentation-flask 0.56b0opentelemetry-instrumentation-grpc 0.56b0opentelemetry-instrumentation-httpx 0.56b0opentelemetry-instrumentation-jinja2 0.56b0opentelemetry-instrumentation-kafka-python 0.56b0opentelemetry-instrumentation-logging 0.56b0opentelemetry-instrumentation-openai-v2 2.1b0opentelemetry-instrumentation-pymysql 0.56b0opentelemetry-instrumentation-redis 0.56b0opentelemetry-instrumentation-requests 0.56b0opentelemetry-instrumentation-sqlite3 0.56b0opentelemetry-instrumentation-system-metrics 0.56b0opentelemetry-instrumentation-threading 0.56b0opentelemetry-instrumentation-tornado 0.56b0opentelemetry-instrumentation-tortoiseorm 0.56b0opentelemetry-instrumentation-urllib 0.56b0opentelemetry-instrumentation-urllib3 0.56b0opentelemetry-instrumentation-wsgi 0.56b0可以看到包括常见的mysql、redis、http requests等都可以自动采集。来验证一下auto-s1.pyfrom tornado.ioloop import IOLoopimport tornado.httpserver as httpserverimport tornado.webimport redisimport pymysqlimport 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(hostlocalhost, port6379, db0)r.set(name, hello)def get_db():db pymysql.connect(hostlocalhost, userroot, password123456)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.pyauto-s2.pyfrom tornado.ioloop import IOLoopimport tornado.httpserver as httpserverimport 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_4opentelemetry-instrument与装饰器结合使用由于opentelemetry-instrument不能跟踪自定义的模块可以结合装饰器跟踪重点函数修改一下auto-s1.py...from opentelemetry import tracefrom opentelemetry.sdk.trace import TracerProviderfrom opentelemetry.sdk.trace.export import BatchSpanProcessorfrom opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExportertrace.set_tracer_provider(TracerProvider())tracer trace.get_tracer(__name__)span_processor BatchSpanProcessor(OTLPSpanExporter(endpointhttp://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_functiondef get_important():pass...watermarked-inject_5小结本节介绍了2种注入的方法其中装饰器的方法提前将trace流程写好函数只需要调用装饰即可完成注入减少了代码入侵度而opentelemetry-instrument则是采用aop思想将目标模块比如pymysql、requests等动态替换成预定义的模块从而实现trace的注入该方法的优点就是对业务代码的无入侵在python中结合以上两种方法可以很好的完成trace注入

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询