Ответ
Four Golden Signals — это четыре ключевые метрики, предложенные Google SRE для мониторинга здоровья и производительности пользовательских сервисов. Их отслеживание позволяет быстро выявлять проблемы.
-
Задержка (Latency) — время, необходимое для обработки запроса. Критично измерять задержку для успешных и неудачных запросов отдельно.
- Почему: Высокая задержка успешных запросов ухудшает UX. Запросы, завершившиеся ошибкой (например, мгновенным отказом), могут иметь низкую задержку, что исказит общую картину.
- Пример:
p99_latency: 150ms(99% успешных запросов обрабатываются быстрее 150 мс).
-
Трафик (Traffic) — нагрузка на систему, измеряемая в запросах в секунду (RPS/QPS), пропускной способности сети и т.д.
- Почему: Помогает оценить спрос на сервис, планировать масштабирование и выявлять аномалии (например, неожиданный всплеск или падение).
- Пример:
http_requests_per_second: 1250.
-
Ошибки (Errors) — частота запросов, которые завершаются с ошибкой. Ошибки могут быть явными (HTTP 5xx, исключения) или неявными (ответы с некорректным содержимым, таймауты).
- Почему: Прямой индикатор проблем в функциональности или доступности сервиса.
- Пример:
error_rate = (count_5xx_requests / total_requests) * 100% = 0.05%.
-
Насыщение (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";
});
}
}