- 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
2.8 KiB
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());
}
}