Поширення

Поширення контексту для Python SDK

Поширення — це механізм, який переміщує дані між сервісами та процесами. Хоча це не обмежується трасуванням, саме це дозволяє трейсам будувати причинно-наслідкову інформацію про систему крізь сервіси, які довільно розподілені через межі процесів та мережі.

OpenTelemetry надає текстовий підхід для поширення контексту до віддалених сервісів, використовуючи HTTP заголовки W3C Trace Context.

Автоматичне поширення контексту

Бібліотеки інструментування для популярних Python фреймворків та бібліотек, таких як Jinja2, Flask, Django та Celery, пропагують контекст між сервісами за вас.

Ручне поширення контексту

Наступний загальний приклад показує, як ви можете вручну поширювати контекст трасування.

Спочатку, на сервісі, що надсилає, зробіть інʼєкцію поточного 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)

Звідти, коли у вас є десеріалізований активний контекст, ви можете створювати відрізки, які є частиною того ж самого трейсу з іншого сервісу.

Наступні кроки

Щоб дізнатися більше про поширення, дивіться API Поширювачів.


Востаннє змінено June 5, 2025: [uk] spellchecking (8ca5a3a5)