import _ "net/http/pprof"
go func() {
log.Println(http.ListenAndServe(":6060", nil))
}()
Доступные профили:
http://localhost:6060/debug/pprof/heap
— профиль памятиhttp://localhost:6060/debug/pprof/profile
— CPU профильhttp://localhost:6060/debug/pprof/goroutine?debug=2
— дамп горутинgo tool pprof -http=:8080 http://localhost:6060/debug/pprof/profile?seconds=30
Пример экспорта метрик:
import "github.com/prometheus/client_golang/prometheus"
var (
requests = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total HTTP requests",
},
[]string{"method", "status"},
)
)
func init() {
prometheus.MustRegister(requests)
}
Ключевые метрики:
Структурированное логирование:
import "go.uber.org/zap"
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("Request processed",
zap.String("path", r.URL.Path),
zap.Duration("duration", elapsed),
zap.Int("status", statusCode),
)
Пример с Jaeger:
import "go.opentelemetry.io/otel"
tracer := otel.Tracer("service-name")
ctx, span := tracer.Start(ctx, "operation-name")
defer span.End()
go tool pprof -alloc_space http://localhost:6060/debug/pprof/heap
go tool pprof -http=:8080 http://localhost:6060/debug/pprof/profile
curl http://localhost:6060/debug/pprof/goroutine?debug=1 > goroutines.txt
Безопасные методы:
Пример безопасного профилирования:
if rand.Intn(100) == 0 { // 1% запросов
f, _ := os.Create(fmt.Sprintf("cpu_%d.pprof", time.Now().Unix()))
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
}
Метрики GC:
import "runtime/debug"
debug.SetGCPercent(100) // Настройка GC
Просмотр статистики:
GODEBUG=gctrace=1 ./myapp
эффективный поиск проблем производительности требует комбинации инструментов — pprof для детального анализа, метрик для мониторинга в реальном времени, трассировок для распределенных систем и структурированного логирования. Всегда начинайте с метрик высокого уровня, затем переходите к профилям и глубокому анализу.