- 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
103 lines
2.8 KiB
Markdown
103 lines
2.8 KiB
Markdown
# Distributed Tracing
|
|
|
|
## Навигация
|
|
- [🏠 Главная страница курса](../../../README.md)
|
|
- [📚 Модуль 5](../README.md)
|
|
|
|
---
|
|
|
|
## Что такое Distributed Tracing
|
|
|
|
**Distributed Tracing** — метод отслеживания запросов через распределенную систему.
|
|
|
|
## OpenTelemetry
|
|
|
|
```java
|
|
@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
|
|
```yaml
|
|
# docker-compose.yml
|
|
version: '3.8'
|
|
services:
|
|
jaeger:
|
|
image: jaegertracing/all-in-one:latest
|
|
ports:
|
|
- "16686:16686"
|
|
- "14268:14268"
|
|
environment:
|
|
- COLLECTOR_OTLP_ENABLED=true
|
|
```
|
|
|
|
### Анализ трассировок
|
|
```java
|
|
@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());
|
|
}
|
|
}
|
|
```
|