Propagação
Propagação é o mecanismo que move dados entre serviços e processos. Embora não seja limitada ao rastreamento, é o que permite que os rastros construam informações de causalidade sobre um sistema através de serviços que estão distribuídos arbitrariamente entre limites de processo e de rede.
O OpenTelemetry fornece uma abordagem baseada em texto para propagar contexto para serviços remotos usando os cabeçalhos HTTP do W3C Trace Context.
Propagação automática de contexto
Bibliotecas de instrumentação para frameworks e bibliotecas Python populares, como Jinja2, Flask, Django e Celery, propagam contexto entre serviços para você.
Use bibliotecas de instrumentação para propagar contexto. Embora seja possível propagar contexto manualmente, a auto-instrumentação em Python e as bibliotecas de instrumentação são bem testadas e mais fáceis de usar.
Propagação manual de contexto
O exemplo genérico a seguir mostra como você pode propagar o contexto de rastro manualmente.
Primeiro, no serviço de envio, injete o context atual:
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_trecho") as span:
ctx = baggage.set_baggage("ola", "mundo")
headers = {}
W3CBaggagePropagator().inject(headers, ctx)
TraceContextTextMapPropagator().inject(headers, ctx)
print(headers)
response = requests.get('http://127.0.0.1:5001/', headers=headers)
return f"Olá da API 1! Resposta da API 2: {response.text}"
if __name__ == '__main__':
app.run(port=5002)
No serviço receptor, extraia o context, por exemplo, dos cabeçalhos HTTP
analisados, e então defina-os como o contexto de rastro atual.
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():
# Exemplo: Registrar cabeçalhos recebidos na requisição na API 2
headers = dict(request.headers)
print(f"Cabeçalhos recebidos: {headers}")
carrier ={'traceparent': headers['Traceparent']}
ctx = TraceContextTextMapPropagator().extract(carrier=carrier)
print(f"Contexto recebido: {ctx}")
b2 ={'baggage': headers['Baggage']}
ctx2 = W3CBaggagePropagator().extract(b2, context=ctx)
print(f"Contexto recebido 2: {ctx2}")
# Iniciar um novo trecho
with tracer.start_span("api2_trecho", context=ctx2):
# Usar contexto propagado
print(baggage.get_baggage('ola', ctx2))
return "Olá da API 2!"
if __name__ == '__main__':
app.run(port=5001)
A partir daí, quando você tiver um contexto ativo desserializado, poderá criar trechos que fazem parte do mesmo rastro de outro serviço.
sqlcommenter
Algumas instrumentações Python oferecem suporte ao sqlcommenter, que enriquece as instruções de consulta do banco de dados com informações contextuais. Consultas feitas com sqlcommenter habilitado terão pares chave-valor configuráveis anexados. Por exemplo:
"select * from auth_users; /*traceparent=00-01234567-abcd-01*/"
Isso oferece suporte à propagação de contexto entre cliente e servidor de banco de dados quando os registros de log do banco de dados estão habilitados. Para mais informações, consulte:
Próximos passos
Para saber mais sobre propagação, veja API de Propagadores.
Feedback
Esta página foi útil?
Thank you. Your feedback is appreciated!
Please let us know how we can improve this page. Your feedback is appreciated!