Ответ
Для сбора и мониторинга метрик я использую стек, ставший стандартом в cloud-native разработке: Prometheus + Grafana.
1. Prometheus
Prometheus — это система мониторинга и база данных временных рядов. Она работает по модели pull: сервер Prometheus периодически опрашивает (scrapes) эндпоинт /metrics
вашего приложения, чтобы собрать свежие данные.
В Go-приложении это реализуется с помощью библиотеки client_golang
.
Основные типы метрик:
- Counter: Монотонно растущий счетчик (например, общее число HTTP-запросов).
- Gauge: Значение, которое может увеличиваться и уменьшаться (например, количество активных горутин).
- Histogram: Распределение значений по корзинам (бакетам) (например, время ответа на запрос).
- Summary: Похож на гистограмму, но предоставляет квантили на стороне клиента.
Пример кода:
import (
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
// Создаем счетчик для общего числа HTTP-запросов
httpRequestsTotal = promauto.NewCounter(prometheus.CounterOpts{
Name: "myapp_http_requests_total",
Help: "Total number of HTTP requests.",
})
)
func myHandler(w http.ResponseWriter, r *http.Request) {
// Увеличиваем счетчик при каждом вызове
httpRequestsTotal.Inc()
w.Write([]byte("Hello, World!"))
}
func main() {
http.HandleFunc("/", myHandler)
// Отдаем метрики по эндпоинту /metrics
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":8080", nil)
}
2. Grafana
Grafana — это инструмент для визуализации данных из Prometheus (и многих других источников). Она позволяет:
- Строить красивые и информативные дашборды.
- Настраивать алертинг при выходе метрик за пороговые значения.
3. OpenTelemetry (OTel)
Это более современный и комплексный подход, который стремится унифицировать сбор метрик, логов и трейсов (signals). OTel может экспортировать данные в Prometheus, Jaeger и другие системы, что делает его гибким решением для построения полной системы observability.