Ответ
Метрики в Go-приложениях обычно собирают с помощью специализированных библиотек и отправляют в системы мониторинга. Основные подходы:
-
Prometheus
- Описание: Самый популярный стандарт в индустрии для сбора метрик. Работает по pull-модели: приложение предоставляет метрики по HTTP-эндпоинту (
/metrics
), а сервер Prometheus периодически их опрашивает. - Библиотека:
github.com/prometheus/client_golang
. - Пример:
import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "net/http" )
var ( // Определяем метрику типа Counter requestsTotal = prometheus.NewCounter(prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of http requests.", }) )
func init() { // Регистрируем метрику в глобальном реестре prometheus.MustRegister(requestsTotal) }
func main() { // Увеличиваем счетчик при каждом запросе requestsTotal.Inc()
// Создаем хендлер для отдачи метрик http.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":8080", nil)
}
- Описание: Самый популярный стандарт в индустрии для сбора метрик. Работает по pull-модели: приложение предоставляет метрики по HTTP-эндпоинту (
-
OpenTelemetry (OTel)
- Описание: Современный, вендор-независимый стандарт для сбора телеметрии (метрики, трейсы, логи). Позволяет гибко настраивать экспорт данных в различные бэкенды (Prometheus, Jaeger, Grafana и др.), не меняя код приложения. Считается предпочтительным подходом для новых систем.
-
StatsD / Graphite
- Описание: Легковесная система, работающая по push-модели. Приложение отправляет метрики по UDP-протоколу агенту StatsD, который их агрегирует и пересылает в систему хранения, например, Graphite. Плюсы: минимальное влияние на производительность приложения.
-
InfluxDB
- Описание: Специализированная база данных временных рядов (Time Series Database), оптимизированная для хранения и обработки метрик и событий. Приложения могут отправлять метрики напрямую в InfluxDB по HTTP API.