Files
Alexander Abakumov 15e744da49 Initial commit: Complete Software Architecture course with 11 modules
- Added comprehensive course structure with 11 modules
- Included theoretical content, practical examples, and tasks
- Multi-language code examples (Java, Rust, Node.js, Python)
- Detailed analysis of architectural approaches and trade-offs
- Complete caching strategies documentation
- Architecture examples from real-world systems (Twitter, Netflix, Uber)
- Structured navigation and learning path
- Ready for educational use
2025-09-09 22:08:07 +03:00

2.8 KiB

Distributed Tracing

Навигация


Что такое Distributed Tracing

Distributed Tracing — метод отслеживания запросов через распределенную систему.

OpenTelemetry

@Configuration
public class TracingConfig {
    @Bean
    public OpenTelemetry openTelemetry() {
        return OpenTelemetrySdk.builder()
            .setTracerProvider(
                SdkTracerProvider.builder()
                    .addSpanProcessor(BatchSpanProcessor.builder(
                        JaegerGrpcSpanExporter.builder()
                            .setEndpoint("http://jaeger:14250")
                            .build()
                    ).build())
                    .build()
            )
            .build();
    }
}

@Service
public class OrderService {
    private final Tracer tracer;
    
    public OrderService(OpenTelemetry openTelemetry) {
        this.tracer = openTelemetry.getTracer("order-service");
    }
    
    public Order createOrder(CreateOrderRequest request) {
        Span span = tracer.spanBuilder("create-order")
            .setAttribute("customer.id", request.getCustomerId())
            .setAttribute("order.value", request.getTotalValue().doubleValue())
            .startSpan();
        
        try (Scope scope = span.makeCurrent()) {
            // бизнес-логика
            Order order = processOrder(request);
            
            span.setStatus(StatusCode.OK);
            span.setAttribute("order.id", order.getId());
            
            return order;
        } catch (Exception e) {
            span.setStatus(StatusCode.ERROR, e.getMessage());
            span.recordException(e);
            throw e;
        } finally {
            span.end();
        }
    }
}

Jaeger

Конфигурация Jaeger

# docker-compose.yml
version: '3.8'
services:
  jaeger:
    image: jaegertracing/all-in-one:latest
    ports:
      - "16686:16686"
      - "14268:14268"
    environment:
      - COLLECTOR_OTLP_ENABLED=true

Анализ трассировок

@Component
public class TraceAnalyzer {
    public void analyzeTrace(String traceId) {
        // анализ трассировки
        List<Span> spans = getSpansByTraceId(traceId);
        
        // поиск узких мест
        Span slowestSpan = spans.stream()
            .max(Comparator.comparing(Span::getDuration))
            .orElse(null);
        
        // анализ ошибок
        List<Span> errorSpans = spans.stream()
            .filter(span -> span.getStatus().getStatusCode() == StatusCode.ERROR)
            .collect(Collectors.toList());
    }
}