Ответ
Настройка метрик — ключевая часть мониторинга. Я обычно использую Prometheus для сбора и Grafana для визуализации. Вот пример настройки на Go (так как это типичный стек для DevOps), но принципы универсальны.
1. Интеграция Prometheus клиента:
import (
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
// Определяем метрики
var (
httpRequestsTotal = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total number of HTTP requests.",
},
[]string{"method", "endpoint", "status"},
)
requestDuration = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "Duration of HTTP requests.",
Buckets: prometheus.DefBuckets,
},
[]string{"method", "endpoint"},
)
)
func init() {
prometheus.MustRegister(httpRequestsTotal, requestDuration)
}
2. Инструментирование кода приложения:
func myHandler(w http.ResponseWriter, r *http.Request) {
timer := prometheus.NewTimer(requestDuration.WithLabelValues(r.Method, r.URL.Path))
defer timer.ObserveDuration()
// Логика обработчика...
status := "200"
httpRequestsTotal.WithLabelValues(r.Method, r.URL.Path, status).Inc()
w.WriteHeader(http.StatusOK)
w.Write([]byte("OK"))
}
func main() {
// Экспортируем метрики по /metrics
http.Handle("/metrics", promhttp.Handler())
http.HandleFunc("/", myHandler)
http.ListenAndServe(":8080", nil)
}
3. Конфигурация Prometheus (prometheus.yml):
scrape_configs:
- job_name: 'my_app'
static_configs:
- targets: ['app:8080']
4. Основные типы метрик:
- Counter — монотонно растущий счетчик (запросы, ошибки).
- Gauge — значение, которое может увеличиваться и уменьшаться (размер очереди, использование памяти).
- Histogram/Summary — для измерения распределения значений (время ответа, размер пакета).
5. Продакшен-практики:
- Используйте Service Discovery (Kubernetes, Consul) для динамического добавления целей.
- Настройте AlertManager для алертинга на основе правил в PromQL.
- Для краткосрочных задач (batch jobs) используйте PushGateway.
- Храните долгосрочные данные в Thanos или Cortex для горизонтального масштабирования.