Что такое 4 Golden Signals в мониторинге?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
4 Golden Signals в мониторинге
4 Golden Signals — это четыре ключевые метрики для мониторинга состояния и производительности приложений, определённые Google в книге "Site Reliability Engineering" (SRE). Эти сигналы позволяют быстро понять здоровье системы.
1. Latency (Задержка)
Latency — время, необходимое для выполнения запроса. Это самая важная метрика для пользовательского опыта. Нужно отслеживать как успешные запросы, так и ошибки (ошибки часто быстрее, но это плохой знак).
@Service
public class UserService {
private static final Timer latencyTimer = Timer.builder("user.service.latency")
.description("Latency of user service calls")
.publishPercentiles(0.5, 0.95, 0.99)
.register(meterRegistry);
public User getUser(Long id) {
long startTime = System.currentTimeMillis();
try {
return repository.findById(id).orElseThrow();
} finally {
long duration = System.currentTimeMillis() - startTime;
latencyTimer.record(duration, TimeUnit.MILLISECONDS);
}
}
}
Идеально отслеживать перцентили (p50, p95, p99), а не только среднее значение. Например, если p99 latency = 2 сек, это значит, что 1% пользователей ждёт 2+ сеунд.
2. Traffic (Трафик)
Traffic — объём запросов к приложению. Измеряется в запросах в секунду (RPS — Requests Per Second) или количестве обработанных данных (Bytes/sec для сетевых сервисов).
@RestController
@RequestMapping("/api/v1/users")
public class UserController {
private final MeterRegistry meterRegistry;
@GetMapping("/{id}")
public ResponseEntity<UserDto> getUser(@PathVariable Long id) {
meterRegistry.counter("api.requests.total",
"endpoint", "/users/{id}",
"method", "GET").increment();
User user = userService.getUser(id);
return ResponseEntity.ok(new UserDto(user));
}
}
Эта метрика важна для:
- Обнаружения необычных паттернов трафика
- Планирования ёмкости (capacity planning)
- Корреляции с другими метриками (например, увеличение трафика → увеличение latency)
3. Errors (Ошибки)
Errors — доля запросов, завершившихся ошибкой (5xx, 4xx, таймауты, исключения). Обычно выражается в процентах от всех запросов или абсолютном количестве ошибок в секунду.
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(NotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFound(
NotFoundException ex,
HttpServletRequest request) {
meterRegistry.counter("api.errors.total",
"status", "404",
"endpoint", request.getRequestURI()).increment();
return ResponseEntity
.status(HttpStatus.NOT_FOUND)
.body(new ErrorResponse(ex.getMessage()));
}
@ExceptionHandler(RuntimeException.class)
public ResponseEntity<ErrorResponse> handleServerError(
RuntimeException ex,
HttpServletRequest request) {
meterRegistry.counter("api.errors.total",
"status", "500",
"endpoint", request.getRequestURI()).increment();
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Internal server error"));
}
}
Важно различать:
- Явные ошибки — 5xx HTTP статусы
- Молчаливые ошибки — неправильные результаты, которые выглядят как успех
- Таймауты — часто признак проблемы с зависимостями
4. Saturation (Насыщение)
Saturation — показатель того, насколько полно используются ресурсы системы. Это может быть:
- CPU utilization — используется ли процессор на полную?
- Memory usage — сколько RAM занято?
- Disk I/O — диск работает на пределе?
- Database connections — все ли соединения в пуле используются?
- Queue length — очередь задач растёт?
@Configuration
public class MetricsConfiguration {
@Bean
public MeterBinder jvmMetrics() {
return (registry) -> {
// CPU метрики
Gauge.builder("jvm.cpu.usage",
() -> ManagementFactory.getOperatingSystemMXBean().getProcessCpuLoad())
.register(registry);
// Memory метрики
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
Gauge.builder("jvm.memory.used",
() -> memoryBean.getHeapMemoryUsage().getUsed())
.register(registry);
Gauge.builder("jvm.memory.max",
() -> memoryBean.getHeapMemoryUsage().getMax())
.register(registry);
};
}
}
Важная деталь: насыщение часто показывает, когда система приближается к своему пределу. Если saturation = 100%, это означает, что система уже не может обрабатывать больше запросов — latency резко возрастёт.
Практическое применение
В реальной системе мониторят все 4 сигнала вместе:
// Пример: диаграмма для визуализации в Grafana
// - Latency (p95, p99): выше, чем обычно? → проблема с обработкой
// - Traffic: выше, чем обычно? → ddos или легитимный всплеск?
// - Errors: выше 0.1%? → что сломалось?
// - Saturation: CPU > 80%, Memory > 85%? → нужны ресурсы
Инструменты
Prometheus + Grafana — стандартный стек для сбора и визуализации этих метрик:
- Prometheus собирает метрики через /actuator/prometheus в Spring Boot
- Grafana строит красивые дашборды
- AlertManager отправляет алерты при нарушении порогов
# prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: java-app
static_configs:
- targets: [localhost:8080]
metrics_path: /actuator/prometheus
Понимание 4 Golden Signals — это основа для построения надёжных и наблюдаемых систем. Они помогают быстро найти коренную причину проблемы и предотвратить неполадки до того, как они затронут пользователей.