Что такое Observability (наблюдаемость) в контексте бэкенд-систем?

Ответ

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 — это инструмент для исследования. Он позволяет задавать системе новые, произвольные вопросы, чтобы понять, почему она ведет себя определенным образом, без необходимости вносить изменения в код и выкатывать новый релиз.