Ответ
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 — это инструмент для исследования. Он позволяет задавать системе новые, произвольные вопросы, чтобы понять, почему она ведет себя определенным образом, без необходимости вносить изменения в код и выкатывать новый релиз.
Ответ 18+ 🔞
Слушай, ну вот объясняю тебе, как бабушке на лавочке про эту вашу «обсервабилити», блядь. Это не просто «ой, лампочка загорелась». Это когда ты можешь заглянуть системе прямо в кишки и понять, почему она блюёт, а не просто видишь, что она уже блёванула.
Держись за поручни, поехали. Вся эта хрень стоит на трёх китах, как тот мир, блядь.
1. Метрики (Metrics)
Это как градусник в жопу системе. Циферки, которые ты тыкаешь раз в N времени. Отвечают на вопрос: «Система, ты жива? Или уже в отключке?».
- Что это: Загрузка процессора, свободная память (или её пиздец), сколько запросов в секунду (RPS), сколько времени отвечает (latency), сколько ошибок наворотила.
- Чем колдовать в Go: Берёшь
prometheus/client_golang, суёшь счётчики куда надо, а потом смотришь на красивые графики в Прометеусе.
// Счётчик, который плюсует каждый раз, когда кто-то дергает наш HTTP-хэндлер
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)
Это её внутренний монолог, дневничок. Запись о том, что случилось в конкретный момент. Отвечает на вопрос: «А что, блядь, конкретно произошло в 14:32:01?».
- Что это: «Не смог подключиться к БД, потому что пароль «admin123» не прошёл», «Пользователь Вася успешно залогинился», «Пришёл запрос с телом, от которого волосы дыбом».
- Чем колдовать в Go: Забудь про стандартный
log. Бериzapилиzerolog. Они быстрые и пишут логи структурированно (в JSON), чтобы потом не ебаться с парсингом.
// Пример нормального, человеческого лога
logger.Info("User successfully authenticated",
zap.String("username", "alice"), // Кто?
zap.String("ip_address", "192.168.1.10"), // Откуда?
)
3. Трейсинг (Tracing)
А это самое сокровенное, блядь. Представь, что ты можешь подсветить флуоресцентным маркером один-единственный запрос от пользователя и проследить, как он, как угорелый, носится по всем твоим микросервисам, базам и очередям. Отвечает на вопрос: «Где конкретно, в каком сервисе, этот пидорский запрос застрял на 5 секунд?».
- Что это: Наглядная картинка, как запрос «создать заказ» прошёл через API Gateway, сервис пользователей, сервис оплаты и улетел в очередь нотификаций.
- Чем колдовать в Go: OpenTelemetry — это сейчас царь и бог. Собираешь трейсы им, а смотреть идешь в Jaeger или Zipkin.
И главное, ёпта, отличие от просто мониторинга:
- Мониторинг — это когда у тебя на стене висит дашборд с кучей графиков, и ты видишь, что один из них ушёл в красную зону. Ты знаешь что сломалось. «Ой, латентность подскочила».
- Observability — это когда ты видишь этот красный график и говоришь: «А ну-ка, дай-ка я покопаюсь». И без всякого деплоя нового кода, через логи, метрики и трейсы, ты находишь причину: «А, бля, это потому что в 14:30 БД ушла в ребут, и кэш-сервис начал тупить, как мартышлюшка». Вот это и есть понимание почему. Чистая магия, а не инженерия.