Для чего используется traceId в логах распределенных систем?

«Для чего используется traceId в логах распределенных систем?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

TraceId (идентификатор трассировки) — это уникальный идентификатор, который связывает все логи, относящиеся к одному сквозному запросу в распределенной системе (например, в микросервисной архитектуре).

Основная цель: Позволяет отследить полный путь запроса через несколько сервисов, что критически важно для:

  • Отладки и мониторинга — поиска всех связанных событий по одному ID.
  • Анализа производительности — выявления узких мест в цепочке вызовов.
  • Аудита — восстановления последовательности операций.

Как это работает:

  1. Генерация: TraceId генерируется при поступлении первого (внешнего) запроса в систему.
  2. Распространение: Передается между всеми сервисами через HTTP-заголовки (например, X-B3-TraceId).
  3. Логирование: Каждый сервис добавляет этот TraceId в свои логи.
  4. Формат: Обычно UUID или комбинация timestamp и случайного числа (например, 7fe038b25a9c5e6b).

Пример в Spring Boot с использованием Spring Cloud Sleuth:

import org.slf4j.*;
import org.springframework.web.bind.annotation.*;

@RestController
public class OrderController {
    private static final Logger log = LoggerFactory.getLogger(OrderController.class);

    @GetMapping("/order/{id}")
    public Order getOrder(@PathVariable String id) {
        // Sleuth автоматически добавит TraceId и SpanId в сообщение лога
        log.info("Fetching order with id: {}", id);
        // ... логика сервиса
        return order;
    }
}

Пример вывода в логах: 2023-10-01 12:00:00 INFO [order-service,7fe038b25a9c5e6b,3f2a1b5c4d6e7f8a] Fetching order... Здесь 7fe038b25a9c5e6b — это TraceId, а 3f2a1b5c4d6e7f8a — SpanId (идентификатор конкретного этапа внутри трассировки).