Какие знаешь системные метрики?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Системные метрики в Go: Мониторинг и диагностика
Разработчики на Go работают с обширным набором системных метрик, которые можно разделить на несколько ключевых категорий. Эти метрики необходимы для мониторинга производительности, диагностики проблем и оптимизации приложений в production-среде.
Основные категории метрик
1. Метрики рантайма Go (runtime metrics)
Эти метрики предоставляются пакетом runtime и дают детальную информацию о работе виртуальной машины Go:
- Статистика сборщика мусора (GC): количество сборок, время паузы, размер heap
- Распределение памяти: heap/stack, in-use/allocated, по поколениям (генерациям)
- Горутины: количество активных, созданных за всё время, блокировки
- Потоки (threads): количество системных потоков, locked/unlocked
Пример чтения статистики GC:
package main
import (
"fmt"
"runtime"
"time"
)
func printGCMetrics() {
var memStats runtime.MemStats
runtime.ReadMemStats(&memStats)
fmt.Printf("Alloc = %v MiB", memStats.Alloc/1024/1024)
fmt.Printf("\tHeapAlloc = %v MiB", memStats.HeapAlloc/1024/1024)
fmt.Printf("\tNumGC = %v\n", memStats.NumGC)
fmt.Printf("GCCPUFraction = %v", memStats.GCCPUFraction)
fmt.Printf("\tPauseTotalNs = %v ms\n", memStats.PauseTotalNs/1000000)
}
2. Процессные метрики операционной системы
Метрики уровня процесса получают через пакеты runtime и системные вызовы:
- Использование CPU: user/system время, количество ядер
- Потребление памяти: RSS (Resident Set Size), VMS (Virtual Memory Size)
- Файловые дескрипторы: открытые файлы, сокеты
- Контекстные переключения: voluntary/non-voluntary
Для расширенного мониторинга используют пакет golang.org/x/sys/unix:
import (
"golang.org/x/sys/unix"
)
func getRSS() (uint64, error) {
var rusage unix.Rusage
if err := unix.Getrusage(unix.RUSAGE_SELF, &rusage); err != nil {
return 0, err
}
return uint64(rusage.Maxrss), nil
}
3. Метрики работы приложения (business metrics)
Кастомные метрики, которые разработчик добавляет для мониторинга бизнес-логики:
- Счётчики (counters): количество запросов, ошибок, событий
- Гистограммы (histograms): время обработки запросов, размеры пакетов
- Метрики здоровья (health checks): доступность внешних сервисов
Инструменты и библиотеки для работы с метриками
expvar - встроенный пакет для экспорта метрик
import (
"expvar"
"net/http"
)
func init() {
requests := expvar.NewInt("http_requests_total")
requests.Add(1)
// Доступно по /debug/vars
http.Handle("/debug/vars", expvar.Handler())
}
Prometheus клиент - промышленный стандарт
import (
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
httpRequests = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total HTTP requests",
},
[]string{"method", "endpoint", "status"},
)
)
func init() {
prometheus.MustRegister(httpRequests)
http.Handle("/metrics", promhttp.Handler())
}
pprof - профилирование и deep metrics
import (
_ "net/http/pprof"
"net/http"
)
// Доступны endpoints:
// /debug/pprof/heap - дамп heap
// /debug/pprof/profile - CPU профиль
// /debug/pprof/goroutine - стектрейсы goroutine
// /debug/pprof/block - блокировки
Ключевые паттерны мониторинга
- Сбор метрик с частотой 10-60 секунд - баланс между детализацией и нагрузкой
- Агрегация на стороне агента - уменьшение объёма передаваемых данных
- Многоуровневое хранение - raw данные, агрегаты по часам/дням
- Автоматические алерты - на основе правил (например, 95-й перцентиль latency > 500ms)
Практические рекомендации
- Всегда включайте pprof в production - на отдельном порту с аутентификацией
- Используйте label'ы в Prometheus метриках для многомерного анализа
- Мониторьте стабильность GC: если GC занимает >20% CPU - время оптимизировать
- Следите за утечками goroutine с помощью
runtime.NumGoroutine() - Внедряйте distributed tracing (Jaeger, OpenTelemetry) для комплексного анализа
Критические метрики для production
- SLA-метрики: latency (p50, p95, p99), error rate, availability
- Ресурсные метрики: CPU utilization, memory pressure, I/O wait
- Специфичные для Go: goroutine leak rate, GC pause duration, heap fragmentation
Системные метрики в Go образуют многослойную экосистему, где runtime-метрики дают понимание внутреннего состояния рантайма, процессные метрики показывают потребление системных ресурсов, а бизнес-метрики отражают работу логики приложения. Современный подход предполагает использование OpenTelemetry как унифицированного стандарта для сбора всех типов телеметрии, включая метрики, трейсы и логи.