Prometheus — стандарт де-факто для метрик в Kubernetes. Мы развернули его через kube-prometheus-stack (Helm chart), который включает Prometheus Operator, Grafana и набор стандартных дашбордов.
# Установка kube-prometheus-stack
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install monitoring prometheus-community/kube-prometheus-stack \
--namespace observability --create-namespace \
--values values-prometheus.yaml
Кастомные метрики в Go-сервисе (RED — Rate, Errors, Duration):
package metrics
import (
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
)
var (
// Rate — количество запросов
RequestsTotal = promauto.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total HTTP requests",
},
[]string{"method", "path", "status"},
)
// Duration — время обработки
RequestDuration = promauto.NewHistogramVec(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "HTTP request duration in seconds",
Buckets: []float64{0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5},
},
[]string{"method", "path"},
)
// Errors — бизнес-ошибки
BusinessErrors = promauto.NewCounterVec(
prometheus.CounterOpts{
Name: "business_errors_total",
Help: "Business logic errors",
},
[]string{"service", "error_type"},
)
)
// Middleware для автоматического сбора метрик
func MetricsMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
wrapped := &responseWriter{ResponseWriter: w, statusCode: 200}
next.ServeHTTP(wrapped, r)
duration := time.Since(start).Seconds()
RequestsTotal.WithLabelValues(
r.Method, r.URL.Path, strconv.Itoa(wrapped.statusCode),
).Inc()
RequestDuration.WithLabelValues(
r.Method, r.URL.Path,
).Observe(duration)
})
}
Для долгосрочного хранения метрик (PCI DSS требует 12 месяцев) мы развернули Grafana Mimir — горизонтально масштабируемое хранилище, совместимое с Prometheus remote_write.
Оставить комментарий