Что такое трассировка запроса (distributed tracing)?

«Что такое трассировка запроса (distributed tracing)?» — вопрос из категории DevOps, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Трассировка запроса (Distributed Tracing) — это метод мониторинга и диагностики, который позволяет отследить путь единого запроса через распределённую систему (микросервисы, базы данных, внешние API). Каждый шаг (операция) записывается как Span, а вся цепочка — как Trace.

Ключевые концепции:

  • Trace ID: Глобально уникальный идентификатор для всего запроса.
  • Span ID: Идентификатор отдельной операции в рамках Trace.
  • Context: Контекст (Trace ID, Span ID, флаги), который передаётся между сервисами (обычно через HTTP-заголовки, например, traceparent).

Практическая реализация в .NET (OpenTelemetry):

  1. Установка и настройка:

    // Установка пакетов: OpenTelemetry, OpenTelemetry.Extensions.Hosting,
    // OpenTelemetry.Instrumentation.AspNetCore, OpenTelemetry.Exporter.Console
    
    builder.Services.AddOpenTelemetry()
        .WithTracing(tracing =>
        {
            tracing.AddAspNetCoreInstrumentation() // Инструментирует входящие HTTP-запросы
                  .AddHttpClientInstrumentation() // Инструментирует исходящие HTTP-вызовы
                  .AddEntityFrameworkCoreInstrumentation() // Инструментирует запросы к БД
                  .AddConsoleExporter(); // Вывод трассировок в консоль (для отладки)
        });
  2. Ручное создание Span:

    using System.Diagnostics;
    
    // Создание Activity (реализация Span в .NET)
    using var activity = ActivitySource.StartActivity("ProcessPayment", ActivityKind.Internal);
    activity?.SetTag("payment.amount", amount);
    activity?.SetTag("payment.currency", "USD");
    // ... выполнение логики
    activity?.SetStatus(ActivityStatusCode.Ok);

Зачем это нужно?

  • Диагностика проблем: Быстро найти, в каком сервисе или запросе к БД произошла ошибка или задержка.
  • Анализ производительности: Визуализировать и измерить время выполнения каждого этапа запроса.
  • Понимание зависимостей: Автоматически строить карту взаимодействий между сервисами.