diff --git a/abci/tutorials/abci-v2-forum-app/forum.go b/abci/tutorials/abci-v2-forum-app/forum.go index daf3618ec4c..c5d7ac2113a 100644 --- a/abci/tutorials/abci-v2-forum-app/forum.go +++ b/abci/tutorials/abci-v2-forum-app/forum.go @@ -67,17 +67,7 @@ func main() { config.PrivValidatorStateFile(), ) - node, err := nm.NewNode( - context.Background(), - config, - pv, - nodeKey, - proxy.NewLocalClientCreator(app), - nm.DefaultGenesisDocProviderFunc(config), - cfg.DefaultDBProvider, - nm.DefaultMetricsProvider(config.Instrumentation), - logger, - ) + node, err := nm.NewNode(context.Background(), config, pv, nodeKey, proxy.NewLocalClientCreator(app), nm.DefaultGenesisDocProviderFunc(config), cfg.DefaultDBProvider, nm.DefaultMetricsProvider(config.Instrumentation), logger, nil) defer func() { _ = node.Stop() diff --git a/go.mod b/go.mod index 3a2dfedff77..656bdd16661 100644 --- a/go.mod +++ b/go.mod @@ -1,7 +1,6 @@ module github.com/cometbft/cometbft -go 1.23 -toolchain go1.23.7 +go 1.23.9 require ( github.com/BurntSushi/toml v1.4.0 @@ -33,15 +32,16 @@ require ( github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa github.com/spf13/cobra v1.9.1 github.com/spf13/viper v1.19.0 - github.com/stretchr/testify v1.10.0 - golang.org/x/crypto v0.36.0 - golang.org/x/net v0.37.0 - google.golang.org/grpc v1.71.0 + github.com/stretchr/testify v1.11.1 + golang.org/x/crypto v0.41.0 + golang.org/x/net v0.43.0 + google.golang.org/grpc v1.75.0 ) require github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 require ( + github.com/InjectiveLabs/metrics/v2 v2.0.0-beta.8 github.com/Masterminds/semver/v3 v3.3.1 github.com/go-git/go-git/v5 v5.14.0 github.com/goccmack/goutil v1.2.3 @@ -51,9 +51,9 @@ require ( github.com/oasisprotocol/curve25519-voi v0.0.0-20220708102147-0a8a51822cae github.com/supranational/blst v0.3.14 golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 - golang.org/x/sync v0.12.0 - gonum.org/v1/gonum v0.15.1 - google.golang.org/protobuf v1.36.5 + golang.org/x/sync v0.16.0 + gonum.org/v1/gonum v0.16.0 + google.golang.org/protobuf v1.36.8 ) require ( @@ -64,6 +64,7 @@ require ( github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/ProtonMail/go-crypto v1.1.5 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudflare/circl v1.6.0 // indirect github.com/cockroachdb/errors v1.11.3 // indirect @@ -85,7 +86,7 @@ require ( github.com/getsentry/sentry-go v0.31.1 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect - github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-sql-driver/mysql v1.7.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -95,6 +96,7 @@ require ( github.com/google/flatbuffers v25.2.10+incompatible // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/gotestyourself/gotestyourself v2.2.0+incompatible // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/imdario/mergo v0.3.15 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -131,13 +133,20 @@ require ( github.com/xanzy/ssh-agent v0.3.3 // indirect go.etcd.io/bbolt v1.4.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/otel v1.34.0 // indirect - go.opentelemetry.io/otel/metric v1.34.0 // indirect - go.opentelemetry.io/otel/trace v1.34.0 // indirect + go.opentelemetry.io/otel v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 // indirect + go.opentelemetry.io/otel/metric v1.38.0 // indirect + go.opentelemetry.io/otel/sdk v1.38.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.38.0 // indirect + go.opentelemetry.io/otel/trace v1.38.0 // indirect + go.opentelemetry.io/proto/otlp v1.7.1 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/sys v0.31.0 // indirect - golang.org/x/text v0.23.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect + golang.org/x/sys v0.35.0 // indirect + golang.org/x/text v0.28.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect @@ -152,3 +161,5 @@ retract ( // superseeded by v0.38.3 because of ASA-2024-001 [v0.38.0, v0.38.2] ) + +replace github.com/cometbft/cometbft/api => ./api diff --git a/go.sum b/go.sum index 141701e448f..f49e04af737 100644 --- a/go.sum +++ b/go.sum @@ -8,6 +8,8 @@ github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20O github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/zstd v1.5.6 h1:LbEglqepa/ipmmQJUDnSsfvA8e8IStVcGaFWDuxvGOY= github.com/DataDog/zstd v1.5.6/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/InjectiveLabs/metrics/v2 v2.0.0-beta.8 h1:zvIV7ifNcH2Dvl0RrXd2qYRkaDSc+iP0hqaAhfS85MY= +github.com/InjectiveLabs/metrics/v2 v2.0.0-beta.8/go.mod h1:fdW28eWh1Ace92UW2TzINdJVaVP7whCmHKkGQZHsxGI= github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= @@ -54,6 +56,8 @@ github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEe github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cloudflare/circl v1.6.0 h1:cr5JKic4HI+LkINy2lg3W2jF8sHCVTBncJr5gIIq7qk= @@ -76,8 +80,6 @@ github.com/cometbft/cometbft-db v1.0.4 h1:cezb8yx/ZWcF124wqUtAFjAuDksS1y1yXedvtp github.com/cometbft/cometbft-db v1.0.4/go.mod h1:M+BtHAGU2XLrpUxo3Nn1nOCcnVCiLM9yx5OuT0u5SCA= github.com/cometbft/cometbft-load-test v0.3.0 h1:z6iZZvFwhci29ca/EZQaWh/d92NLe8bK4eBvFyv2EKY= github.com/cometbft/cometbft-load-test v0.3.0/go.mod h1:zKrQpRm3Ay5+RfeRTNWoLniFJNIPnw9JPEM1wuWS3TA= -github.com/cometbft/cometbft/api v1.0.0 h1:gGBwvsJi/gnHJEtwYfjPIGs2AKg/Vfa1ZuKCPD1/Ko4= -github.com/cometbft/cometbft/api v1.0.0/go.mod h1:EkQiqVSu/p2ebrZEnB2z6Re7r8XNe//M7ylR0qEwWm0= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/cosmos/gogoproto v1.7.0 h1:79USr0oyXAbxg3rspGh/m4SWNyoz/GLaAh0QlCe2fro= @@ -148,8 +150,8 @@ github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBj github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= @@ -197,6 +199,8 @@ github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aN github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -340,8 +344,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/supranational/blst v0.3.14 h1:xNMoHRJOTwMn63ip6qoWJ2Ymgvj7E2b9jY2FAwY+qRo= @@ -362,16 +366,24 @@ go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk= go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= -go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= -go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= -go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= -go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= -go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= -go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= -go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= -go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= -go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 h1:vl9obrcoWVKp/lwl8tRE33853I8Xru9HFbw/skNeLs8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0/go.mod h1:GAXRxmLJcVM3u22IjTg74zWBrRCKq8BnOqUVLodpcpw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 h1:lwI4Dc5leUqENgGuQImwLo4WnuXFPetmPpkLi2IrX54= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0/go.mod h1:Kz/oCE7z5wuyhPxsXDuaPteSWqjSBD5YaSdbxZYGbGk= +go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= +go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= +go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= +go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= +go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= +go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -381,8 +393,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -400,14 +412,14 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= -golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -426,17 +438,17 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= +golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= +golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -449,22 +461,24 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.6.2/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= -gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= -gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:OxYkA3wjPsZyBylwymxSHa7ViiW1Sml4ToBrncvFehI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= -google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= -google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 h1:BIRfGDEjiHRrk0QKZe3Xv2ieMhtgRGeLcZQ0mIVn4EY= +google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5/go.mod h1:j3QtIyytwqGr1JUDtYXwtMXWPKsEa5LtzIFN1Wn5WvE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= -google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/go.work b/go.work index c44012091f6..595425b8314 100644 --- a/go.work +++ b/go.work @@ -1,4 +1,4 @@ -go 1.23 +go 1.23.9 use ( . diff --git a/internal/consensus/reactor.go b/internal/consensus/reactor.go index 60941c7fa0a..152455c6444 100644 --- a/internal/consensus/reactor.go +++ b/internal/consensus/reactor.go @@ -1,6 +1,7 @@ package consensus import ( + "context" "fmt" "math/rand" "reflect" @@ -8,6 +9,7 @@ import ( "sync/atomic" "time" + injmetrics "github.com/InjectiveLabs/metrics/v2" cmtcons "github.com/cometbft/cometbft/api/cometbft/consensus/v1" "github.com/cometbft/cometbft/internal/bits" cstypes "github.com/cometbft/cometbft/internal/consensus/types" @@ -51,6 +53,7 @@ type Reactor struct { initialHeight int64 // under rsMtx Metrics *Metrics + meter injmetrics.Meter } type ReactorOption func(*Reactor) @@ -63,6 +66,7 @@ func NewReactor(consensusState *State, waitSync bool, options ...ReactorOption) rs: consensusState.GetRoundState(), initialHeight: consensusState.state.InitialHeight, Metrics: NopMetrics(), + meter: injmetrics.NewNilMeter(), } conR.BaseReactor = *p2p.NewBaseReactor("Consensus", conR) if waitSync { @@ -265,6 +269,9 @@ func (conR *Reactor) Receive(e p2p.Envelope) { panic(fmt.Sprintf("Peer %v has no state", e.Src)) } + _, stop := conR.meter.FuncTimingCtx(context.Background(), "Receive", injmetrics.Tag("msg", fmt.Sprintf("%T", msg))) + defer stop() + switch e.ChannelID { case StateChannel: switch msg := msg.(type) { @@ -1070,6 +1077,11 @@ func ReactorMetrics(metrics *Metrics) ReactorOption { return func(conR *Reactor) { conR.Metrics = metrics } } +// ReactorMeter sets the tracing meter. +func ReactorMeter(meter injmetrics.Meter) ReactorOption { + return func(conR *Reactor) { conR.meter = meter } +} + // ----------------------------------------------------------------------------- // PeerState contains the known state of a peer, including its connection and diff --git a/internal/consensus/state.go b/internal/consensus/state.go index be8cf0619ef..1a3db2d8021 100644 --- a/internal/consensus/state.go +++ b/internal/consensus/state.go @@ -12,6 +12,7 @@ import ( "strconv" "time" + injmetrics "github.com/InjectiveLabs/metrics/v2" "github.com/cosmos/gogoproto/proto" cmtproto "github.com/cometbft/cometbft/api/cometbft/types/v1" @@ -134,6 +135,7 @@ type State struct { // for reporting metrics metrics *Metrics + meter injmetrics.Meter // offline state sync height indicating to which height the node synced offline offlineStateSyncHeight int64 @@ -171,6 +173,7 @@ func NewState( evpool: evpool, evsw: cmtevents.NewEventSwitch(), metrics: NopMetrics(), + meter: injmetrics.NewNilMeter(), } for _, option := range options { option(cs) @@ -220,6 +223,11 @@ func StateMetrics(metrics *Metrics) StateOption { return func(cs *State) { cs.metrics = metrics } } +// StateMeter sets the tracing meter. +func StateMeter(meter injmetrics.Meter) StateOption { + return func(cs *State) { cs.meter = meter } +} + // OfflineStateSyncHeight indicates the height at which the node // statesync offline - before booting sets the metrics. func OfflineStateSyncHeight(height int64) StateOption { @@ -877,6 +885,9 @@ func (cs *State) receiveRoutine(maxSteps int) { // state transitions on complete-proposal, 2/3-any, 2/3-one. func (cs *State) handleMsg(mi msgInfo) { + _, stop := cs.meter.FuncTimingCtx(context.Background(), "handleMsg", injmetrics.Tag("msg", fmt.Sprintf("%T", mi.Msg))) + defer stop() + cs.mtx.Lock() defer cs.mtx.Unlock() var ( diff --git a/mempool/clist_mempool.go b/mempool/clist_mempool.go index cdf46db7bf1..b1e0b01a541 100644 --- a/mempool/clist_mempool.go +++ b/mempool/clist_mempool.go @@ -8,6 +8,7 @@ import ( "sync/atomic" "time" + "github.com/InjectiveLabs/metrics/v2" abcicli "github.com/cometbft/cometbft/abci/client" abci "github.com/cometbft/cometbft/abci/types" "github.com/cometbft/cometbft/config" @@ -73,6 +74,8 @@ type CListMempool struct { logger log.Logger metrics *Metrics + + meter metrics.Meter } var _ Mempool = &CListMempool{} @@ -112,6 +115,7 @@ func NewCListMempool( laneBytes: make(map[LaneID]int64), logger: log.NewNopLogger(), metrics: NopMetrics(), + meter: metrics.NewNilMeter(), addTxCh: make(chan struct{}), addTxLaneSeqs: make(map[LaneID]int64), } @@ -156,6 +160,9 @@ func NewCListMempool( } func (mem *CListMempool) GetSenders(txKey types.TxKey) ([]p2p.ID, error) { + _, stop := mem.meter.FuncTimingCtx(context.Background(), "GetSenders") + defer stop() + mem.txsMtx.RLock() defer mem.txsMtx.RUnlock() @@ -249,6 +256,11 @@ func WithMetrics(metrics *Metrics) CListMempoolOption { return func(mem *CListMempool) { mem.metrics = metrics } } +// WithMeter sets the meter. +func WithMeter(m metrics.Meter) CListMempoolOption { + return func(mem *CListMempool) { mem.meter = m } +} + // Safe for concurrent use by multiple goroutines. func (mem *CListMempool) Lock() { mem.updateMtx.Lock() @@ -334,7 +346,14 @@ func (mem *CListMempool) Contains(txKey types.TxKey) bool { // It blocks if we're waiting on Update() or Reap(). // Safe for concurrent use by multiple goroutines. -func (mem *CListMempool) CheckTx(tx types.Tx, sender p2p.ID) (*abcicli.ReqRes, error) { +func (mem *CListMempool) CheckTx(tx types.Tx, sender p2p.ID) (res *abcicli.ReqRes, err error) { + _, stop := mem.meter.FuncTimingCtx(context.Background(), "CheckTx") + defer func() { + if err != nil { + stop() + } + }() + mem.updateMtx.RLock() // use defer to unlock mutex because application (*local client*) might panic defer mem.updateMtx.RUnlock() @@ -386,7 +405,11 @@ func (mem *CListMempool) CheckTx(tx types.Tx, sender p2p.ID) (*abcicli.ReqRes, e if err != nil { panic(fmt.Errorf("CheckTx request for tx %s failed: %w", log.NewLazySprintf("%X", tx.Hash()), err)) } - reqRes.SetCallback(mem.handleCheckTxResponse(tx, sender)) + reqRes.SetCallback(func(res *abci.Response) (err error) { + defer stop() + + return mem.handleCheckTxResponse(tx, sender)(res) + }) return reqRes, nil } @@ -680,6 +703,9 @@ func (mem *CListMempool) notifyTxsAvailable() { // Safe for concurrent use by multiple goroutines. func (mem *CListMempool) ReapMaxBytesMaxGas(maxBytes, maxGas int64) types.Txs { + _, stop := mem.meter.FuncTimingCtx(context.Background(), "ReapMaxBytesMaxGas") + defer stop() + mem.updateMtx.RLock() defer mem.updateMtx.RUnlock() @@ -724,6 +750,9 @@ func (mem *CListMempool) ReapMaxBytesMaxGas(maxBytes, maxGas int64) types.Txs { // Safe for concurrent use by multiple goroutines. func (mem *CListMempool) ReapMaxTxs(max int) types.Txs { + _, stop := mem.meter.FuncTimingCtx(context.Background(), "ReapMaxTxs") + defer stop() + mem.updateMtx.RLock() defer mem.updateMtx.RUnlock() @@ -745,6 +774,9 @@ func (mem *CListMempool) ReapMaxTxs(max int) types.Txs { // GetTxByHash returns the types.Tx with the given hash if found in the mempool, otherwise returns nil. func (mem *CListMempool) GetTxByHash(hash []byte) types.Tx { + _, stop := mem.meter.FuncTimingCtx(context.Background(), "GetTxByHash") + defer stop() + mem.txsMtx.RLock() defer mem.txsMtx.RUnlock() @@ -763,6 +795,9 @@ func (mem *CListMempool) Update( preCheck PreCheckFunc, postCheck PostCheckFunc, ) error { + ctx, stop := mem.meter.FuncTimingCtx(context.Background(), "Update") + defer stop() + mem.logger.Debug("Update", "height", height, "len(txs)", len(txs)) // Set height @@ -803,7 +838,7 @@ func (mem *CListMempool) Update( // Recheck txs left in the mempool to remove them if they became invalid in the new state. if mem.config.Recheck { - mem.recheckTxs() + mem.recheckTxs(ctx) } // Notify if there are still txs left in the mempool. @@ -831,7 +866,10 @@ func (mem *CListMempool) updateSizeMetrics(laneID LaneID) { // recheckTxs sends all transactions in the mempool to the app for re-validation. When the function // returns, all recheck responses from the app have been processed. -func (mem *CListMempool) recheckTxs() { +func (mem *CListMempool) recheckTxs(ctx context.Context) { + _, stopFn := mem.meter.FuncTimingCtx(ctx, "recheckTxs") + defer stopFn() + mem.logger.Debug("Recheck txs", "height", mem.height.Load(), "num-txs", mem.Size()) if mem.Size() <= 0 { diff --git a/mempool/clist_mempool_test.go b/mempool/clist_mempool_test.go index 6bcabf4bac8..a027b774267 100644 --- a/mempool/clist_mempool_test.go +++ b/mempool/clist_mempool_test.go @@ -968,7 +968,7 @@ func TestMempoolSyncRecheckTxReturnError(t *testing.T) { t.Errorf("recheckTxs did not panic") } }() - mp.recheckTxs() + mp.recheckTxs(context.TODO()) } // Test that rechecking finishes correctly when a CheckTx response never arrives, when using an @@ -1025,7 +1025,7 @@ func TestMempoolAsyncRecheckTxReturnError(t *testing.T) { }).Return(nil) // mp.recheck.done() should be true only before and after calling recheckTxs. - mp.recheckTxs() + mp.recheckTxs(context.TODO()) require.True(t, mp.recheck.done()) require.False(t, mp.recheck.isRechecking.Load()) require.Nil(t, mp.recheck.cursor) diff --git a/node/node.go b/node/node.go index 162a42019ac..37eab35056f 100644 --- a/node/node.go +++ b/node/node.go @@ -11,6 +11,7 @@ import ( "os" "time" + "github.com/InjectiveLabs/metrics/v2" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/rs/cors" @@ -85,6 +86,7 @@ type Node struct { indexerService *txindex.IndexerService prometheusSrv *http.Server pprofSrv *http.Server + meter metrics.Meter } type waitSyncP2PReactor interface { @@ -272,7 +274,8 @@ func BootstrapState(ctx context.Context, config *cfg.Config, dbProvider cfg.DBPr // ------------------------------------------------------------------------------ // NewNode returns a new, ready to go, CometBFT Node. -func NewNode(ctx context.Context, +func NewNode( + ctx context.Context, config *cfg.Config, privValidator types.PrivValidator, nodeKey *p2p.NodeKey, @@ -281,9 +284,11 @@ func NewNode(ctx context.Context, dbProvider cfg.DBProvider, metricsProvider MetricsProvider, logger log.Logger, + meter metrics.Meter, options ...Option, ) (*Node, error) { - return NewNodeWithCliParams(ctx, + return NewNodeWithCliParams( + ctx, config, privValidator, nodeKey, @@ -293,14 +298,17 @@ func NewNode(ctx context.Context, metricsProvider, logger, CliParams{}, - options...) + meter, + options..., + ) } // NewNodeWithCliParams returns a new, ready to go, CometBFT node // where we check the hash of the provided genesis file against // a hash provided by the operator via cli. -func NewNodeWithCliParams(ctx context.Context, +func NewNodeWithCliParams( + ctx context.Context, config *cfg.Config, privValidator types.PrivValidator, nodeKey *p2p.NodeKey, @@ -310,8 +318,13 @@ func NewNodeWithCliParams(ctx context.Context, metricsProvider MetricsProvider, logger log.Logger, cliParams CliParams, + meter metrics.Meter, options ...Option, ) (*Node, error) { + if meter == nil { + meter = metrics.NewNilMeter() + } + if config.BaseConfig.DBBackend == "boltdb" || config.BaseConfig.DBBackend == "cleveldb" { logger.Info("WARNING: BoltDB and GoLevelDB are deprecated and will be removed in a future release. Please switch to a different backend.") } @@ -334,6 +347,7 @@ func NewNodeWithCliParams(ctx context.Context, stateStore := sm.NewStore(stateDB, sm.StoreOptions{ DiscardABCIResponses: config.Storage.DiscardABCIResponses, Metrics: smMetrics, + Meter: meter.SubMeter("state", metrics.Tag("svc", "state")), Compact: config.Storage.Compact, CompactionInterval: config.Storage.CompactionInterval, Logger: logger, @@ -427,7 +441,16 @@ func NewNodeWithCliParams(ctx context.Context, logNodeStartupInfo(state, pubKey, logger, consensusLogger) - mempool, mempoolReactor := createMempoolAndMempoolReactor(config, proxyApp, state, waitSync, memplMetrics, logger, appInfoResponse) + mempool, mempoolReactor := createMempoolAndMempoolReactor( + config, + proxyApp, + state, + waitSync, + memplMetrics, + logger, + appInfoResponse, + meter.SubMeter("mempool", metrics.Tag("svc", "mempool")), + ) evidenceReactor, evidencePool, err := createEvidenceReactor(config, dbProvider, stateStore, blockStore, logger) if err != nil { @@ -475,6 +498,7 @@ func NewNodeWithCliParams(ctx context.Context, consensusReactor, consensusState := createConsensusReactor( config, state, blockExec, blockStore, mempool, evidencePool, privValidator, csMetrics, waitSync, eventBus, consensusLogger, offlineStateSyncHeight, + meter.SubMeter("consensus", metrics.Tag("svc", "consensus")), ) err = stateStore.SetOfflineStateSyncHeight(0) @@ -490,6 +514,7 @@ func NewNodeWithCliParams(ctx context.Context, proxyApp.Snapshot(), proxyApp.Query(), ssMetrics, + meter.SubMeter("statesync", metrics.Tag("svc", "statesync")), ) stateSyncReactor.SetLogger(logger.With("module", "statesync")) @@ -570,6 +595,7 @@ func NewNodeWithCliParams(ctx context.Context, indexerService: indexerService, blockIndexer: blockIndexer, eventBus: eventBus, + meter: meter, } node.BaseService = *service.NewBaseService(logger, "Node", node) diff --git a/node/node_test.go b/node/node_test.go index 6141a243eb4..4782836d76d 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -488,17 +488,7 @@ func TestNodeNewNodeCustomReactors(t *testing.T) { pv, err := privval.LoadOrGenFilePV(config.PrivValidatorKeyFile(), config.PrivValidatorStateFile(), nil) require.NoError(t, err) - n, err := NewNode(context.Background(), - config, - pv, - nodeKey, - proxy.DefaultClientCreator(config.ProxyApp, config.ABCI, config.DBDir()), - DefaultGenesisDocProviderFunc(config), - cfg.DefaultDBProvider, - DefaultMetricsProvider(config.Instrumentation), - log.TestingLogger(), - CustomReactors(map[string]p2p.Reactor{"FOO": cr, "BLOCKSYNC": customBlocksyncReactor}), - ) + n, err := NewNode(context.Background(), config, pv, nodeKey, proxy.DefaultClientCreator(config.ProxyApp, config.ABCI, config.DBDir()), DefaultGenesisDocProviderFunc(config), cfg.DefaultDBProvider, DefaultMetricsProvider(config.Instrumentation), log.TestingLogger(), nil, CustomReactors(map[string]p2p.Reactor{"FOO": cr, "BLOCKSYNC": customBlocksyncReactor})) require.NoError(t, err) err = n.Start() @@ -542,17 +532,7 @@ func TestNodeNewNodeDeleteGenesisFileFromDB(t *testing.T) { pv, err := privval.LoadOrGenFilePV(config.PrivValidatorKeyFile(), config.PrivValidatorStateFile(), nil) require.NoError(t, err) - n, err := NewNode( - context.Background(), - config, - pv, - nodeKey, - proxy.DefaultClientCreator(config.ProxyApp, config.ABCI, config.DBDir()), - DefaultGenesisDocProviderFunc(config), - cfg.DefaultDBProvider, - DefaultMetricsProvider(config.Instrumentation), - log.TestingLogger(), - ) + n, err := NewNode(context.Background(), config, pv, nodeKey, proxy.DefaultClientCreator(config.ProxyApp, config.ABCI, config.DBDir()), DefaultGenesisDocProviderFunc(config), cfg.DefaultDBProvider, DefaultMetricsProvider(config.Instrumentation), log.TestingLogger(), nil) require.NoError(t, err) // Start and stop to close the db for later reading @@ -585,17 +565,7 @@ func TestNodeNewNodeGenesisHashMismatch(t *testing.T) { pv, err := privval.LoadOrGenFilePV(config.PrivValidatorKeyFile(), config.PrivValidatorStateFile(), nil) require.NoError(t, err) - n, err := NewNode( - context.Background(), - config, - pv, - nodeKey, - proxy.DefaultClientCreator(config.ProxyApp, config.ABCI, config.DBDir()), - DefaultGenesisDocProviderFunc(config), - cfg.DefaultDBProvider, - DefaultMetricsProvider(config.Instrumentation), - log.TestingLogger(), - ) + n, err := NewNode(context.Background(), config, pv, nodeKey, proxy.DefaultClientCreator(config.ProxyApp, config.ABCI, config.DBDir()), DefaultGenesisDocProviderFunc(config), cfg.DefaultDBProvider, DefaultMetricsProvider(config.Instrumentation), log.TestingLogger(), nil) require.NoError(t, err) // Start and stop to close the db for later reading @@ -629,17 +599,7 @@ func TestNodeNewNodeGenesisHashMismatch(t *testing.T) { pv, err = privval.LoadOrGenFilePV(config.PrivValidatorKeyFile(), config.PrivValidatorStateFile(), nil) require.NoError(t, err) - _, err = NewNode( - context.Background(), - config, - pv, - nodeKey, - proxy.DefaultClientCreator(config.ProxyApp, config.ABCI, config.DBDir()), - DefaultGenesisDocProviderFunc(config), - cfg.DefaultDBProvider, - DefaultMetricsProvider(config.Instrumentation), - log.TestingLogger(), - ) + _, err = NewNode(context.Background(), config, pv, nodeKey, proxy.DefaultClientCreator(config.ProxyApp, config.ABCI, config.DBDir()), DefaultGenesisDocProviderFunc(config), cfg.DefaultDBProvider, DefaultMetricsProvider(config.Instrumentation), log.TestingLogger(), nil) require.Error(t, err, "NewNode should error when genesisDoc is changed") require.Equal(t, "genesis doc hash in db does not match loaded genesis doc", err.Error()) } @@ -661,18 +621,7 @@ func TestNodeGenesisHashFlagMatch(t *testing.T) { pv, err := privval.LoadOrGenFilePV(config.PrivValidatorKeyFile(), config.PrivValidatorStateFile(), nil) require.NoError(t, err) - _, err = NewNodeWithCliParams( - context.Background(), - config, - pv, - nodeKey, - proxy.DefaultClientCreator(config.ProxyApp, config.ABCI, config.DBDir()), - DefaultGenesisDocProviderFunc(config), - cfg.DefaultDBProvider, - DefaultMetricsProvider(config.Instrumentation), - log.TestingLogger(), - cliParams, - ) + _, err = NewNodeWithCliParams(context.Background(), config, pv, nodeKey, proxy.DefaultClientCreator(config.ProxyApp, config.ABCI, config.DBDir()), DefaultGenesisDocProviderFunc(config), cfg.DefaultDBProvider, DefaultMetricsProvider(config.Instrumentation), log.TestingLogger(), cliParams, nil) require.NoError(t, err) } @@ -696,18 +645,7 @@ func TestNodeGenesisHashFlagMismatch(t *testing.T) { pv, err := privval.LoadOrGenFilePV(config.PrivValidatorKeyFile(), config.PrivValidatorStateFile(), nil) require.NoError(t, err) - _, err = NewNodeWithCliParams( - context.Background(), - config, - pv, - nodeKey, - proxy.DefaultClientCreator(config.ProxyApp, config.ABCI, config.DBDir()), - DefaultGenesisDocProviderFunc(config), - cfg.DefaultDBProvider, - DefaultMetricsProvider(config.Instrumentation), - log.TestingLogger(), - cliParams, - ) + _, err = NewNodeWithCliParams(context.Background(), config, pv, nodeKey, proxy.DefaultClientCreator(config.ProxyApp, config.ABCI, config.DBDir()), DefaultGenesisDocProviderFunc(config), cfg.DefaultDBProvider, DefaultMetricsProvider(config.Instrumentation), log.TestingLogger(), cliParams, nil) require.Error(t, err) f, err = os.ReadFile(config.GenesisFile()) diff --git a/node/setup.go b/node/setup.go index 45ba5abe155..b37dd2cd304 100644 --- a/node/setup.go +++ b/node/setup.go @@ -13,6 +13,7 @@ import ( _ "net/http/pprof" //nolint: gosec,gci // securely exposed on separate, optional port + "github.com/InjectiveLabs/metrics/v2" _ "github.com/lib/pq" //nolint: gci // provide the psql db driver. dbm "github.com/cometbft/cometbft-db" @@ -120,16 +121,7 @@ func DefaultNewNode( } } - return NewNodeWithCliParams(context.Background(), config, - pv, - nodeKey, - proxy.DefaultClientCreator(config.ProxyApp, config.ABCI, config.DBDir()), - DefaultGenesisDocProviderFunc(config), - cfg.DefaultDBProvider, - DefaultMetricsProvider(config.Instrumentation), - logger, - cliParams, - ) + return NewNodeWithCliParams(context.Background(), config, pv, nodeKey, proxy.DefaultClientCreator(config.ProxyApp, config.ABCI, config.DBDir()), DefaultGenesisDocProviderFunc(config), cfg.DefaultDBProvider, DefaultMetricsProvider(config.Instrumentation), logger, cliParams, nil) } // MetricsProvider returns a consensus, p2p and mempool Metrics. @@ -287,6 +279,7 @@ func createMempoolAndMempoolReactor( memplMetrics *mempl.Metrics, logger log.Logger, appInfoResponse *abci.InfoResponse, + meter metrics.Meter, ) (mempl.Mempool, waitSyncP2PReactor) { switch config.Mempool.Type { // allow empty string for backward compatibility @@ -305,6 +298,7 @@ func createMempoolAndMempoolReactor( mempl.WithMetrics(memplMetrics), mempl.WithPreCheck(sm.TxPreCheck(state)), mempl.WithPostCheck(sm.TxPostCheck(state)), + mempl.WithMeter(meter), ) mp.SetLogger(logger) reactor := mempl.NewReactor( @@ -379,6 +373,7 @@ func createConsensusReactor(config *cfg.Config, eventBus *types.EventBus, consensusLogger log.Logger, offlineStateSyncHeight int64, + meter metrics.Meter, ) (*cs.Reactor, *cs.State) { consensusState := cs.NewState( config.Consensus, @@ -388,13 +383,19 @@ func createConsensusReactor(config *cfg.Config, mempool, evidencePool, cs.StateMetrics(csMetrics), + cs.StateMeter(meter), cs.OfflineStateSyncHeight(offlineStateSyncHeight), ) consensusState.SetLogger(consensusLogger) if privValidator != nil { consensusState.SetPrivValidator(privValidator) } - consensusReactor := cs.NewReactor(consensusState, waitSync, cs.ReactorMetrics(csMetrics)) + consensusReactor := cs.NewReactor( + consensusState, + waitSync, + cs.ReactorMetrics(csMetrics), + cs.ReactorMeter(meter), + ) consensusReactor.SetLogger(consensusLogger) // services which will be publishing and/or subscribing for messages (events) // consensusReactor will set it on consensusState and blockExecutor diff --git a/rpc/test/helpers.go b/rpc/test/helpers.go index 602c56930fe..3ef334d4f82 100644 --- a/rpc/test/helpers.go +++ b/rpc/test/helpers.go @@ -162,11 +162,7 @@ func NewCometBFT(app abci.Application, opts *Options) *nm.Node { if err != nil { panic(err) } - node, err := nm.NewNode(context.Background(), config, pv, nodeKey, papp, - nm.DefaultGenesisDocProviderFunc(config), - cfg.DefaultDBProvider, - nm.DefaultMetricsProvider(config.Instrumentation), - logger) + node, err := nm.NewNode(context.Background(), config, pv, nodeKey, papp, nm.DefaultGenesisDocProviderFunc(config), cfg.DefaultDBProvider, nm.DefaultMetricsProvider(config.Instrumentation), logger, nil) if err != nil { panic(err) } diff --git a/state/store.go b/state/store.go index d02ae34e00c..97c50401c4e 100644 --- a/state/store.go +++ b/state/store.go @@ -1,11 +1,13 @@ package state import ( + "context" "encoding/binary" "errors" "fmt" "time" + injmetrics "github.com/InjectiveLabs/metrics/v2" "github.com/cosmos/gogoproto/proto" "github.com/google/orderedcode" @@ -16,7 +18,7 @@ import ( cmtos "github.com/cometbft/cometbft/internal/os" "github.com/cometbft/cometbft/libs/log" cmtmath "github.com/cometbft/cometbft/libs/math" - "github.com/cometbft/cometbft/libs/metrics" + cmtmetrics "github.com/cometbft/cometbft/libs/metrics" "github.com/cometbft/cometbft/types" ) @@ -180,6 +182,10 @@ type StoreOptions struct { // if none is specified then a NopMetrics collector is used. Metrics *Metrics + // Meter defines the tracing meter to use for top-level store calls. + // If none is specified then a nil meter is used. + Meter injmetrics.Meter + Logger log.Logger DBKeyLayout string @@ -232,6 +238,10 @@ func NewStore(db dbm.DB, options StoreOptions) Store { options.Metrics = NopMetrics() } + if options.Meter == nil { + options.Meter = injmetrics.NewNilMeter() + } + store := dbStore{ db: db, StoreOptions: options, @@ -249,6 +259,9 @@ func NewStore(db dbm.DB, options StoreOptions) Store { // LoadStateFromDBOrGenesisFile loads the most recent state from the database, // or creates a new one from the given genesisFilePath. func (store dbStore) LoadFromDBOrGenesisFile(genesisFilePath string) (State, error) { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "LoadFromDBOrGenesisFile") + defer stop() + defer addTimeSample(store.StoreOptions.Metrics.StoreAccessDurationSeconds.With("method", "load_from_db_or_genesis_file"), time.Now())() state, err := store.Load() if err != nil { @@ -268,6 +281,9 @@ func (store dbStore) LoadFromDBOrGenesisFile(genesisFilePath string) (State, err // LoadStateFromDBOrGenesisDoc loads the most recent state from the database, // or creates a new one from the given genesisDoc. func (store dbStore) LoadFromDBOrGenesisDoc(genesisDoc *types.GenesisDoc) (State, error) { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "LoadFromDBOrGenesisDoc") + defer stop() + defer addTimeSample(store.StoreOptions.Metrics.StoreAccessDurationSeconds.With("method", "load_from_db_or_genesis_doc"), time.Now())() state, err := store.Load() if err != nil { @@ -287,6 +303,9 @@ func (store dbStore) LoadFromDBOrGenesisDoc(genesisDoc *types.GenesisDoc) (State // LoadState loads the State from the database. func (store dbStore) Load() (State, error) { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "Load") + defer stop() + return store.loadState(stateKey) } @@ -322,6 +341,9 @@ func (store dbStore) loadState(key []byte) (state State, err error) { // Save persists the State, the ValidatorsInfo, and the ConsensusParamsInfo to the database. // This flushes the writes (e.g. calls SetSync). func (store dbStore) Save(state State) error { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "Save") + defer stop() + return store.save(state, stateKey) } @@ -373,6 +395,9 @@ func (store dbStore) save(state State, key []byte) error { // BootstrapState saves a new state, used e.g. by state sync when starting from non-zero height. func (store dbStore) Bootstrap(state State) error { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "Bootstrap") + defer stop() + batch := store.db.NewBatch() defer func(batch dbm.Batch) { err := batch.Close() @@ -425,6 +450,9 @@ func (store dbStore) Bootstrap(state State) error { // This will cause some old states to be left behind when doing incremental partial prunes, // specifically older checkpoints and LastHeightChanged targets. func (store dbStore) PruneStates(from int64, to int64, evidenceThresholdHeight int64, previosulyPrunedStates uint64) (uint64, error) { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "PruneStates") + defer stop() + defer addTimeSample(store.StoreOptions.Metrics.StoreAccessDurationSeconds.With("method", "prune_states"), time.Now())() if from <= 0 || to <= 0 { @@ -569,6 +597,9 @@ func (store dbStore) PruneStates(from int64, to int64, evidenceThresholdHeight i // including, the given height. On success, returns the number of heights // pruned and the new retain height. func (store dbStore) PruneABCIResponses(targetRetainHeight int64, forceCompact bool) (pruned int64, newRetainHeight int64, err error) { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "PruneABCIResponses") + defer stop() + if store.DiscardABCIResponses { return 0, 0, nil } @@ -634,6 +665,9 @@ func TxResultsHash(txResults []*abci.ExecTxResult) []byte { // database. If the node has D set to true, ErrFinalizeBlockResponsesNotPersisted // is persisted. If not found, ErrNoABCIResponsesForHeight is returned. func (store dbStore) LoadFinalizeBlockResponse(height int64) (*abci.FinalizeBlockResponse, error) { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "LoadFinalizeBlockResponse") + defer stop() + if store.DiscardABCIResponses { return nil, ErrFinalizeBlockResponsesNotPersisted } @@ -688,6 +722,9 @@ func (store dbStore) LoadFinalizeBlockResponse(height int64) (*abci.FinalizeBloc // This method is used for recovering in the case that we called the Commit ABCI // method on the application but crashed before persisting the results. func (store dbStore) LoadLastFinalizeBlockResponse(height int64) (*abci.FinalizeBlockResponse, error) { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "LoadLastFinalizeBlockResponse") + defer stop() + start := time.Now() buf, err := store.db.Get(store.DBKeyLayout.CalcABCIResponsesKey(height)) if err != nil { @@ -736,6 +773,9 @@ func (store dbStore) LoadLastFinalizeBlockResponse(height int64) (*abci.Finalize // // CONTRACT: height must be monotonically increasing every time this is called. func (store dbStore) SaveFinalizeBlockResponse(height int64, resp *abci.FinalizeBlockResponse) error { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "SaveFinalizeBlockResponse") + defer stop() + var dtxs []*abci.ExecTxResult // strip nil values, for _, tx := range resp.TxResults { @@ -781,10 +821,16 @@ func (store dbStore) getValue(key []byte) ([]byte, error) { // ApplicationRetainHeight. func (store dbStore) SaveApplicationRetainHeight(height int64) error { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "SaveApplicationRetainHeight") + defer stop() + return store.db.SetSync(AppRetainHeightKey, int64ToBytes(height)) } func (store dbStore) GetApplicationRetainHeight() (int64, error) { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "GetApplicationRetainHeight") + defer stop() + buf, err := store.getValue(AppRetainHeightKey) if err != nil { return 0, err @@ -800,10 +846,16 @@ func (store dbStore) GetApplicationRetainHeight() (int64, error) { // DataCompanionRetainHeight. func (store dbStore) SaveCompanionBlockRetainHeight(height int64) error { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "SaveCompanionBlockRetainHeight") + defer stop() + return store.db.SetSync(CompanionBlockRetainHeightKey, int64ToBytes(height)) } func (store dbStore) GetCompanionBlockRetainHeight() (int64, error) { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "GetCompanionBlockRetainHeight") + defer stop() + buf, err := store.getValue(CompanionBlockRetainHeightKey) if err != nil { return 0, err @@ -819,10 +871,16 @@ func (store dbStore) GetCompanionBlockRetainHeight() (int64, error) { // DataCompanionRetainHeight. func (store dbStore) SaveABCIResRetainHeight(height int64) error { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "SaveABCIResRetainHeight") + defer stop() + return store.db.SetSync(ABCIResultsRetainHeightKey, int64ToBytes(height)) } func (store dbStore) GetABCIResRetainHeight() (int64, error) { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "GetABCIResRetainHeight") + defer stop() + buf, err := store.getValue(ABCIResultsRetainHeightKey) if err != nil { return 0, err @@ -857,6 +915,9 @@ func (store dbStore) setLastABCIResponsesRetainHeight(height int64) error { // LoadValidators loads the ValidatorSet for a given height. // Returns ErrNoValSetForHeight if the validator set can't be found for this height. func (store dbStore) LoadValidators(height int64) (*types.ValidatorSet, error) { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "LoadValidators") + defer stop() + valInfo, elapsedTime, err := loadValidatorsInfo(store.db, store.DBKeyLayout.CalcValidatorsKey(height)) if err != nil { return nil, ErrNoValSetForHeight{height} @@ -971,6 +1032,9 @@ func (store dbStore) saveValidatorsInfo(height, lastHeightChanged int64, valSet // LoadConsensusParams loads the ConsensusParams for a given height. func (store dbStore) LoadConsensusParams(height int64) (types.ConsensusParams, error) { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "LoadConsensusParams") + defer stop() + var ( empty = types.ConsensusParams{} emptypb = cmtproto.ConsensusParams{} @@ -1047,6 +1111,9 @@ func (store dbStore) saveConsensusParamsInfo(nextHeight, changeHeight int64, par } func (store dbStore) SetOfflineStateSyncHeight(height int64) error { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "SetOfflineStateSyncHeight") + defer stop() + err := store.db.SetSync(offlineStateSyncHeight, int64ToBytes(height)) if err != nil { return err @@ -1056,6 +1123,9 @@ func (store dbStore) SetOfflineStateSyncHeight(height int64) error { // Gets the height at which the store is bootstrapped after out of band statesync. func (store dbStore) GetOfflineStateSyncHeight() (int64, error) { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "GetOfflineStateSyncHeight") + defer stop() + buf, err := store.db.Get(offlineStateSyncHeight) if err != nil { return 0, err @@ -1073,6 +1143,9 @@ func (store dbStore) GetOfflineStateSyncHeight() (int64, error) { } func (store dbStore) Close() error { + _, stop := store.StoreOptions.Meter.FuncTimingCtx(context.Background(), "Close") + defer stop() + return store.db.Close() } @@ -1150,6 +1223,6 @@ func int64ToBytes(i int64) []byte { // The observation added to m is the number of seconds elapsed since addTimeSample // was initially called. addTimeSample is meant to be called in a defer to calculate // the amount of time a function takes to complete. -func addTimeSample(m metrics.Histogram, start time.Time) func() { +func addTimeSample(m cmtmetrics.Histogram, start time.Time) func() { return func() { m.Observe(time.Since(start).Seconds()) } } diff --git a/statesync/reactor.go b/statesync/reactor.go index 9b71ffe4f27..54ca1075697 100644 --- a/statesync/reactor.go +++ b/statesync/reactor.go @@ -5,9 +5,11 @@ package statesync import ( "context" "errors" + "fmt" "sort" "time" + injmetrics "github.com/InjectiveLabs/metrics/v2" abci "github.com/cometbft/cometbft/abci/types" ssproto "github.com/cometbft/cometbft/api/cometbft/statesync/v1" "github.com/cometbft/cometbft/config" @@ -37,6 +39,7 @@ type Reactor struct { connQuery proxy.AppConnQuery tempDir string metrics *Metrics + meter injmetrics.Meter // This will only be set when a state sync is in progress. It is used to feed received // snapshots and chunks into the sync. @@ -50,12 +53,18 @@ func NewReactor( conn proxy.AppConnSnapshot, connQuery proxy.AppConnQuery, metrics *Metrics, + meter injmetrics.Meter, ) *Reactor { + if meter == nil { + meter = injmetrics.NewNilMeter() + } + r := &Reactor{ cfg: cfg, conn: conn, connQuery: connQuery, metrics: metrics, + meter: meter, } r.BaseReactor = *p2p.NewBaseReactor("StateSync", r) @@ -118,6 +127,9 @@ func (r *Reactor) Receive(e p2p.Envelope) { return } + _, stop := r.meter.FuncTimingCtx(context.Background(), "Receive", injmetrics.Tag("msg", fmt.Sprintf("%T", e.Message))) + defer stop() + switch e.ChannelID { case SnapshotChannel: switch msg := e.Message.(type) { @@ -264,6 +276,9 @@ func (r *Reactor) recentSnapshots(n uint32) ([]*snapshot, error) { // Sync runs a state sync, returning the new state and last commit at the snapshot height. // The caller must store the state and commit in the state database and block store. func (r *Reactor) Sync(stateProvider StateProvider, discoveryTime time.Duration) (sm.State, *types.Commit, error) { + _, stop := r.meter.FuncTimingCtx(context.Background(), "Sync") + defer stop() + r.mtx.Lock() if r.syncer != nil { r.mtx.Unlock() diff --git a/statesync/reactor_test.go b/statesync/reactor_test.go index 91ad4fa4cb0..954085cae80 100644 --- a/statesync/reactor_test.go +++ b/statesync/reactor_test.go @@ -72,7 +72,7 @@ func TestReactor_Receive_ChunkRequest(t *testing.T) { // Start a reactor and send a ssproto.ChunkRequest, then wait for and check response cfg := config.DefaultStateSyncConfig() - r := NewReactor(*cfg, conn, nil, NopMetrics()) + r := NewReactor(*cfg, conn, nil, NopMetrics(), nil) err := r.Start() require.NoError(t, err) t.Cleanup(func() { @@ -161,7 +161,7 @@ func TestReactor_Receive_SnapshotsRequest(t *testing.T) { // Start a reactor and send a SnapshotsRequestMessage, then wait for and check responses cfg := config.DefaultStateSyncConfig() - r := NewReactor(*cfg, conn, nil, NopMetrics()) + r := NewReactor(*cfg, conn, nil, NopMetrics(), nil) err := r.Start() require.NoError(t, err) t.Cleanup(func() { diff --git a/test/e2e/node/main.go b/test/e2e/node/main.go index 8b51cc231b0..2b7bf66faea 100644 --- a/test/e2e/node/main.go +++ b/test/e2e/node/main.go @@ -142,15 +142,7 @@ func startNode(cfg *Config) error { if err != nil { return err } - n, err := node.NewNode(context.Background(), cmtcfg, - pv, - nodeKey, - clientCreator, - node.DefaultGenesisDocProviderFunc(cmtcfg), - config.DefaultDBProvider, - node.DefaultMetricsProvider(cmtcfg.Instrumentation), - nodeLogger, - ) + n, err := node.NewNode(context.Background(), cmtcfg, pv, nodeKey, clientCreator, node.DefaultGenesisDocProviderFunc(cmtcfg), config.DefaultDBProvider, node.DefaultMetricsProvider(cmtcfg.Instrumentation), nodeLogger, nil) if err != nil { return err }