diff --git a/cmd/neofs-node/config.go b/cmd/neofs-node/config.go index 73ce2734..eab122b9 100644 --- a/cmd/neofs-node/config.go +++ b/cmd/neofs-node/config.go @@ -21,6 +21,7 @@ import ( "github.com/nspcc-dev/neofs-node/pkg/network" tokenStorage "github.com/nspcc-dev/neofs-node/pkg/services/session/storage" "github.com/nspcc-dev/neofs-node/pkg/util/logger" + "github.com/nspcc-dev/neofs-node/pkg/util/profiler" "github.com/pkg/errors" "github.com/spf13/viper" "go.uber.org/zap" @@ -35,6 +36,11 @@ const ( cfgLogInitSampling = "logger.sampling.initial" cfgLogThereafterSampling = "logger.sampling.thereafter" + // pprof keys + cfgProfilerEnable = "pprof.enabled" + cfgProfilerAddr = "pprof.address" + cfgProfilerTTL = "pprof.shutdown_ttl" + // config keys for cfgNodeInfo cfgNodeKey = "node.key" cfgBootstrapAddress = "node.address" @@ -97,6 +103,8 @@ type cfg struct { localAddr *network.Address cfgObject cfgObject + + profiler profiler.Profiler } type cfgGRPC struct { @@ -269,6 +277,10 @@ func defaultConfiguration(v *viper.Viper) { v.SetDefault(cfgLogTrace, "fatal") v.SetDefault(cfgLogInitSampling, 1000) v.SetDefault(cfgLogThereafterSampling, 1000) + + v.SetDefault(cfgProfilerEnable, false) + v.SetDefault(cfgProfilerAddr, ":6060") + v.SetDefault(cfgProfilerTTL, "30s") } func (c *cfg) LocalAddress() *network.Address { diff --git a/cmd/neofs-node/main.go b/cmd/neofs-node/main.go index 0cea0b02..b496a851 100644 --- a/cmd/neofs-node/main.go +++ b/cmd/neofs-node/main.go @@ -37,9 +37,11 @@ func init_(c *cfg) { initContainerService(c) initSessionService(c) initObjectService(c) + initProfiler(c) } func bootUp(c *cfg) { + serveProfiler(c) serveGRPC(c) bootstrapNode(c) } diff --git a/cmd/neofs-node/pprof.go b/cmd/neofs-node/pprof.go new file mode 100644 index 00000000..ba4b4950 --- /dev/null +++ b/cmd/neofs-node/pprof.go @@ -0,0 +1,15 @@ +package main + +import ( + "github.com/nspcc-dev/neofs-node/pkg/util/profiler" +) + +func initProfiler(c *cfg) { + c.profiler = profiler.NewProfiler(c.log, c.viper) +} + +func serveProfiler(c *cfg) { + if c.profiler != nil { + c.profiler.Start(c.ctx) + } +}