Что такое Four Golden Signals в мониторинге?

«Что такое Four Golden Signals в мониторинге?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Four Golden Signals — это четыре ключевые метрики, предложенные Google SRE для мониторинга здоровья и производительности пользовательских сервисов. Их отслеживание позволяет быстро выявлять проблемы.

  1. Задержка (Latency) — время, необходимое для обработки запроса. Критично измерять задержку для успешных и неудачных запросов отдельно.

    • Почему: Высокая задержка успешных запросов ухудшает UX. Запросы, завершившиеся ошибкой (например, мгновенным отказом), могут иметь низкую задержку, что исказит общую картину.
    • Пример: p99_latency: 150ms (99% успешных запросов обрабатываются быстрее 150 мс).
  2. Трафик (Traffic) — нагрузка на систему, измеряемая в запросах в секунду (RPS/QPS), пропускной способности сети и т.д.

    • Почему: Помогает оценить спрос на сервис, планировать масштабирование и выявлять аномалии (например, неожиданный всплеск или падение).
    • Пример: http_requests_per_second: 1250.
  3. Ошибки (Errors) — частота запросов, которые завершаются с ошибкой. Ошибки могут быть явными (HTTP 5xx, исключения) или неявными (ответы с некорректным содержимым, таймауты).

    • Почему: Прямой индикатор проблем в функциональности или доступности сервиса.
    • Пример: error_rate = (count_5xx_requests / total_requests) * 100% = 0.05%.
  4. Насыщение (Saturation) — степень загруженности критических ресурсов системы (CPU, память, дисковое пространство, I/O). Показывает, насколько система близка к пределу своей производительности.

    • Почему: Даёт понимание о запасе производительности (headroom) и помогает предотвратить деградацию сервиса до того, как он достигнет предела.
    • Пример: memory_utilization: 85%, disk_iops_utilization: 70%.

Практический пример сбора метрики Latency в Spring Boot:

import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import org.springframework.web.bind.annotation.*;

@RestController
public class DataController {
    private final Timer requestTimer;

    public DataController(MeterRegistry registry) {
        // Создание таймера для измерения задержки
        this.requestTimer = Timer.builder("app.request.latency")
                .description("Latency of /data endpoint")
                .register(registry);
    }

    @GetMapping("/data")
    public String getData() {
        // Замер времени выполнения блока кода
        return requestTimer.record(() -> {
            // Имитация бизнес-логики
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return "Sample Data";
        });
    }
}