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
This commit is contained in:
commit
15e744da49
107 files changed
+61762
No files matched your search
@@ -0,0 +1,102 @@
|
||||
# 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());
|
||||
}
|
||||
}
|
||||
```
|
||||
Reference in new issue
Block a user