Ответ
Для обеспечения наблюдаемости (Observability) Go-приложений обычно используют комбинацию из трёх основных компонентов: метрик, логов и трассировок.
-
Метрики (Metrics) — числовые данные о состоянии системы в реальном времени.
-
Prometheus: Де-факто стандарт для сбора метрик. Приложение предоставляет метрики по HTTP-эндпоинту (
/metrics), а Prometheus-сервер их периодически собирает.import ( "net/http" "github.com/prometheus/client_golang/prometheus/promhttp" ) func main() { http.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":2112", nil) } expvar: Встроенный в Go пакет для экспорта публичных переменных (счетчиков, статистик) в формате JSON через HTTP (/debug/vars). Проще, чем Prometheus, но менее гибок.
-
-
Логирование (Logging) — запись событий, происходящих в приложении.
- Структурированное логирование: Вместо простого текста логи пишутся в формате JSON или key-value, что упрощает их парсинг и анализ.
- Популярные библиотеки:
zap(очень быстрый) иzerolog(быстрый, с удобным API).
-
Трассировка (Tracing) — отслеживание жизненного цикла запроса через несколько сервисов (в микросервисной архитектуре).
- OpenTelemetry: Современный стандарт для сбора трассировок, метрик и логов. Позволяет отправлять данные в различные бэкенды (Jaeger, Zipkin, Datadog).
- Помогает находить узкие места и понимать взаимодействие между компонентами системы.
-
Профилирование (Profiling) — анализ производительности и потребления ресурсов.
-
pprof: Мощнейший встроенный инструмент в Go. Позволяет анализировать CPU, память, горутины и многое другое.import _ "net/http/pprof" func main() { go func() { // Эндпоинты будут доступны по :6060/debug/pprof/ http.ListenAndServe("localhost:6060", nil) }() }
-
-
Проверки состояния (Health Checks)
- Специальные HTTP-эндпоинты (
/health,/ready), которые сообщают внешним системам (например, Kubernetes или балансировщику), готово ли приложение принимать трафик.
- Специальные HTTP-эндпоинты (
Итог: Комплексный подход, сочетающий Prometheus для метрик, Zap/Zerolog для структурированных логов и OpenTelemetry для трассировок, является современным стандартом для наблюдаемости Go-приложений.
Ответ 18+ 🔞
Да ты посмотри, какая хуйня творится в мире Go-приложений! Чтобы не лететь в пизду вслепую, надо за ними наблюдать, как за детьми в песочнице. А для этого, блядь, три кита: метрики, логи и трассировки. Как три богатыря, только для кода.
Ну, метрики — это как градусник в жопу системе сунуть, понять, горит она или нет. Циферки всякие, в реальном времени.
-
Prometheus — тут вообще пиздец какой король. Приложение выставляет эндпоинт
/metrics, а этот хищный сервер приползает и считывает всё, как маньяк. Всё по HTTP, просто, как три копейки.import ( "net/http" "github.com/prometheus/client_golang/prometheus/promhttp" ) func main() { http.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":2112", nil) } expvar— это как Prometheus, но из коробки и для бедных. Встроенная в Go штука, вываливает переменные в JSON по адресу/debug/vars. Проще некуда, но и возможностей, как у танка с одним патроном.
Логирование — это чтобы потом, когда всё ебнулось, не спрашивать «а что, блядь, произошло?», а просто почитать.
- Структурированное логирование — это когда ты не пишешь роман в лог, а аккуратно раскладываешь события по полочкам, в JSON или key-value. Чтобы потом не ебать мозги регулярками, а просто отфильтровать.
- Библиотеки —
zap(быстрее пули, честно) иzerolog(тоже шустрый, и с ним удобно). Выбирай любую, только не пиши вfmt.Println, а то я тебе в рот чих-пых!
Трассировка — это для тех, у кого микросервисов, как тараканов на кухне. Нужно понять, где этот ебучий запрос завис и кто его задерживает.
- OpenTelemetry — сейчас все орут именно про него. Модно, стильно, молодёжно. Позволяет следить за запросом через все сервисы и скидывать данные куда угодно: в Jaeger, Zipkin, хоть на дашборд начальнику. Прям волшебная палочка для поиска узких мест, ёпта.
Профилирование — это когда приложение жрёт память или CPU, как не в себя, а ты не понимаешь, где дыра. Тут на сцену выходит pprof.
-
Это, блядь, монстр, встроенный прямо в Go. Включаешь его — и он тебе покажет всё: что жрёт процессор, где память течёт, что делают горутины. Просто добавляешь импорт, и вуаля — эндпоинты на
:6060/debug/pprof/готовы к бою.import _ "net/http/pprof" func main() { go func() { // Эндпоинты будут доступны по :6060/debug/pprof/ http.ListenAndServe("localhost:6060", nil) }() }
Ну и куда же без проверок здоровья, а? Health Checks — это такие флажки /health или /ready. Оркестратор типа Kubernetes смотрит на них и решает, можно ли в приложение пихать трафик, или оно уже на боку лежит.
Итог, блядь: Если хочешь спать спокойно, а не тушить пожары в три часа ночи, делай так: Prometheus для метрик, Zap или Zerolog для вменяемых логов и OpenTelemetry для трассировок в микросервисной круговерти. Вот это и есть, сука, полный комплект для взрослой наблюдаемости.