Commit 2a7be367 authored by Joshua Gutow's avatar Joshua Gutow Committed by GitHub

bedrock: Optional pprof servers (#3136)

* op-batcher: Enable optional pprof server

* op-proposer: Enable optional pprof server

* op-node: Eanble optional pprof server
Co-authored-by: default avatarmergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
parent f1bcf4b8
...@@ -6,6 +6,9 @@ import ( ...@@ -6,6 +6,9 @@ import (
"fmt" "fmt"
"io" "io"
"math/big" "math/big"
"net"
"net/http"
_ "net/http/pprof"
"os" "os"
"os/signal" "os/signal"
"sync" "sync"
...@@ -76,6 +79,26 @@ func Main(version string) func(ctx *cli.Context) error { ...@@ -76,6 +79,26 @@ func Main(version string) func(ctx *cli.Context) error {
defer batchSubmitter.Stop() defer batchSubmitter.Stop()
l.Info("Batch Submitter started") l.Info("Batch Submitter started")
if cfg.PprofEnabled {
var srv http.Server
srv.Addr = net.JoinHostPort(cfg.PprofAddr, cfg.PprofPort)
// Start pprof server + register it's shutdown
go func() {
l.Info("pprof server started", "addr", srv.Addr)
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
l.Error("error in pprof server", "err", err)
} else {
l.Info("pprof server shutting down")
}
}()
defer func() {
shutCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
err := srv.Shutdown(shutCtx)
l.Info("pprof server shut down", "err", err)
}()
}
interruptChannel := make(chan os.Signal, 1) interruptChannel := make(chan os.Signal, 1)
signal.Notify(interruptChannel, []os.Signal{ signal.Notify(interruptChannel, []os.Signal{
......
...@@ -68,6 +68,11 @@ type Config struct { ...@@ -68,6 +68,11 @@ type Config struct {
// LogTerminal if true, will log to stdout in terminal format. Otherwise the // LogTerminal if true, will log to stdout in terminal format. Otherwise the
// output will be in JSON format. // output will be in JSON format.
LogTerminal bool LogTerminal bool
// Flags for the pprof server
PprofEnabled bool
PprofAddr string
PprofPort string
} }
// NewConfig parses the Config from the provided flags or environment variables. // NewConfig parses the Config from the provided flags or environment variables.
...@@ -88,7 +93,10 @@ func NewConfig(ctx *cli.Context) Config { ...@@ -88,7 +93,10 @@ func NewConfig(ctx *cli.Context) Config {
SequencerHDPath: ctx.GlobalString(flags.SequencerHDPathFlag.Name), SequencerHDPath: ctx.GlobalString(flags.SequencerHDPathFlag.Name),
SequencerBatchInboxAddress: ctx.GlobalString(flags.SequencerBatchInboxAddressFlag.Name), SequencerBatchInboxAddress: ctx.GlobalString(flags.SequencerBatchInboxAddressFlag.Name),
/* Optional Flags */ /* Optional Flags */
LogLevel: ctx.GlobalString(flags.LogLevelFlag.Name), LogLevel: ctx.GlobalString(flags.LogLevelFlag.Name),
LogTerminal: ctx.GlobalBool(flags.LogTerminalFlag.Name), LogTerminal: ctx.GlobalBool(flags.LogTerminalFlag.Name),
PprofEnabled: ctx.GlobalBool(flags.PprofEnabledFlag.Name),
PprofAddr: ctx.GlobalString(flags.PprofAddrFlag.Name),
PprofPort: ctx.GlobalString(flags.PprofPortFlag.Name),
} }
} }
...@@ -113,6 +113,23 @@ var ( ...@@ -113,6 +113,23 @@ var (
"in JSON format.", "in JSON format.",
EnvVar: prefixEnvVar("LOG_TERMINAL"), EnvVar: prefixEnvVar("LOG_TERMINAL"),
} }
PprofEnabledFlag = cli.BoolFlag{
Name: "pprof.enabled",
Usage: "Enable the pprof server",
EnvVar: prefixEnvVar("PPROF_ENABLED"),
}
PprofAddrFlag = cli.StringFlag{
Name: "pprof.addr",
Usage: "pprof listening address",
Value: "0.0.0.0",
EnvVar: prefixEnvVar("PPROF_ADDR"),
}
PprofPortFlag = cli.IntFlag{
Name: "pprof.port",
Usage: "pprof listening port",
Value: 6060,
EnvVar: prefixEnvVar("PPROF_PORT"),
}
) )
var requiredFlags = []cli.Flag{ var requiredFlags = []cli.Flag{
...@@ -134,6 +151,9 @@ var requiredFlags = []cli.Flag{ ...@@ -134,6 +151,9 @@ var requiredFlags = []cli.Flag{
var optionalFlags = []cli.Flag{ var optionalFlags = []cli.Flag{
LogLevelFlag, LogLevelFlag,
LogTerminalFlag, LogTerminalFlag,
PprofEnabledFlag,
PprofAddrFlag,
PprofPortFlag,
} }
// Flags contains the list of configuration options available to the binary. // Flags contains the list of configuration options available to the binary.
......
...@@ -2,9 +2,12 @@ package main ...@@ -2,9 +2,12 @@ package main
import ( import (
"context" "context"
"net"
"net/http"
"os" "os"
"os/signal" "os/signal"
"syscall" "syscall"
"time"
"github.com/ethereum-optimism/optimism/op-node/metrics" "github.com/ethereum-optimism/optimism/op-node/metrics"
...@@ -101,6 +104,27 @@ func RollupNodeMain(ctx *cli.Context) error { ...@@ -101,6 +104,27 @@ func RollupNodeMain(ctx *cli.Context) error {
m.RecordUp() m.RecordUp()
log.Info("Rollup node started") log.Info("Rollup node started")
if cfg.Pprof.Enabled {
var srv http.Server
srv.Addr = net.JoinHostPort(cfg.Pprof.ListenAddr, cfg.Pprof.ListenPort)
// Start pprof server + register it's shutdown
go func() {
log.Info("pprof server started", "addr", srv.Addr)
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
log.Error("error in pprof server", "err", err)
} else {
log.Info("pprof server shutting down")
}
}()
defer func() {
shutCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
err := srv.Shutdown(shutCtx)
log.Info("pprof server shut down", "err", err)
}()
}
interruptChannel := make(chan os.Signal, 1) interruptChannel := make(chan os.Signal, 1)
signal.Notify(interruptChannel, []os.Signal{ signal.Notify(interruptChannel, []os.Signal{
os.Interrupt, os.Interrupt,
......
...@@ -111,6 +111,23 @@ var ( ...@@ -111,6 +111,23 @@ var (
Value: 7300, Value: 7300,
EnvVar: prefixEnvVar("METRICS_PORT"), EnvVar: prefixEnvVar("METRICS_PORT"),
} }
PprofEnabledFlag = cli.BoolFlag{
Name: "pprof.enabled",
Usage: "Enable the pprof server",
EnvVar: prefixEnvVar("PPROF_ENABLED"),
}
PprofAddrFlag = cli.StringFlag{
Name: "pprof.addr",
Usage: "pprof listening address",
Value: "0.0.0.0",
EnvVar: prefixEnvVar("PPROF_ADDR"),
}
PprofPortFlag = cli.IntFlag{
Name: "pprof.port",
Usage: "pprof listening port",
Value: 6060,
EnvVar: prefixEnvVar("PPROF_PORT"),
}
SnapshotLog = cli.StringFlag{ SnapshotLog = cli.StringFlag{
Name: "snapshotlog.file", Name: "snapshotlog.file",
...@@ -139,6 +156,9 @@ var optionalFlags = append([]cli.Flag{ ...@@ -139,6 +156,9 @@ var optionalFlags = append([]cli.Flag{
MetricsEnabledFlag, MetricsEnabledFlag,
MetricsAddrFlag, MetricsAddrFlag,
MetricsPortFlag, MetricsPortFlag,
PprofEnabledFlag,
PprofAddrFlag,
PprofPortFlag,
SnapshotLog, SnapshotLog,
}, p2pFlags...) }, p2pFlags...)
......
...@@ -28,6 +28,8 @@ type Config struct { ...@@ -28,6 +28,8 @@ type Config struct {
Metrics MetricsConfig Metrics MetricsConfig
Pprof PprofConfig
// Optional // Optional
Tracer Tracer Tracer Tracer
} }
...@@ -59,6 +61,16 @@ func (m MetricsConfig) Check() error { ...@@ -59,6 +61,16 @@ func (m MetricsConfig) Check() error {
return nil return nil
} }
type PprofConfig struct {
Enabled bool
ListenAddr string
ListenPort string
}
func (p PprofConfig) Check() error {
return nil
}
// Check verifies that the given configuration makes sense // Check verifies that the given configuration makes sense
func (cfg *Config) Check() error { func (cfg *Config) Check() error {
if err := cfg.L2.Check(); err != nil { if err := cfg.L2.Check(); err != nil {
...@@ -70,6 +82,9 @@ func (cfg *Config) Check() error { ...@@ -70,6 +82,9 @@ func (cfg *Config) Check() error {
if err := cfg.Metrics.Check(); err != nil { if err := cfg.Metrics.Check(); err != nil {
return fmt.Errorf("metrics config error: %w", err) return fmt.Errorf("metrics config error: %w", err)
} }
if err := cfg.Pprof.Check(); err != nil {
return fmt.Errorf("pprof config error: %w", err)
}
if cfg.P2P != nil { if cfg.P2P != nil {
if err := cfg.P2P.Check(); err != nil { if err := cfg.P2P.Check(); err != nil {
return fmt.Errorf("p2p config error: %w", err) return fmt.Errorf("p2p config error: %w", err)
......
...@@ -68,6 +68,11 @@ func NewConfig(ctx *cli.Context, log log.Logger) (*node.Config, error) { ...@@ -68,6 +68,11 @@ func NewConfig(ctx *cli.Context, log log.Logger) (*node.Config, error) {
ListenAddr: ctx.GlobalString(flags.MetricsAddrFlag.Name), ListenAddr: ctx.GlobalString(flags.MetricsAddrFlag.Name),
ListenPort: ctx.GlobalInt(flags.MetricsPortFlag.Name), ListenPort: ctx.GlobalInt(flags.MetricsPortFlag.Name),
}, },
Pprof: node.PprofConfig{
Enabled: ctx.GlobalBool(flags.PprofEnabledFlag.Name),
ListenAddr: ctx.GlobalString(flags.PprofAddrFlag.Name),
ListenPort: ctx.GlobalString(flags.PprofPortFlag.Name),
},
P2P: p2pConfig, P2P: p2pConfig,
P2PSigner: p2pSignerSetup, P2PSigner: p2pSignerSetup,
} }
......
...@@ -57,6 +57,11 @@ type Config struct { ...@@ -57,6 +57,11 @@ type Config struct {
// LogTerminal if true, will log to stdout in terminal format. Otherwise the // LogTerminal if true, will log to stdout in terminal format. Otherwise the
// output will be in JSON format. // output will be in JSON format.
LogTerminal bool LogTerminal bool
// Flags for the pprof server
PprofEnabled bool
PprofAddr string
PprofPort string
} }
// NewConfig parses the Config from the provided flags or environment variables. // NewConfig parses the Config from the provided flags or environment variables.
...@@ -74,7 +79,10 @@ func NewConfig(ctx *cli.Context) Config { ...@@ -74,7 +79,10 @@ func NewConfig(ctx *cli.Context) Config {
Mnemonic: ctx.GlobalString(flags.MnemonicFlag.Name), Mnemonic: ctx.GlobalString(flags.MnemonicFlag.Name),
L2OutputHDPath: ctx.GlobalString(flags.L2OutputHDPathFlag.Name), L2OutputHDPath: ctx.GlobalString(flags.L2OutputHDPathFlag.Name),
/* Optional Flags */ /* Optional Flags */
LogLevel: ctx.GlobalString(flags.LogLevelFlag.Name), LogLevel: ctx.GlobalString(flags.LogLevelFlag.Name),
LogTerminal: ctx.GlobalBool(flags.LogTerminalFlag.Name), LogTerminal: ctx.GlobalBool(flags.LogTerminalFlag.Name),
PprofEnabled: ctx.GlobalBool(flags.PprofEnabledFlag.Name),
PprofAddr: ctx.GlobalString(flags.PprofAddrFlag.Name),
PprofPort: ctx.GlobalString(flags.PprofPortFlag.Name),
} }
} }
...@@ -95,6 +95,23 @@ var ( ...@@ -95,6 +95,23 @@ var (
"in JSON format.", "in JSON format.",
EnvVar: prefixEnvVar("LOG_TERMINAL"), EnvVar: prefixEnvVar("LOG_TERMINAL"),
} }
PprofEnabledFlag = cli.BoolFlag{
Name: "pprof.enabled",
Usage: "Enable the pprof server",
EnvVar: prefixEnvVar("PPROF_ENABLED"),
}
PprofAddrFlag = cli.StringFlag{
Name: "pprof.addr",
Usage: "pprof listening address",
Value: "0.0.0.0",
EnvVar: prefixEnvVar("PPROF_ADDR"),
}
PprofPortFlag = cli.IntFlag{
Name: "pprof.port",
Usage: "pprof listening port",
Value: 6060,
EnvVar: prefixEnvVar("PPROF_PORT"),
}
) )
var requiredFlags = []cli.Flag{ var requiredFlags = []cli.Flag{
...@@ -113,6 +130,9 @@ var requiredFlags = []cli.Flag{ ...@@ -113,6 +130,9 @@ var requiredFlags = []cli.Flag{
var optionalFlags = []cli.Flag{ var optionalFlags = []cli.Flag{
LogLevelFlag, LogLevelFlag,
LogTerminalFlag, LogTerminalFlag,
PprofEnabledFlag,
PprofAddrFlag,
PprofPortFlag,
} }
// Flags contains the list of configuration options available to the binary. // Flags contains the list of configuration options available to the binary.
......
...@@ -3,6 +3,9 @@ package op_proposer ...@@ -3,6 +3,9 @@ package op_proposer
import ( import (
"context" "context"
"fmt" "fmt"
"net"
"net/http"
_ "net/http/pprof"
"os" "os"
"os/signal" "os/signal"
"syscall" "syscall"
...@@ -68,6 +71,27 @@ func Main(version string) func(ctx *cli.Context) error { ...@@ -68,6 +71,27 @@ func Main(version string) func(ctx *cli.Context) error {
l.Info("L2 Output Submitter started") l.Info("L2 Output Submitter started")
if cfg.PprofEnabled {
var srv http.Server
srv.Addr = net.JoinHostPort(cfg.PprofAddr, cfg.PprofPort)
// Start pprof server + register it's shutdown
go func() {
l.Info("pprof server started", "addr", srv.Addr)
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
l.Error("error in pprof server", "err", err)
} else {
l.Info("pprof server shutting down")
}
}()
defer func() {
shutCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
err := srv.Shutdown(shutCtx)
l.Info("pprof server shut down", "err", err)
}()
}
interruptChannel := make(chan os.Signal, 1) interruptChannel := make(chan os.Signal, 1)
signal.Notify(interruptChannel, []os.Signal{ signal.Notify(interruptChannel, []os.Signal{
os.Interrupt, os.Interrupt,
......
...@@ -63,10 +63,12 @@ services: ...@@ -63,10 +63,12 @@ services:
--metrics.enabled --metrics.enabled
--metrics.addr=0.0.0.0 --metrics.addr=0.0.0.0
--metrics.port=7300 --metrics.port=7300
--pprof.enabled
ports: ports:
- "7545:8545" - "7545:8545"
- "9003:9003" - "9003:9003"
- "7300:7300" - "7300:7300"
- "6060:6060"
volumes: volumes:
- ${PWD}/p2p-sequencer-key.txt:/config/p2p-sequencer-key.txt - ${PWD}/p2p-sequencer-key.txt:/config/p2p-sequencer-key.txt
- ${PWD}/p2p-node-key.txt:/config/p2p-node-key.txt - ${PWD}/p2p-node-key.txt:/config/p2p-node-key.txt
...@@ -82,6 +84,8 @@ services: ...@@ -82,6 +84,8 @@ services:
build: build:
context: ../ context: ../
dockerfile: ./op-proposer/Dockerfile dockerfile: ./op-proposer/Dockerfile
ports:
- "6062:6060"
environment: environment:
L1_ETH_RPC: http://l1:8545 L1_ETH_RPC: http://l1:8545
L2_ETH_RPC: http://l2:8545 L2_ETH_RPC: http://l2:8545
...@@ -94,6 +98,7 @@ services: ...@@ -94,6 +98,7 @@ services:
OUTPUT_SUBMITTER_L2_OUTPUT_HD_PATH: "m/44'/60'/0'/0/1" OUTPUT_SUBMITTER_L2_OUTPUT_HD_PATH: "m/44'/60'/0'/0/1"
OUTPUT_SUBMITTER_LOG_TERMINAL: "true" OUTPUT_SUBMITTER_LOG_TERMINAL: "true"
L2OO_ADDRESS: "${L2OO_ADDRESS}" L2OO_ADDRESS: "${L2OO_ADDRESS}"
OUTPUT_SUBMITTER_PPROF_ENABLED: "true"
op-batcher: op-batcher:
depends_on: depends_on:
...@@ -103,6 +108,8 @@ services: ...@@ -103,6 +108,8 @@ services:
build: build:
context: ../ context: ../
dockerfile: ./op-batcher/Dockerfile dockerfile: ./op-batcher/Dockerfile
ports:
- "6061:6060"
environment: environment:
L1_ETH_RPC: http://l1:8545 L1_ETH_RPC: http://l1:8545
L2_ETH_RPC: http://l2:8545 L2_ETH_RPC: http://l2:8545
...@@ -120,6 +127,7 @@ services: ...@@ -120,6 +127,7 @@ services:
BATCH_SUBMITTER_SEQUENCER_GENESIS_HASH: "${SEQUENCER_GENESIS_HASH}" BATCH_SUBMITTER_SEQUENCER_GENESIS_HASH: "${SEQUENCER_GENESIS_HASH}"
BATCH_SUBMITTER_SEQUENCER_BATCH_INBOX_ADDRESS: "${SEQUENCER_BATCH_INBOX_ADDRESS}" BATCH_SUBMITTER_SEQUENCER_BATCH_INBOX_ADDRESS: "${SEQUENCER_BATCH_INBOX_ADDRESS}"
BATCH_SUBMITTER_LOG_TERMINAL: "true" BATCH_SUBMITTER_LOG_TERMINAL: "true"
BATCH_SUBMITTER_PPROF_ENABLED: "true"
stateviz: stateviz:
build: build:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment