传播
Python SDK 的上下文传播
传播是将数据在服务和进程之间移动的机制。尽管传播不仅限于追踪,但它能够跨越任意分布在进程和网络边界上的服务,构建系统中因果关系信息。
OpenTelemetry 提供了一种基于文本的方法,通过 W3C Trace Context HTTP 标头将上下文传播到远程服务。
自动上下文传播
适用于 Flask、Django 和 Celery 等流行 Python 框架和库的仪器库会自动为您传播跨服务上下文。
注意
使用仪器库传播上下文。虽然也可以手动传播上下文,但 Python 自动仪器和仪器库经过了充分测试,并且更易于使用。
手动上下文传播
以下通用示例显示了如何手动传播跟踪上下文。
首先,在发送服务上,注入当前的 context
from flask import Flask
import requests
from opentelemetry import trace, baggage
from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
from opentelemetry.baggage.propagation import W3CBaggagePropagator
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import ConsoleSpanExporter, BatchSpanProcessor
app = Flask(__name__)
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(ConsoleSpanExporter()))
tracer = trace.get_tracer(__name__)
@app.route('/')
def hello():
with tracer.start_as_current_span("api1_span") as span:
ctx = baggage.set_baggage("hello", "world")
headers = {}
W3CBaggagePropagator().inject(headers, ctx)
TraceContextTextMapPropagator().inject(headers, ctx)
print(headers)
response = requests.get('http://127.0.0.1:5001/', headers=headers)
return f"Hello from API 1! Response from API 2: {response.text}"
if __name__ == '__main__':
app.run(port=5002)
在接收服务上,提取 context,例如,从解析后的 HTTP 标头中提取,然后将其设置为当前的跟踪上下文。
from flask import Flask, request
from opentelemetry import trace, baggage
from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import ConsoleSpanExporter, BatchSpanProcessor
from opentelemetry.baggage.propagation import W3CBaggagePropagator
app = Flask(__name__)
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(ConsoleSpanExporter()))
tracer = trace.get_tracer(__name__)
@app.route('/')
def hello():
# Example: Log headers received in the request in API 2
headers = dict(request.headers)
print(f"Received headers: {headers}")
carrier ={'traceparent': headers['Traceparent']}
ctx = TraceContextTextMapPropagator().extract(carrier=carrier)
print(f"Received context: {ctx}")
b2 ={'baggage': headers['Baggage']}
ctx2 = W3CBaggagePropagator().extract(b2, context=ctx)
print(f"Received context2: {ctx2}")
# Start a new span
with tracer.start_span("api2_span", context=ctx2):
# Use propagated context
print(baggage.get_baggage('hello', ctx2))
return "Hello from API 2!"
if __name__ == '__main__':
app.run(port=5001)
然后,当您拥有一个反序列化的活动上下文时,您可以创建来自其他服务的属于同一跟踪的 span。
sqlcommenter
一些 Python 仪器支持 sqlcommenter,它使用上下文信息丰富数据库查询语句。启用 sqlcommenter 后执行的查询将在其后附加可配置的键值对。例如:
"select * from auth_users; /*traceparent=00-01234567-abcd-01*/"
这支持在启用数据库日志记录时,在数据库客户端和服务器之间进行上下文传播。有关更多信息,请参阅:
下一步
要了解有关传播的更多信息,请参阅 Propagators API。