Propagação

Propagação de contexto para o SDK Python

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ê.

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.