nitro server fixes
inject logger into slog for nitro
This commit is contained in:
parent
ba0ba384fc
commit
49a9af72d5
@ -149,7 +149,7 @@ func InitRootCmd[T app.Tx](
|
||||
|
||||
// nitrobank := deps.ModuleManager.Modules()[nitrobank.ModuleName].(nitrobank.AppModule)
|
||||
// accounts := deps.ModuleManager.Modules()[accounts.ModuleName]
|
||||
nitroServer, err := nitro.New(logger, deps.GlobalConfig)
|
||||
nitroServer, err := nitro.NewServer(logger, deps.GlobalConfig, deps.ClientContext)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
94
cmd/laconicd/cmd/log.go
Normal file
94
cmd/laconicd/cmd/log.go
Normal file
@ -0,0 +1,94 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"log/slog"
|
||||
"math"
|
||||
"time"
|
||||
|
||||
"cosmossdk.io/core/server"
|
||||
"cosmossdk.io/log"
|
||||
sdk_slog "cosmossdk.io/log/slog"
|
||||
serverv2 "cosmossdk.io/server/v2"
|
||||
"github.com/lmittmann/tint"
|
||||
)
|
||||
|
||||
// TODO stderr logger?
|
||||
|
||||
func newSlogLogger(cfg server.ConfigMap, out io.Writer) (log.Logger, error) {
|
||||
handler, err := newSlogHandler(cfg, out)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return sdk_slog.NewCustomLogger(slog.New(handler)), nil
|
||||
}
|
||||
|
||||
// newSlogHandler creates a slog handler based on the server configuration.
|
||||
func newSlogHandler(cfg server.ConfigMap, out io.Writer) (slog.Handler, error) {
|
||||
var (
|
||||
format string
|
||||
noColor bool
|
||||
trace bool
|
||||
level string
|
||||
)
|
||||
if v, ok := cfg[serverv2.FlagLogFormat]; ok {
|
||||
format = v.(string)
|
||||
}
|
||||
if v, ok := cfg[serverv2.FlagLogNoColor]; ok {
|
||||
noColor = v.(bool)
|
||||
}
|
||||
if v, ok := cfg[serverv2.FlagTrace]; ok {
|
||||
trace = v.(bool)
|
||||
}
|
||||
if v, ok := cfg[serverv2.FlagLogLevel]; ok {
|
||||
level = v.(string)
|
||||
}
|
||||
_ = trace
|
||||
|
||||
logLvl, err := parseSlogLevel(level)
|
||||
if err != nil {
|
||||
// If the log level is not a valid zerolog level, then we try to parse it as a key filter.
|
||||
filterFunc, err := log.ParseLogLevel(level, parseSlogLevel)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out = log.NewFilterWriter(out, filterFunc)
|
||||
}
|
||||
|
||||
var handler slog.Handler
|
||||
// if json format is requested, ignore no_color
|
||||
if format == serverv2.OutputFormatJSON {
|
||||
handler = slog.NewJSONHandler(out, &slog.HandlerOptions{
|
||||
Level: logLvl,
|
||||
})
|
||||
} else {
|
||||
handler = tint.NewHandler(out, &tint.Options{
|
||||
Level: logLvl,
|
||||
TimeFormat: time.Kitchen,
|
||||
NoColor: noColor,
|
||||
})
|
||||
}
|
||||
return handler, nil
|
||||
}
|
||||
|
||||
func parseSlogLevel(l string) (slog.Level, error) {
|
||||
// Legal log level values are hardcoded into server/v2 command factory:
|
||||
// (trace|debug|info|warn|error|fatal|panic|disabled or '*:<level>,<key>:<level>')
|
||||
// however, slog only has debug, info, warn, error
|
||||
switch l {
|
||||
case "debug", "trace":
|
||||
return slog.LevelDebug, nil
|
||||
case "info":
|
||||
return slog.LevelInfo, nil
|
||||
case "warn":
|
||||
return slog.LevelWarn, nil
|
||||
case "error":
|
||||
return slog.LevelError, nil
|
||||
case "fatal", "panic":
|
||||
return slog.LevelError, nil
|
||||
case "disabled":
|
||||
return slog.Level(math.MaxInt), nil
|
||||
}
|
||||
return 0, fmt.Errorf("invalid log level: %s", l)
|
||||
}
|
@ -42,6 +42,7 @@ func NewRootCmd[T app.Tx](
|
||||
serverv2.WithConfigWriter(configWriter),
|
||||
serverv2.WithStdDefaultHomeDir(DefaultNodeHome),
|
||||
serverv2.WithLoggerFactory(serverv2.NewLogger),
|
||||
// serverv2.WithLoggerFactory(newSlogLogger),
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
3
go.mod
3
go.mod
@ -69,6 +69,7 @@ require (
|
||||
cosmossdk.io/x/protocolpool v1.0.0-alpha.4
|
||||
cosmossdk.io/x/slashing v0.0.0-20241007000829-38662ecb209f
|
||||
cosmossdk.io/x/staking v1.0.0-alpha.4
|
||||
github.com/lmittmann/tint v1.0.2
|
||||
)
|
||||
|
||||
require (
|
||||
@ -222,7 +223,6 @@ require (
|
||||
github.com/libp2p/go-reuseport v0.4.0 // indirect
|
||||
github.com/libp2p/go-yamux/v4 v4.0.1 // indirect
|
||||
github.com/linxGnu/grocksdb v1.9.3 // indirect
|
||||
github.com/lmittmann/tint v1.0.2 // indirect
|
||||
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
|
||||
github.com/magiconair/properties v1.8.7 // indirect
|
||||
github.com/manifoldco/promptui v0.9.0 // indirect
|
||||
@ -384,6 +384,7 @@ replace (
|
||||
cosmossdk.io/client/v2 => ../mod/cosmos-sdk/client/v2
|
||||
cosmossdk.io/core/testing => ../mod/cosmos-sdk/core/testing
|
||||
cosmossdk.io/depinject => ../mod/cosmos-sdk/depinject
|
||||
cosmossdk.io/log => ../mod/cosmos-sdk/log
|
||||
cosmossdk.io/runtime/v2 => ../mod/cosmos-sdk/runtime/v2
|
||||
cosmossdk.io/server/v2 => ../mod/cosmos-sdk/server/v2
|
||||
cosmossdk.io/server/v2/appmanager => ../mod/cosmos-sdk/server/v2/appmanager
|
||||
|
2
go.sum
2
go.sum
@ -14,8 +14,6 @@ cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0=
|
||||
cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U=
|
||||
cosmossdk.io/errors/v2 v2.0.0-20240731132947-df72853b3ca5 h1:IQNdY2kB+k+1OM2DvqFG1+UgeU1JzZrWtwuWzI3ZfwA=
|
||||
cosmossdk.io/errors/v2 v2.0.0-20240731132947-df72853b3ca5/go.mod h1:0CuYKkFHxc1vw2JC+t21THBCALJVROrWVR/3PQ1urpc=
|
||||
cosmossdk.io/log v1.5.0 h1:dVdzPJW9kMrnAYyMf1duqacoidB9uZIl+7c6z0mnq0g=
|
||||
cosmossdk.io/log v1.5.0/go.mod h1:Tr46PUJjiUthlwQ+hxYtUtPn4D/oCZXAkYevBeh5+FI=
|
||||
cosmossdk.io/math v1.4.0 h1:XbgExXFnXmF/CccPPEto40gOO7FpWu9yWNAZPN3nkNQ=
|
||||
cosmossdk.io/math v1.4.0/go.mod h1:O5PkD4apz2jZs4zqFdTr16e1dcaQCc5z6lkEnrrppuk=
|
||||
cosmossdk.io/schema v0.3.1-0.20241128094659-bd76b47e1d8b h1:svpFdulZRrYz+RTHu2u9CeKkMKrIHx5354vjiHerovo=
|
||||
|
@ -9,9 +9,9 @@ type Config struct {
|
||||
EthUrl string `mapstructure:"eth-url" toml:"eth-url" comment:"eth-url specifies the URL of the Ethereum node to connect to."`
|
||||
EthAuthToken string `mapstructure:"eth-auth-token" toml:"eth-auth-token" comment:"eth-auth-token specifies the bearer token used for auth in requests to the Ethereum chain's RPC endpoint."`
|
||||
EthStartBlock uint64 `mapstructure:"eth-start-block" toml:"eth-start-block" comment:"eth-start-block specifies the Ethereum block number to start listening for Nitro Adjudicator events."`
|
||||
NaAddress string `mapstructure:"na-address" toml:"na-address" comment:"na-address specifies the address of the Nitro Adjudicator contract."`
|
||||
VpaAddress string `mapstructure:"vpa-address" toml:"vpa-address" comment:"vpa-address specifies the address of the Virtual Payment App contract."`
|
||||
CaAddress string `mapstructure:"ca-address" toml:"ca-address" comment:"ca-address specifies the address of the Consensus App contract."`
|
||||
EthNaAddress string `mapstructure:"eth-na-address" toml:"na-address" comment:"na-address specifies the address of the Nitro Adjudicator contract."`
|
||||
EthVpaAddress string `mapstructure:"eth-vpa-address" toml:"vpa-address" comment:"vpa-address specifies the address of the Virtual Payment App contract."`
|
||||
EthCaAddress string `mapstructure:"eth-ca-address" toml:"ca-address" comment:"ca-address specifies the address of the Consensus App contract."`
|
||||
|
||||
BootPeers string `mapstructure:"boot-peers" toml:"boot-peers" comment:"boot-peers is a comma-delimited list of peer multiaddrs the messaging service will connect to when initialized."`
|
||||
PublicIp string `mapstructure:"public-ip" toml:"public-ip" comment:"public-ip specifies the public IP address used for the message service."`
|
||||
|
@ -3,7 +3,9 @@ package nitro
|
||||
import (
|
||||
"context"
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
@ -55,11 +57,12 @@ type Server struct {
|
||||
ScAddr types.PartyAddress
|
||||
}
|
||||
|
||||
func New(logger log.Logger, cfg server.ConfigMap) (*Server, error) {
|
||||
func NewServer(logger log.Logger, cfg server.ConfigMap, clientCtx client.Context) (*Server, error) {
|
||||
home, _ := cfg[serverv2.FlagHome].(string)
|
||||
s := &Server{
|
||||
logger: logger.With(log.ModuleKey, serverName),
|
||||
storeDir: filepath.Join(home, "nitro")}
|
||||
storeDir: filepath.Join(home, "nitro"),
|
||||
}
|
||||
|
||||
s.config = s.Config().(*Config)
|
||||
if len(cfg) > 0 {
|
||||
@ -67,19 +70,15 @@ func New(logger log.Logger, cfg server.ConfigMap) (*Server, error) {
|
||||
return nil, fmt.Errorf("failed to unmarshal config: %w", err)
|
||||
}
|
||||
}
|
||||
return s, nil
|
||||
return s, s.init(clientCtx)
|
||||
}
|
||||
|
||||
func (s *Server) init(ctx context.Context) error {
|
||||
func (s *Server) init(clientCtx client.Context) error {
|
||||
c := s.config
|
||||
var clientCtx client.Context
|
||||
if v := ctx.Value(client.ClientContextKey); v != nil {
|
||||
clientCtx = v.(client.Context)
|
||||
}
|
||||
|
||||
sckey, err := extractPrivKeyBytes(clientCtx.Keyring, c.Pk)
|
||||
if err != nil {
|
||||
return nil
|
||||
return err
|
||||
}
|
||||
ethkey, err := extractPrivKeyBytes(clientCtx.Keyring, c.EthPk)
|
||||
if err != nil {
|
||||
@ -97,12 +96,15 @@ func (s *Server) init(ctx context.Context) error {
|
||||
UseDurableStore: true,
|
||||
DurableStoreFolder: s.storeDir,
|
||||
}
|
||||
|
||||
var bootPeers []string
|
||||
if c.BootPeers != "" {
|
||||
bootPeers = strings.Split(c.BootPeers, ",")
|
||||
}
|
||||
messageOpts := p2pms.MessageOpts{
|
||||
PkBytes: sckey,
|
||||
TcpPort: c.MsgPort,
|
||||
WsMsgPort: c.WsMsgPort,
|
||||
BootPeers: strings.Split(c.BootPeers, ","),
|
||||
BootPeers: bootPeers,
|
||||
PublicIp: c.PublicIp,
|
||||
ExtMultiAddr: c.ExtMultiAddr,
|
||||
}
|
||||
@ -111,10 +113,16 @@ func (s *Server) init(ctx context.Context) error {
|
||||
ChainStartBlockNum: c.EthStartBlock,
|
||||
ChainAuthToken: c.EthAuthToken,
|
||||
ChainPk: hex.EncodeToString(ethkey),
|
||||
NaAddress: common.HexToAddress(c.NaAddress),
|
||||
VpaAddress: common.HexToAddress(c.VpaAddress),
|
||||
CaAddress: common.HexToAddress(c.CaAddress),
|
||||
NaAddress: common.HexToAddress(c.EthNaAddress),
|
||||
VpaAddress: common.HexToAddress(c.EthVpaAddress),
|
||||
CaAddress: common.HexToAddress(c.EthCaAddress),
|
||||
}
|
||||
loggerImpl, ok := s.logger.Impl().(*slog.Logger)
|
||||
if !ok {
|
||||
return errors.New("logger does not have slog implementation")
|
||||
}
|
||||
slog.SetDefault(loggerImpl)
|
||||
|
||||
node, store, _, _, err := initNode(s.logger, chainOpts, storeOpts, messageOpts, &engine.PermissivePolicy{})
|
||||
if err != nil {
|
||||
return err
|
||||
@ -171,7 +179,7 @@ func initNode(
|
||||
policymaker,
|
||||
)
|
||||
|
||||
return &node, ourStore, messageService, ourChain, nil
|
||||
return node, ourStore, messageService, ourChain, nil
|
||||
}
|
||||
|
||||
func (s *Server) Name() string {
|
||||
@ -179,13 +187,14 @@ func (s *Server) Name() string {
|
||||
}
|
||||
|
||||
func (s *Server) Start(ctx context.Context) error {
|
||||
|
||||
s.logger.Info("starting Nitro server",
|
||||
"rpc-port", fmt.Sprintf("http://%s:%d", s.config.PublicIp, s.config.RpcPort))
|
||||
s.Node.Start()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Server) Stop(context.Context) error {
|
||||
|
||||
return nil
|
||||
return s.Close()
|
||||
}
|
||||
|
||||
func (s *Server) Config() any {
|
||||
|
Loading…
Reference in New Issue
Block a user