Поширення

Поширення контексту для 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)

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

sqlcommenter

Деякі інструменти Python підтримують sqlcommenter, який збагачує запити до бази даних контекстною інформацією. До запитів, виконаних з увімкненим sqlcommenter, додаються настроювані пари ключ-значення. Наприклад:

"select * from auth_users; /*traceparent=00-01234567-abcd-01*/"

Це підтримує поширення контексту між клієнтом і сервером бази даних, коли увімкнено записи логів бази даних. Для отримання додаткової інформації див.:

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

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


Востаннє змінено December 26, 2024: [uk] Ukrainian documentation for OpenTelemetry (2a3c5648)