← Назад к вопросам

Какие знаешь системные метрики?

2.0 Middle🔥 171 комментариев
#Observability#Операционные системы и Linux#Производительность и оптимизация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Системные метрики в 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 - блокировки

Ключевые паттерны мониторинга

  1. Сбор метрик с частотой 10-60 секунд - баланс между детализацией и нагрузкой
  2. Агрегация на стороне агента - уменьшение объёма передаваемых данных
  3. Многоуровневое хранение - raw данные, агрегаты по часам/дням
  4. Автоматические алерты - на основе правил (например, 95-й перцентиль latency > 500ms)

Практические рекомендации

  • Всегда включайте pprof в production - на отдельном порту с аутентификацией
  • Используйте label'ы в Prometheus метриках для многомерного анализа
  • Мониторьте стабильность GC: если GC занимает >20% CPU - время оптимизировать
  • Следите за утечками goroutine с помощью runtime.NumGoroutine()
  • Внедряйте distributed tracing (Jaeger, OpenTelemetry) для комплексного анализа

Критические метрики для production

  1. SLA-метрики: latency (p50, p95, p99), error rate, availability
  2. Ресурсные метрики: CPU utilization, memory pressure, I/O wait
  3. Специфичные для Go: goroutine leak rate, GC pause duration, heap fragmentation

Системные метрики в Go образуют многослойную экосистему, где runtime-метрики дают понимание внутреннего состояния рантайма, процессные метрики показывают потребление системных ресурсов, а бизнес-метрики отражают работу логики приложения. Современный подход предполагает использование OpenTelemetry как унифицированного стандарта для сбора всех типов телеметрии, включая метрики, трейсы и логи.

Какие знаешь системные метрики? | PrepBro