From f3977031d3687e1910985ecc1ec5f5bc65d9f92c Mon Sep 17 00:00:00 2001 From: prakhar katiyar Date: Tue, 9 Sep 2025 19:22:31 +0530 Subject: [PATCH] error handler correction --- client/telemetry/TelemetryEventClient.go | 28 +++++++++++++---- cmd/external-app/externalApp.go | 38 ++++++++++++++++-------- 2 files changed, 48 insertions(+), 18 deletions(-) diff --git a/client/telemetry/TelemetryEventClient.go b/client/telemetry/TelemetryEventClient.go index 4dc6832c63..66fca09822 100644 --- a/client/telemetry/TelemetryEventClient.go +++ b/client/telemetry/TelemetryEventClient.go @@ -133,17 +133,29 @@ func NewTelemetryEventClientImpl(logger *zap.SugaredLogger, client *http.Client, func (impl *TelemetryEventClientImpl) GetCloudProvider() (string, error) { // assumption: the IMDS server will be reachable on startup + // Return cached value or "unknown" if identification is still in progress if len(impl.telemetryConfig.cloudProvider) == 0 { - provider, err := impl.cloudProviderIdentifierService.IdentifyProvider() - if err != nil { - impl.logger.Errorw("exception while getting cluster provider", "error", err) - return "", err - } - impl.telemetryConfig.cloudProvider = provider + // Return unknown for now, background identification will update this + return "unknown", nil } return impl.telemetryConfig.cloudProvider, nil } +// identifyCloudProviderAsync runs cloud provider identification in background +func (impl *TelemetryEventClientImpl) identifyCloudProviderAsync() { + impl.logger.Info("Starting cloud provider identification in background") + + provider, err := impl.cloudProviderIdentifierService.IdentifyProvider() + if err != nil { + impl.logger.Errorw("exception while getting cluster provider", "error", err) + impl.telemetryConfig.cloudProvider = "unknown" + return + } + + impl.telemetryConfig.cloudProvider = provider + impl.logger.Infow("Cloud provider identified", "provider", provider) +} + func (impl *TelemetryEventClientImpl) StopCron() { impl.cron.Stop() } @@ -341,6 +353,10 @@ func (impl *TelemetryEventClientImpl) GetTelemetryMetaInfo() (*TelemetryMetaInfo func (impl *TelemetryEventClientImpl) SendTelemetryInstallEventEA() (*TelemetryEventType, error) { ucid, err := impl.getUCIDAndCheckIsOptedOut(context.Background()) + + // Start cloud provider identification in background to avoid blocking startup + go impl.identifyCloudProviderAsync() + if err != nil { impl.logger.Errorw("exception while getting unique client id", "error", err) return nil, err diff --git a/cmd/external-app/externalApp.go b/cmd/external-app/externalApp.go index 68c0539818..9c5746cded 100644 --- a/cmd/external-app/externalApp.go +++ b/cmd/external-app/externalApp.go @@ -20,11 +20,12 @@ import ( "context" "errors" "fmt" - posthogTelemetry "github.com/devtron-labs/common-lib/telemetry" "net/http" "os" "time" + posthogTelemetry "github.com/devtron-labs/common-lib/telemetry" + authMiddleware "github.com/devtron-labs/authenticator/middleware" "github.com/devtron-labs/common-lib/middlewares" "github.com/devtron-labs/devtron/client/telemetry" @@ -71,21 +72,31 @@ func (app *App) Start() { app.MuxRouter.Init() //authEnforcer := casbin2.Create() - _, err := app.telemetry.SendTelemetryInstallEventEA() - - if err != nil { - app.Logger.Warnw("telemetry installation success event failed", "err", err) - } + // Send telemetry event asynchronously to avoid blocking startup + go func() { + _, err := app.telemetry.SendTelemetryInstallEventEA() + if err != nil { + app.Logger.Warnw("telemetry installation success event failed", "err", err) + } + }() server := &http.Server{Addr: fmt.Sprintf(":%d", port), Handler: authMiddleware.Authorizer(app.sessionManager, user.WhitelistChecker, app.userService.CheckUserStatusAndUpdateLoginAudit)(app.MuxRouter.Router)} app.MuxRouter.Router.Use(middleware.PrometheusMiddleware) app.MuxRouter.Router.Use(middlewares.Recovery) app.server = server - err = server.ListenAndServe() - if err != nil && !errors.Is(err, http.ErrServerClosed) { - app.Logger.Errorw("error in startup", "err", err) - os.Exit(2) - } + // Start server in goroutine to make it non-blocking + go func() { + app.Logger.Info("HTTP server starting to listen") + err := server.ListenAndServe() + if err != nil && !errors.Is(err, http.ErrServerClosed) { + app.Logger.Errorw("error in startup", "err", err) + os.Exit(2) + } + }() + + // Give server a moment to start listening + time.Sleep(1 * time.Second) + app.Logger.Info("HTTP server should be ready for health checks") } func (app *App) Stop() { @@ -98,7 +109,10 @@ func (app *App) Stop() { timeoutContext, _ := context.WithTimeout(context.Background(), 5*time.Second) app.Logger.Infow("closing router") - err := app.server.Shutdown(timeoutContext) + var err error + if app.server != nil { + err = app.server.Shutdown(timeoutContext) + } if err != nil { app.Logger.Errorw("error in mux router shutdown", "err", err) }