- 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
6.1 KiB
6.1 KiB
Основы мониторинга
Навигация
Что такое мониторинг
Мониторинг — процесс сбора, анализа и использования информации о работе системы для обеспечения её стабильности и производительности.
Цели мониторинга
1. Проактивное обнаружение проблем
- Выявление проблем до их влияния на пользователей
- Предотвращение каскадных отказов
- Оптимизация производительности
2. Реактивное решение проблем
- Быстрая диагностика инцидентов
- Сокращение времени восстановления (MTTR)
- Анализ причин отказов
3. Бизнес-аналитика
- Понимание поведения пользователей
- Анализ производительности бизнес-процессов
- Планирование ресурсов
Типы мониторинга
1. Infrastructure Monitoring
- CPU, Memory, Disk, Network
- Контейнеры и виртуальные машины
- Базы данных и кэши
2. Application Monitoring
- Метрики приложения
- Производительность кода
- Ошибки и исключения
3. Business Monitoring
- Ключевые бизнес-метрики
- Пользовательская активность
- Конверсии и доходы
Метрики мониторинга
1. Counters (Счетчики)
Определение: Метрики, которые только увеличиваются.
Технический пример - Advanced Metrics Collection:
@Component
public class RequestCounter {
private final Counter requestCounter;
private final Counter errorCounter;
private final Timer requestTimer;
private final MeterRegistry meterRegistry;
public RequestCounter(MeterRegistry meterRegistry) {
this.meterRegistry = meterRegistry;
this.requestCounter = Counter.builder("http.requests.total")
.description("Total number of HTTP requests")
.tag("service", "user-service")
.register(meterRegistry);
this.errorCounter = Counter.builder("http.errors.total")
.description("Total number of HTTP errors")
.tag("service", "user-service")
.register(meterRegistry);
this.requestTimer = Timer.builder("http.request.duration")
.description("HTTP request duration")
.tag("service", "user-service")
.register(meterRegistry);
}
public void increment(String method, String endpoint, String status) {
requestCounter.increment(
Tags.of(
"method", method,
"endpoint", endpoint,
"status", status
)
);
if (Integer.parseInt(status) >= 400) {
errorCounter.increment(
Tags.of(
"method", method,
"endpoint", endpoint,
"error_type", getErrorType(status)
)
);
}
}
public Timer.Sample startTimer() {
return Timer.start(meterRegistry);
}
public void recordDuration(Timer.Sample sample, String method, String endpoint) {
sample.stop(requestTimer.tags(
"method", method,
"endpoint", endpoint
));
}
private String getErrorType(String status) {
int statusCode = Integer.parseInt(status);
if (statusCode >= 400 && statusCode < 500) {
return "client_error";
} else if (statusCode >= 500) {
return "server_error";
}
return "unknown";
}
}
2. Gauges (Измерители)
Определение: Метрики, которые могут увеличиваться и уменьшаться.
@Component
public class ActiveConnectionsGauge {
private final AtomicInteger activeConnections = new AtomicInteger(0);
private final Gauge activeConnectionsGauge;
public ActiveConnectionsGauge(MeterRegistry meterRegistry) {
this.activeConnectionsGauge = Gauge.builder("active.connections")
.description("Number of active connections")
.register(meterRegistry, this, obj -> obj.activeConnections.get());
}
public void incrementConnections() {
activeConnections.incrementAndGet();
}
public void decrementConnections() {
activeConnections.decrementAndGet();
}
}
3. Histograms (Гистограммы)
Определение: Метрики для измерения распределения значений.
@Component
public class ResponseTimeHistogram {
private final Timer responseTimeTimer;
public ResponseTimeHistogram(MeterRegistry meterRegistry) {
this.responseTimeTimer = Timer.builder("http.request.duration")
.description("HTTP request duration")
.register(meterRegistry);
}
public void recordResponseTime(String endpoint, Duration duration) {
responseTimeTimer.record(duration);
}
}
4. Summaries (Сумматоры)
Определение: Метрики для измерения квантилей.
@Component
public class ResponseTimeSummary {
private final DistributionSummary responseTimeSummary;
public ResponseTimeSummary(MeterRegistry meterRegistry) {
this.responseTimeSummary = DistributionSummary.builder("http.request.size")
.description("HTTP request size in bytes")
.register(meterRegistry);
}
public void recordRequestSize(long size) {
responseTimeSummary.record(size);
}
}