Files
sa-lessons/modules/module5/sections/01-monitoring-basics.md
T
Alexander Abakumov 15e744da49 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
2025-09-09 22:08:07 +03:00

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);
    }
}