Ответ
Observability (наблюдаемость) — это свойство системы, которое позволяет судить о её внутреннем состоянии, производительности и поведении исключительно на основе внешних данных, которые она генерирует. Это способность не просто видеть, что система сломалась (мониторинг), а понимать, почему это произошло.
Observability строится на "трех столпах":
1. Метрики (Metrics)
Числовые данные, измеряемые через определенные интервалы времени. Они отвечают на вопрос «каково состояние системы?».
- Примеры: загрузка CPU, использование памяти, количество запросов в секунду (RPS), время ответа (latency), количество ошибок.
- Инструменты в Go: Библиотека
prometheus/client_golang
для сбора метрик и Prometheus для их хранения и визуализации.
// Счетчик HTTP-запросов для Prometheus
var httpRequestsTotal = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total number of HTTP requests",
},
[]string{"method", "path"},
)
func myHandler(w http.ResponseWriter, r *http.Request) {
httpRequestsTotal.WithLabelValues(r.Method, r.URL.Path).Inc()
// ... логика обработчика
}
2. Логи (Logging)
Записи о событиях, произошедших в определенный момент времени. Отвечают на вопрос «что произошло?». Современные логи — структурированные (например, в формате JSON), что позволяет их легко парсить и анализировать.
- Примеры: ошибка подключения к базе данных, успешная аутентификация пользователя, тело входящего запроса.
- Инструменты в Go:
uber-go/zap
,rs/zerolog
— высокопроизводительные библиотеки для структурированного логирования.
// Пример структурированного лога с помощью zap
logger.Info("User successfully authenticated",
zap.String("username", "alice"),
zap.String("ip_address", "192.168.1.10"),
)
3. Трейсинг (Tracing)
Отслеживание жизненного цикла одного запроса на всем его пути через различные компоненты распределенной системы (микросервисы, базы данных, очереди). Отвечает на вопрос «где возникла проблема или задержка?».
- Примеры: Визуализация, как запрос от пользователя прошел через API Gateway, сервис аутентификации и сервис заказов.
- Инструменты в Go: OpenTelemetry — стандарт де-факто для сбора трейсов. Jaeger, Zipkin — системы для их сбора и визуализации.
Ключевое отличие от мониторинга:
- Мониторинг — это сбор и отображение заранее определенных данных (дашборды). Он говорит вам, что система работает не так, как ожидалось.
- Observability — это инструмент для исследования. Он позволяет задавать системе новые, произвольные вопросы, чтобы понять, почему она ведет себя определенным образом, без необходимости вносить изменения в код и выкатывать новый релиз.