# Observability ## Навигация - [🏠 Главная страница курса](../../../README.md) - [📚 Модуль 5](../README.md) --- ## Три столпа Observability ### 1. Metrics (Метрики) - Количественные измерения - Агрегированные данные - Хорошо для мониторинга трендов ### 2. Logs (Логи) - События с временными метками - Детальная информация - Хорошо для отладки ### 3. Traces (Трассировки) - Путь запроса через систему - Временные зависимости - Хорошо для анализа производительности ## Паттерны наблюдаемости ### 1. Health Checks ```java @Component public class HealthIndicator implements HealthIndicator { @Override public Health health() { try { // проверка зависимостей boolean dbHealthy = checkDatabase(); boolean cacheHealthy = checkCache(); if (dbHealthy && cacheHealthy) { return Health.up() .withDetail("database", "UP") .withDetail("cache", "UP") .build(); } else { return Health.down() .withDetail("database", dbHealthy ? "UP" : "DOWN") .withDetail("cache", cacheHealthy ? "UP" : "DOWN") .build(); } } catch (Exception e) { return Health.down(e).build(); } } } ``` ### 2. Custom Metrics ```java @Component public class BusinessMetrics { private final Counter ordersCreated; private final Timer orderProcessingTime; private final Gauge activeUsers; public BusinessMetrics(MeterRegistry meterRegistry) { this.ordersCreated = Counter.builder("orders.created") .description("Total orders created") .register(meterRegistry); this.orderProcessingTime = Timer.builder("orders.processing.time") .description("Order processing time") .register(meterRegistry); this.activeUsers = Gauge.builder("users.active") .description("Number of active users") .register(meterRegistry, this, obj -> obj.getActiveUsersCount()); } public void recordOrderCreated() { ordersCreated.increment(); } public void recordOrderProcessingTime(Duration duration) { orderProcessingTime.record(duration); } private int getActiveUsersCount() { // логика подсчета активных пользователей return 0; } } ```