Запрос на воспроизведение видео проходит через 7 сервисов: API Gateway, Auth, Content Service, DRM, CDN Selector, Edge Server, Analytics. Без трейсинга локализация проблемы — гадание на кофейной гуще.
# Инструментация Python-сервиса (OpenTelemetry)
# tracing/setup.py
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanExporter
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor
from opentelemetry.instrumentation.psycopg2 import Psycopg2Instrumentor
from opentelemetry.instrumentation.redis import RedisInstrumentor
from opentelemetry.sdk.resources import Resource
def setup_tracing(service_name: str):
resource = Resource.create({
"service.name": service_name,
"service.version": os.environ.get("APP_VERSION", "unknown"),
"deployment.environment": os.environ.get("ENV", "production"),
})
provider = TracerProvider(resource=resource)
exporter = OTLPSpanExporter(
endpoint="http://otel-collector:4317",
insecure=True,
)
provider.add_span_processor(BatchSpanExporter(exporter))
trace.set_tracer_provider(provider)
# Автоинструментация популярных библиотек
FastAPIInstrumentor.instrument()
HTTPXClientInstrumentor().instrument()
Psycopg2Instrumentor().instrument()
RedisInstrumentor().instrument()
return trace.get_tracer(service_name)
# Пример использования в сервисе
tracer = setup_tracing("content-service")
@app.get("/api/v1/stream/{video_id}")
async def get_stream_url(video_id: str, request: Request):
with tracer.start_as_current_span("get_stream_url") as span:
span.set_attribute("video.id", video_id)
span.set_attribute("user.id", request.state.user_id)
# Проверка DRM-лицензии
with tracer.start_as_current_span("check_drm_license"):
license = await drm_client.check_license(
video_id, request.state.user_id
)
span.set_attribute("drm.license_type", license.type)
# Выбор CDN-ноды
with tracer.start_as_current_span("select_cdn_node"):
cdn_node = await cdn_selector.get_nearest(
request.client.host, video_id
)
span.set_attribute("cdn.node", cdn_node.hostname)
span.set_attribute("cdn.region", cdn_node.region)
return {"stream_url": cdn_node.build_url(video_id, license)}
Оставить комментарий