Cookbook
Esta página é um cookbook para cenários comuns.
Criar um novo trecho
from opentelemetry import trace
tracer = trace.get_tracer("meu.rastreador")
with tracer.start_as_current_span("imprimindo") as span:
print("foo")
span.set_attribute("imprimindo_caracter", "foo")
Obter e modificar um trecho
from opentelemetry import trace
current_span = trace.get_current_span()
current_span.set_attribute("cidade_natal", "Fortaleza")
Criar um trecho aninhado
from opentelemetry import trace
import time
tracer = trace.get_tracer("meu.rastreador")
# Criar um novo trecho para rastrear alguma tarefa
with tracer.start_as_current_span("pai"):
time.sleep(1)
# Criar um trecho aninhado para rastrear trabalho aninhado
with tracer.start_as_current_span("filho"):
time.sleep(2)
# O trecho aninhado é fechado quando sai de escopo
# Agora o trecho pai é o trecho atual novamente
time.sleep(1)
# Este trecho também é fechado quando sai de escopo
Capturar bagagem em diferentes contextos
from opentelemetry import trace, baggage
tracer = trace.get_tracer("meu.rastreador")
with tracer.start_as_current_span(name="trecho raiz") as root_span:
parent_ctx = baggage.set_baggage("contexto", "pai")
with tracer.start_as_current_span(
name="trecho filho", context=parent_ctx
) as child_span:
child_ctx = baggage.set_baggage("contexto", "filho")
print(baggage.get_baggage("contexto", parent_ctx))
print(baggage.get_baggage("contexto", child_ctx))
Definir contexto de trecho manualmente
Geralmente sua aplicação ou framework de servidor cuidará da propagação do
contexto de rastro para você. Mas, em alguns casos, você pode precisar salvar
seu contexto de rastro (com .inject
) e recuperá-lo em outro lugar (com
.extract
) por conta própria.
from opentelemetry import trace, context
from opentelemetry.trace import NonRecordingSpan, SpanContext, TraceFlags
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import ConsoleSpanExporter, BatchSpanProcessor
from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
# Configurar um processador simples para escrever trechos no console para podermos ver o que está acontecendo.
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(ConsoleSpanExporter()))
tracer = trace.get_tracer("meu.rastreador")
# Um TextMapPropagator funciona com qualquer objeto tipo dicionário como seu Transportador (Carrier) por padrão. Você também pode implementar getters e setters personalizados.
with tracer.start_as_current_span('primeiro-trecho'):
carrier = {}
# Escrever o contexto atual no carrier.
TraceContextTextMapPropagator().inject(carrier)
# O código abaixo pode estar em uma _thread_ diferente, em uma máquina diferente, etc.
# Como um exemplo típico, estaria em um microsserviço diferente e o transportador teria
# sido encaminhado via cabeçalhos HTTP.
# Extrair o contexto de rastro do transportador.
# Aqui está como um transportador típico pode parecer, como teria sido injetado acima.
carrier = {'traceparent': '00-a9c3b99a95cc045e573e163c3ac80a77-d99d251a8caecd06-01'}
# Então usamos um propagador para obter um contexto dele.
ctx = TraceContextTextMapPropagator().extract(carrier=carrier)
# Em vez de extrair o contexto de rastro do transportador, se você já tem um objeto SpanContext
# você pode obter um contexto de rastro dele assim.
span_context = SpanContext(
trace_id=2604504634922341076776623263868986797,
span_id=5213367945872657620,
is_remote=True,
trace_flags=TraceFlags(0x01)
)
ctx = trace.set_span_in_context(NonRecordingSpan(span_context))
# Agora existem algumas maneiras de usar o contexto de rastro.
# Você pode passar o objeto de contexto ao iniciar um trecho.
with tracer.start_as_current_span('filho', context=ctx) as span:
span.set_attribute('primos', [2, 3, 5, 7])
# Ou você pode torná-lo o contexto atual, e então o próximo trecho o utilizará.
# O _token_ retornado permite que você restaure o contexto anterior.
token = context.attach(ctx)
try:
with tracer.start_as_current_span('filho') as span:
span.set_attribute('pares', [2, 4, 6, 8])
finally:
context.detach(token)
Usar múltiplos provedores de rastro com diferentes Resources
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace.export import ConsoleSpanExporter, BatchSpanProcessor
# Provedor de rastro global que só pode ser definido uma vez
trace.set_tracer_provider(
TracerProvider(resource=Resource.create({"service.name": "service1"}))
)
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(ConsoleSpanExporter()))
tracer = trace.get_tracer("rastreador.um")
with tracer.start_as_current_span("algum-nome") as span:
span.set_attribute("key", "valor")
another_tracer_provider = TracerProvider(
resource=Resource.create({"service.name": "service2"})
)
another_tracer_provider.add_span_processor(BatchSpanProcessor(ConsoleSpanExporter()))
another_tracer = trace.get_tracer("rastreador.dois", tracer_provider=another_tracer_provider)
with another_tracer.start_as_current_span("outro-nome") as span:
span.set_attribute("another-key", "outro valor")
Feedback
Was this page helpful?
Thank you. Your feedback is appreciated!
Please let us know how we can improve this page. Your feedback is appreciated!