imp(rpc) Add support for EVM RPC metrics (#1378)

* imp(rpc) Add support for EVM RPC metrics

- Support --metrics flag
- Add EVM rpc metrics server config

* Update as per PR feedback

Co-authored-by: Freddy Caceres <facs95@gmail.com>
This commit is contained in:
v-homsi 2022-10-14 18:50:01 -04:00 committed by GitHub
parent 22a81b723a
commit a21923f5ae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 26 additions and 1 deletions

View File

@ -32,7 +32,7 @@ jobs:
go.mod go.mod
go.sum go.sum
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- run: semgrep scan --sarif --output=semgrep.sarif - run: semgrep scan --sarif --output=semgrep.sarif --config auto
env: env:
# Upload findings to GitHub Advanced Security Dashboard [step 1/2] # Upload findings to GitHub Advanced Security Dashboard [step 1/2]
SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }} SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}

View File

@ -60,6 +60,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
* (ledger) [#1277](https://github.com/evmos/ethermint/pull/1277) Add Ledger preprocessing transaction hook for EIP-712-signed Cosmos payloads. * (ledger) [#1277](https://github.com/evmos/ethermint/pull/1277) Add Ledger preprocessing transaction hook for EIP-712-signed Cosmos payloads.
* (rpc) [#1296](https://github.com/evmos/ethermint/pull/1296) Add RPC Backend unit tests. * (rpc) [#1296](https://github.com/evmos/ethermint/pull/1296) Add RPC Backend unit tests.
* (rpc) [#1352](https://github.com/evmos/ethermint/pull/1352) Make the grpc queries run concurrently, don't block the consensus state machine. * (rpc) [#1352](https://github.com/evmos/ethermint/pull/1352) Make the grpc queries run concurrently, don't block the consensus state machine.
* (rpc) [#1378](https://github.com/evmos/ethermint/pull/1378) Add support for EVM RPC metrics
### Bug Fixes ### Bug Fixes

View File

@ -25,6 +25,9 @@ const (
// DefaultJSONRPCWsAddress is the default address the JSON-RPC WebSocket server binds to. // DefaultJSONRPCWsAddress is the default address the JSON-RPC WebSocket server binds to.
DefaultJSONRPCWsAddress = "0.0.0.0:8546" DefaultJSONRPCWsAddress = "0.0.0.0:8546"
// DefaultJsonRPCMetricsAddress is the default address the JSON-RPC Metrics server binds to.
DefaultJSONRPCMetricsAddress = "0.0.0.0:6065"
// DefaultEVMTracer is the default vm.Tracer type // DefaultEVMTracer is the default vm.Tracer type
DefaultEVMTracer = "" DefaultEVMTracer = ""
@ -110,6 +113,8 @@ type JSONRPCConfig struct {
MaxOpenConnections int `mapstructure:"max-open-connections"` MaxOpenConnections int `mapstructure:"max-open-connections"`
// EnableIndexer defines if enable the custom indexer service. // EnableIndexer defines if enable the custom indexer service.
EnableIndexer bool `mapstructure:"enable-indexer"` EnableIndexer bool `mapstructure:"enable-indexer"`
// MetricsAddress defines the metrics server to listen on
MetricsAddress string `mapstructure:"metrics-address"`
} }
// TLSConfig defines the certificate and matching private key for the server. // TLSConfig defines the certificate and matching private key for the server.
@ -211,6 +216,7 @@ func DefaultJSONRPCConfig() *JSONRPCConfig {
AllowUnprotectedTxs: DefaultAllowUnprotectedTxs, AllowUnprotectedTxs: DefaultAllowUnprotectedTxs,
MaxOpenConnections: DefaultMaxOpenConnections, MaxOpenConnections: DefaultMaxOpenConnections,
EnableIndexer: false, EnableIndexer: false,
MetricsAddress: DefaultJSONRPCMetricsAddress,
} }
} }
@ -319,6 +325,7 @@ func GetConfig(v *viper.Viper) (Config, error) {
HTTPIdleTimeout: v.GetDuration("json-rpc.http-idle-timeout"), HTTPIdleTimeout: v.GetDuration("json-rpc.http-idle-timeout"),
MaxOpenConnections: v.GetInt("json-rpc.max-open-connections"), MaxOpenConnections: v.GetInt("json-rpc.max-open-connections"),
EnableIndexer: v.GetBool("json-rpc.enable-indexer"), EnableIndexer: v.GetBool("json-rpc.enable-indexer"),
MetricsAddress: v.GetString("json-rpc.metrics-address"),
}, },
TLS: TLSConfig{ TLS: TLSConfig{
CertificatePath: v.GetString("tls.certificate-path"), CertificatePath: v.GetString("tls.certificate-path"),

View File

@ -73,6 +73,10 @@ max-open-connections = {{ .JSONRPC.MaxOpenConnections }}
# EnableIndexer enables the custom transaction indexer for the EVM (ethereum transactions). # EnableIndexer enables the custom transaction indexer for the EVM (ethereum transactions).
enable-indexer = {{ .JSONRPC.EnableIndexer }} enable-indexer = {{ .JSONRPC.EnableIndexer }}
# MetricsAddress defines the EVM Metrics server address to bind to. Pass --metrics in CLI to enable
# Prometheus metrics path: /debug/metrics/prometheus
metrics-address = "{{ .JSONRPC.MetricsAddress }}"
############################################################################### ###############################################################################
### TLS Configuration ### ### TLS Configuration ###
############################################################################### ###############################################################################

View File

@ -49,6 +49,10 @@ const (
JSONRPCAllowUnprotectedTxs = "json-rpc.allow-unprotected-txs" JSONRPCAllowUnprotectedTxs = "json-rpc.allow-unprotected-txs"
JSONRPCMaxOpenConnections = "json-rpc.max-open-connections" JSONRPCMaxOpenConnections = "json-rpc.max-open-connections"
JSONRPCEnableIndexer = "json-rpc.enable-indexer" JSONRPCEnableIndexer = "json-rpc.enable-indexer"
// JSONRPCEnableMetrics enables EVM RPC metrics server.
// Set to `metrics` which is hardcoded flag from go-ethereum.
// https://github.com/ethereum/go-ethereum/blob/master/metrics/metrics.go#L35-L55
JSONRPCEnableMetrics = "metrics"
) )
// EVM flags // EVM flags

View File

@ -33,6 +33,8 @@ import (
"github.com/cosmos/cosmos-sdk/server/rosetta" "github.com/cosmos/cosmos-sdk/server/rosetta"
crgserver "github.com/cosmos/cosmos-sdk/server/rosetta/lib/server" crgserver "github.com/cosmos/cosmos-sdk/server/rosetta/lib/server"
ethmetricsexp "github.com/ethereum/go-ethereum/metrics/exp"
"github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/flags"
pruningtypes "github.com/cosmos/cosmos-sdk/pruning/types" pruningtypes "github.com/cosmos/cosmos-sdk/pruning/types"
@ -171,6 +173,7 @@ which accepts a path for the resulting pprof file.
cmd.Flags().Int32(srvflags.JSONRPCBlockRangeCap, config.DefaultBlockRangeCap, "Sets the max block range allowed for `eth_getLogs` query") cmd.Flags().Int32(srvflags.JSONRPCBlockRangeCap, config.DefaultBlockRangeCap, "Sets the max block range allowed for `eth_getLogs` query")
cmd.Flags().Int(srvflags.JSONRPCMaxOpenConnections, config.DefaultMaxOpenConnections, "Sets the maximum number of simultaneous connections for the server listener") //nolint:lll cmd.Flags().Int(srvflags.JSONRPCMaxOpenConnections, config.DefaultMaxOpenConnections, "Sets the maximum number of simultaneous connections for the server listener") //nolint:lll
cmd.Flags().Bool(srvflags.JSONRPCEnableIndexer, false, "Enable the custom tx indexer for json-rpc") cmd.Flags().Bool(srvflags.JSONRPCEnableIndexer, false, "Enable the custom tx indexer for json-rpc")
cmd.Flags().Bool(srvflags.JSONRPCEnableMetrics, false, "Define if EVM rpc metrics server should be enabled")
cmd.Flags().String(srvflags.EVMTracer, config.DefaultEVMTracer, "the EVM tracer type to collect execution traces from the EVM transaction execution (json|struct|access_list|markdown)") //nolint:lll cmd.Flags().String(srvflags.EVMTracer, config.DefaultEVMTracer, "the EVM tracer type to collect execution traces from the EVM transaction execution (json|struct|access_list|markdown)") //nolint:lll
cmd.Flags().Uint64(srvflags.EVMMaxTxGasWanted, config.DefaultMaxTxGasWanted, "the gas wanted for each eth tx returned in ante handler in check tx mode") //nolint:lll cmd.Flags().Uint64(srvflags.EVMMaxTxGasWanted, config.DefaultMaxTxGasWanted, "the gas wanted for each eth tx returned in ante handler in check tx mode") //nolint:lll
@ -340,6 +343,12 @@ func startInProcess(ctx *server.Context, clientCtx client.Context, appCreator ty
app.RegisterTendermintService(clientCtx) app.RegisterTendermintService(clientCtx)
} }
// Enable metrics if JSONRPC is enabled and --metrics is passed
// Flag not added in config to avoid user enabling in config without passing in CLI
if config.JSONRPC.Enable && ctx.Viper.GetBool(srvflags.JSONRPCEnableMetrics) {
ethmetricsexp.Setup(config.JSONRPC.MetricsAddress)
}
var idxer ethermint.EVMTxIndexer var idxer ethermint.EVMTxIndexer
if config.JSONRPC.EnableIndexer { if config.JSONRPC.EnableIndexer {
idxDB, err := OpenIndexerDB(home, server.GetAppDBBackend(ctx.Viper)) idxDB, err := OpenIndexerDB(home, server.GetAppDBBackend(ctx.Viper))