diff --git a/CHANGELOG.md b/CHANGELOG.md index 68a5359d253f..e98c8cdddfef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,10 @@ Ref: https://keepachangelog.com/en/1.0.0/ * [#12453](https://github.com/cosmos/cosmos-sdk/pull/12453) Add `NewInMemoryWithKeyring` function which allows the creation of in memory `keystore` instances with a specified set of existing items. +### Bug Fixes + +* [#12448](https://github.com/cosmos/cosmos-sdk/pull/12448) Start telemetry independently from the API server. + ## [v0.46.0-rc2](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.46.0-rc2) - 2022-07-05 ### Features diff --git a/server/api/server.go b/server/api/server.go index 7bbf15ef7529..5bc406acfa38 100644 --- a/server/api/server.go +++ b/server/api/server.go @@ -90,16 +90,6 @@ func New(clientCtx client.Context, logger log.Logger) *Server { // non-blocking, so an external signal handler must be used. func (s *Server) Start(cfg config.Config) error { s.mtx.Lock() - if cfg.Telemetry.Enabled { - m, err := telemetry.New(cfg.Telemetry) - if err != nil { - s.mtx.Unlock() - return err - } - - s.metrics = m - s.registerMetrics() - } tmCfg := tmrpcserver.DefaultConfig() tmCfg.MaxOpenConnections = int(cfg.API.MaxOpenConnections) @@ -114,18 +104,17 @@ func (s *Server) Start(cfg config.Config) error { } s.registerGRPCGatewayRoutes() - s.listener = listener var h http.Handler = s.Router + s.mtx.Unlock() + if cfg.API.EnableUnsafeCORS { allowAllCORS := handlers.CORS(handlers.AllowedHeaders([]string{"Content-Type"})) - s.mtx.Unlock() return tmrpcserver.Serve(s.listener, allowAllCORS(h), s.logger, tmCfg) } s.logger.Info("starting API server...") - s.mtx.Unlock() return tmrpcserver.Serve(s.listener, s.Router, s.logger, tmCfg) } @@ -140,6 +129,13 @@ func (s *Server) registerGRPCGatewayRoutes() { s.Router.PathPrefix("/").Handler(s.GRPCGatewayRouter) } +func (s *Server) SetTelemetry(m *telemetry.Metrics) { + s.mtx.Lock() + s.metrics = m + s.registerMetrics() + s.mtx.Unlock() +} + func (s *Server) registerMetrics() { metricsHandler := func(w http.ResponseWriter, r *http.Request) { format := strings.TrimSpace(r.FormValue("format")) diff --git a/server/start.go b/server/start.go index e8c6dafd71d5..b5f8dc1023f2 100644 --- a/server/start.go +++ b/server/start.go @@ -27,11 +27,13 @@ import ( "github.com/cosmos/cosmos-sdk/codec" pruningtypes "github.com/cosmos/cosmos-sdk/pruning/types" "github.com/cosmos/cosmos-sdk/server/api" + "github.com/cosmos/cosmos-sdk/server/config" serverconfig "github.com/cosmos/cosmos-sdk/server/config" servergrpc "github.com/cosmos/cosmos-sdk/server/grpc" "github.com/cosmos/cosmos-sdk/server/rosetta" crgserver "github.com/cosmos/cosmos-sdk/server/rosetta/lib/server" "github.com/cosmos/cosmos-sdk/server/types" + "github.com/cosmos/cosmos-sdk/telemetry" sdktypes "github.com/cosmos/cosmos-sdk/types" ) @@ -207,6 +209,10 @@ func startStandAlone(ctx *Context, appCreator types.AppCreator) error { } app := appCreator(ctx.Logger, db, traceWriter, ctx.Viper) + _, err = startTelemetry(serverconfig.GetConfig(ctx.Viper)) + if err != nil { + return err + } svr, err := server.NewServer(addr, transport, app) if err != nil { @@ -319,6 +325,11 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App app.RegisterTendermintService(clientCtx) } + metrics, err := startTelemetry(config) + if err != nil { + return err + } + var apiSrv *api.Server if config.API.Enable { genDoc, err := genDocProvider() @@ -366,6 +377,9 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App apiSrv = api.New(clientCtx, ctx.Logger.With("module", "api-server")) app.RegisterAPIRoutes(apiSrv, config.API) + if config.Telemetry.Enabled { + apiSrv.SetTelemetry(metrics) + } errCh := make(chan error) go func() { @@ -488,3 +502,10 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App // wait for signal capture and gracefully return return WaitForQuitSignals() } + +func startTelemetry(cfg config.Config) (*telemetry.Metrics, error) { + if !cfg.Telemetry.Enabled { + return nil, nil + } + return telemetry.New(cfg.Telemetry) +}