diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/solutions/ce/UserSignupCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/solutions/ce/UserSignupCEImpl.java index 2179b3186d..cd8386bd98 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/solutions/ce/UserSignupCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/solutions/ce/UserSignupCEImpl.java @@ -8,6 +8,7 @@ import com.appsmith.server.domains.LoginSource; import com.appsmith.server.domains.User; import com.appsmith.server.domains.UserData; import com.appsmith.server.domains.UserState; +import com.appsmith.server.dtos.EnvChangesResponseDTO; import com.appsmith.server.dtos.UserSignupDTO; import com.appsmith.server.dtos.UserSignupRequestDTO; import com.appsmith.server.exceptions.AppsmithError; @@ -261,55 +262,97 @@ public class UserSignupCEImpl implements UserSignupCE { userData.setRole(userFromRequest.getRole()); userData.setUseCase(userFromRequest.getUseCase()); - Mono allSecondaryFunctions = Mono.when( - userDataService.updateForUser(user, userData), - Mono.zip(configService.getInstanceId(), NetworkUtils.getExternalAddress().defaultIfEmpty("unknown")) - .flatMap(tuple -> { - final String instanceId = tuple.getT1(); - final String ip = tuple.getT2(); - log.debug("Installation setup complete."); - String newsletterSignedUpUserEmail = userFromRequest.isSignupForNewsletter() ? user.getEmail() : ""; - String newsletterSignedUpUserName = userFromRequest.isSignupForNewsletter() ? user.getName() : ""; - Map analyticsProps = new HashMap<>(); - analyticsProps.put(DISABLE_TELEMETRY, !userFromRequest.isAllowCollectingAnonymousData()); - analyticsProps.put(SUBSCRIBE_MARKETING, userFromRequest.isSignupForNewsletter()); - analyticsProps.put(EMAIL, newsletterSignedUpUserEmail); - analyticsProps.put(ROLE, ObjectUtils.defaultIfNull(userData.getRole(), "")); - analyticsProps.put(GOAL, ObjectUtils.defaultIfNull(userData.getUseCase(), "")); - // ip is a reserved keyword for tracking events in Mixpanel though this is allowed in - // Segment. Instead of showing the ip as is Mixpanel provides derived property. - // As we want derived props alongwith the ip address we are sharing the ip - // address in separate keys - // Ref: https://help.mixpanel.com/hc/en-us/articles/360001355266-Event-Properties - analyticsProps.put(IP, ip); - analyticsProps.put(IP_ADDRESS, ip); - analyticsProps.put(NAME, ObjectUtils.defaultIfNull(newsletterSignedUpUserName, "")); + Mono userDataMono = userDataService.updateForUser(user, userData) + .elapsed() + .map(pair -> { + log.debug("UserSignupCEImpl::Time taken to update user data for user: {} ms", pair.getT1()); + return pair.getT2(); + }); - analyticsService.identifyInstance( - instanceId, - userData.getRole(), - userData.getUseCase(), - newsletterSignedUpUserEmail, - newsletterSignedUpUserName, - ip); - - return analyticsService.sendEvent( - AnalyticsEvents.INSTALLATION_SETUP_COMPLETE.getEventName(), - instanceId, - analyticsProps, - false - ); - }), - envManager.applyChanges(Map.of( + Mono applyEnvManagerChangesMono = envManager.applyChanges(Map.of( APPSMITH_DISABLE_TELEMETRY.name(), String.valueOf(!userFromRequest.isAllowCollectingAnonymousData()), APPSMITH_INSTANCE_NAME.name(), commonConfig.getInstanceName(), APPSMITH_ADMIN_EMAILS.name(), user.getEmail() - )), - analyticsService.sendObjectEvent(AnalyticsEvents.CREATE_SUPERUSER, user, null) - ) + )) + .elapsed() + .map(pair -> { + log.debug("UserSignupCEImpl::Time taken to apply env changes: {} ms", pair.getT1()); + return pair.getT2(); + }); + + Mono sendCreateSuperUserEvent = analyticsService.sendObjectEvent(AnalyticsEvents.CREATE_SUPERUSER, user, null) + .elapsed() + .map(pair -> { + log.debug("UserSignupCEImpl::Time taken to send create super user event: {} ms", pair.getT1()); + return pair.getT2(); + }); + + Mono getInstanceIdMono = configService.getInstanceId() + .elapsed() + .map(pair -> { + log.debug("UserSignupCEImpl::Time taken to get instance ID: {} ms", pair.getT1()); + return pair.getT2(); + });; + + Mono getExternalAddressMono = NetworkUtils.getExternalAddress().defaultIfEmpty("unknown") + .elapsed() + .map(pair -> { + log.debug("UserSignupCEImpl::Time taken to get external address: {} ms", pair.getT1()); + return pair.getT2(); + }); + + Mono installationSetupAnalyticsMono = Mono.zip(getInstanceIdMono, getExternalAddressMono) + .flatMap(tuple -> { + final String instanceId = tuple.getT1(); + final String ip = tuple.getT2(); + log.debug("Installation setup complete."); + String newsletterSignedUpUserEmail = userFromRequest.isSignupForNewsletter() ? user.getEmail() : ""; + String newsletterSignedUpUserName = userFromRequest.isSignupForNewsletter() ? user.getName() : ""; + Map analyticsProps = new HashMap<>(); + analyticsProps.put(DISABLE_TELEMETRY, !userFromRequest.isAllowCollectingAnonymousData()); + analyticsProps.put(SUBSCRIBE_MARKETING, userFromRequest.isSignupForNewsletter()); + analyticsProps.put(EMAIL, newsletterSignedUpUserEmail); + analyticsProps.put(ROLE, ObjectUtils.defaultIfNull(userData.getRole(), "")); + analyticsProps.put(GOAL, ObjectUtils.defaultIfNull(userData.getUseCase(), "")); + // ip is a reserved keyword for tracking events in Mixpanel though this is allowed in + // Segment. Instead of showing the ip as is Mixpanel provides derived property. + // As we want derived props alongwith the ip address we are sharing the ip + // address in separate keys + // Ref: https://help.mixpanel.com/hc/en-us/articles/360001355266-Event-Properties + analyticsProps.put(IP, ip); + analyticsProps.put(IP_ADDRESS, ip); + analyticsProps.put(NAME, ObjectUtils.defaultIfNull(newsletterSignedUpUserName, "")); + + analyticsService.identifyInstance( + instanceId, + userData.getRole(), + userData.getUseCase(), + newsletterSignedUpUserEmail, + newsletterSignedUpUserName, + ip); + + return analyticsService.sendEvent( + AnalyticsEvents.INSTALLATION_SETUP_COMPLETE.getEventName(), + instanceId, + analyticsProps, + false + ).thenReturn(1L) + .elapsed() + .map(pair -> { + log.debug("UserSignupCEImpl::Time taken to send installation setup complete analytics event: {} ms", pair.getT1()); + return pair.getT2(); + }); + }) + .elapsed() + .map(pair -> { + log.debug("UserSignupCEImpl::Time taken to send installation setup analytics event: {} ms", pair.getT1()); + return pair.getT2(); + });; + + Mono allSecondaryFunctions = Mono.when(userDataMono, installationSetupAnalyticsMono, applyEnvManagerChangesMono, sendCreateSuperUserEvent) .thenReturn(1L) .elapsed() .map(pair -> {