chore: added metrics around actions api view mode (#35416)

## Description

This PR adds perf metrics around consolidated view API -> actions
section. These metrics will help us understand which parts of the code
are taking the longest which can help us in improving it further.

Fixes #35338 
_or_  
Fixes `Issue URL`
> [!WARNING]  
> _If no issue exists, please create an issue first, and check with the
maintainers if the issue is valid._

## Automation

/ok-to-test tags="@tag.All"

### 🔍 Cypress test results
<!-- This is an auto-generated comment: Cypress test results  -->
> [!TIP]
> 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉
> Workflow run:
<https://github.com/appsmithorg/appsmith/actions/runs/10301401346>
> Commit: e89901b15e648e6d466665c637be01572ccc963e
> <a
href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=10301401346&attempt=1"
target="_blank">Cypress dashboard</a>.
> Tags: `@tag.All`
> Spec:
> <hr>Thu, 08 Aug 2024 12:29:57 UTC
<!-- end of auto-generated comment: Cypress test results  -->


## Communication
Should the DevRel and Marketing teams inform users about this change?
- [ ] Yes
- [x] No


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit


- **New Features**
- Introduced new constants for action spans to improve tracking of user
interactions in the view mode.
- Added a new class for page spans, enhancing organization and clarity
of API span naming conventions.

- **Bug Fixes**
- Improved integration with existing components for better observability
and performance monitoring.

- **Chores**
- Updated naming conventions for span identifiers to promote consistency
across the application.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: “sneha122” <“sneha@appsmith.com”>
This commit is contained in:
sneha122 2024-08-08 19:32:40 +05:30 committed by GitHub
parent f0059fe894
commit 2e3791a967
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 154 additions and 29 deletions

View File

@ -0,0 +1,5 @@
package com.appsmith.external.constants.spans;
import com.appsmith.external.constants.spans.ce.ApplicationSpanCE;
public class ApplicationSpan extends ApplicationSpanCE {}

View File

@ -0,0 +1,5 @@
package com.appsmith.external.constants.spans;
import com.appsmith.external.constants.spans.ce.PageSpanCE;
public class PageSpan extends PageSpanCE {}

View File

@ -1,6 +1,8 @@
package com.appsmith.external.constants.spans.ce;
import static com.appsmith.external.constants.spans.BaseSpan.APPSMITH_SPAN_PREFIX;
import static com.appsmith.external.constants.spans.ConsolidatedApiSpanNames.CONSOLIDATED_API_PREFIX;
import static com.appsmith.external.constants.spans.ConsolidatedApiSpanNames.VIEW;
/**
* Please make sure that all span names start with `appsmith.` because span with any other naming format would get
@ -8,6 +10,8 @@ import static com.appsmith.external.constants.spans.BaseSpan.APPSMITH_SPAN_PREFI
*/
public class ActionSpanCE {
// Action execution spans
public static final String ACTIONS = "actions.";
public static final String ACTIONS_VIEW_MODE_PREFIX = CONSOLIDATED_API_PREFIX + VIEW + ACTIONS;
public static final String ACTION_EXECUTION_REQUEST_PARSING = APPSMITH_SPAN_PREFIX + "request.parsing";
public static final String ACTION_EXECUTION_CACHED_DATASOURCE = APPSMITH_SPAN_PREFIX + "get.datasource.cached";
public static final String ACTION_EXECUTION_DATASOURCE_CONTEXT = APPSMITH_SPAN_PREFIX + "get.datasource.context";
@ -19,4 +23,13 @@ public class ActionSpanCE {
public static final String GET_UNPUBLISHED_ACTION = APPSMITH_SPAN_PREFIX + "get.action.unpublished";
public static final String GET_VIEW_MODE_ACTION = APPSMITH_SPAN_PREFIX + "get.action.viewmode";
public static final String GET_ACTION_REPOSITORY_CALL = APPSMITH_SPAN_PREFIX + "get.action.repository.call";
public static final String VIEW_MODE_FILTER_ACTION = ACTIONS_VIEW_MODE_PREFIX + "filter";
public static final String VIEW_MODE_SANITISE_ACTION = ACTIONS_VIEW_MODE_PREFIX + "sanitise";
public static final String VIEW_MODE_INITIAL_ACTION = ACTIONS_VIEW_MODE_PREFIX + "initial";
public static final String VIEW_MODE_FINAL_ACTION = ACTIONS_VIEW_MODE_PREFIX + "final";
public static final String VIEW_MODE_SET_PLUGIN_ID_AND_TYPE_JS = ACTIONS_VIEW_MODE_PREFIX + "set_js";
public static final String VIEW_MODE_SET_PLUGIN_ID_AND_TYPE_ACTION = ACTIONS_VIEW_MODE_PREFIX + "set_action";
public static final String VIEW_MODE_FETCH_PLUGIN_FROM_DB = ACTIONS_VIEW_MODE_PREFIX + "plugindb";
public static final String VIEW_MODE_FETCH_ACTIONS_FROM_DB = ACTIONS_VIEW_MODE_PREFIX + "fetchactions";
public static final String VIEW_MODE_FETCH_ACTIONS_FROM_DB_QUERY = ACTIONS_VIEW_MODE_PREFIX + "actionsdb";
}

View File

@ -0,0 +1,7 @@
package com.appsmith.external.constants.spans.ce;
import static com.appsmith.external.constants.spans.ConsolidatedApiSpanNames.CONSOLIDATED_API_PREFIX;
public class ApplicationSpanCE {
public static final String APPLICATION_FETCH_FROM_DB = CONSOLIDATED_API_PREFIX + "app_db";
}

View File

@ -0,0 +1,10 @@
package com.appsmith.external.constants.spans.ce;
import static com.appsmith.external.constants.spans.ConsolidatedApiSpanNames.CONSOLIDATED_API_PREFIX;
public class PageSpanCE {
public static final String GET_PAGE = CONSOLIDATED_API_PREFIX + "getpage";
public static final String GET_PAGE_WITHOUT_BRANCH = CONSOLIDATED_API_PREFIX + "without_branch";
public static final String GET_PAGE_WITH_BRANCH = CONSOLIDATED_API_PREFIX + "with_branch";
public static final String FETCH_PAGE_FROM_DB = CONSOLIDATED_API_PREFIX + "pagedb";
}

View File

@ -42,6 +42,7 @@ import com.appsmith.server.solutions.ApplicationPermission;
import com.appsmith.server.solutions.DatasourcePermission;
import com.appsmith.server.solutions.PolicySolution;
import com.appsmith.server.solutions.WorkspacePermission;
import io.micrometer.observation.ObservationRegistry;
import jakarta.validation.Validator;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
@ -50,6 +51,7 @@ import org.springframework.dao.DuplicateKeyException;
import org.springframework.http.codec.multipart.Part;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import reactor.core.observability.micrometer.Micrometer;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@ -63,6 +65,7 @@ import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import static com.appsmith.external.constants.spans.ce.ApplicationSpanCE.APPLICATION_FETCH_FROM_DB;
import static com.appsmith.server.acl.AclPermission.MANAGE_APPLICATIONS;
import static com.appsmith.server.acl.AclPermission.READ_APPLICATIONS;
import static com.appsmith.server.constants.Constraint.MAX_LOGO_SIZE_KB;
@ -84,6 +87,7 @@ public class ApplicationServiceCEImpl extends BaseService<ApplicationRepository,
private final UserDataService userDataService;
private final WorkspaceService workspaceService;
private final WorkspacePermission workspacePermission;
private final ObservationRegistry observationRegistry;
private static final Integer MAX_RETRIES = 5;
@ -101,7 +105,8 @@ public class ApplicationServiceCEImpl extends BaseService<ApplicationRepository,
SessionUserService sessionUserService,
UserDataService userDataService,
WorkspaceService workspaceService,
WorkspacePermission workspacePermission) {
WorkspacePermission workspacePermission,
ObservationRegistry observationRegistry) {
super(validator, repository, analyticsService);
this.policySolution = policySolution;
@ -114,6 +119,7 @@ public class ApplicationServiceCEImpl extends BaseService<ApplicationRepository,
this.userDataService = userDataService;
this.workspaceService = workspaceService;
this.workspacePermission = workspacePermission;
this.observationRegistry = observationRegistry;
}
@Override
@ -1042,6 +1048,8 @@ public class ApplicationServiceCEImpl extends BaseService<ApplicationRepository,
: applicationPermission.getEditPermission();
return findById(branchedApplicationId, permissionForApplication)
.name(APPLICATION_FETCH_FROM_DB)
.tap(Micrometer.observation(observationRegistry))
.switchIfEmpty(Mono.error(new AppsmithException(
AppsmithError.NO_RESOURCE_FOUND, FieldName.APPLICATION, branchedApplicationId)));
}

View File

@ -13,6 +13,7 @@ import com.appsmith.server.solutions.ApplicationPermission;
import com.appsmith.server.solutions.DatasourcePermission;
import com.appsmith.server.solutions.PolicySolution;
import com.appsmith.server.solutions.WorkspacePermission;
import io.micrometer.observation.ObservationRegistry;
import jakarta.validation.Validator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -34,7 +35,8 @@ public class ApplicationServiceImpl extends ApplicationServiceCECompatibleImpl i
SessionUserService sessionUserService,
UserDataService userDataService,
WorkspaceService workspaceService,
WorkspacePermission workspacePermission) {
WorkspacePermission workspacePermission,
ObservationRegistry observationRegistry) {
super(
validator,
repository,
@ -48,6 +50,7 @@ public class ApplicationServiceImpl extends ApplicationServiceCECompatibleImpl i
sessionUserService,
userDataService,
workspaceService,
workspacePermission);
workspacePermission,
observationRegistry);
}
}

View File

@ -79,6 +79,14 @@ import java.util.function.Function;
import java.util.stream.Collectors;
import static com.appsmith.external.constants.spans.ActionSpan.GET_ACTION_REPOSITORY_CALL;
import static com.appsmith.external.constants.spans.ce.ActionSpanCE.VIEW_MODE_FETCH_ACTIONS_FROM_DB;
import static com.appsmith.external.constants.spans.ce.ActionSpanCE.VIEW_MODE_FETCH_PLUGIN_FROM_DB;
import static com.appsmith.external.constants.spans.ce.ActionSpanCE.VIEW_MODE_FILTER_ACTION;
import static com.appsmith.external.constants.spans.ce.ActionSpanCE.VIEW_MODE_FINAL_ACTION;
import static com.appsmith.external.constants.spans.ce.ActionSpanCE.VIEW_MODE_INITIAL_ACTION;
import static com.appsmith.external.constants.spans.ce.ActionSpanCE.VIEW_MODE_SANITISE_ACTION;
import static com.appsmith.external.constants.spans.ce.ActionSpanCE.VIEW_MODE_SET_PLUGIN_ID_AND_TYPE_ACTION;
import static com.appsmith.external.constants.spans.ce.ActionSpanCE.VIEW_MODE_SET_PLUGIN_ID_AND_TYPE_JS;
import static com.appsmith.external.helpers.AppsmithBeanUtils.copyNestedNonNullProperties;
import static com.appsmith.external.helpers.PluginUtils.setValueSafelyInFormData;
import static com.appsmith.server.acl.AclPermission.EXECUTE_DATASOURCES;
@ -97,7 +105,6 @@ public class NewActionServiceCEImpl extends BaseService<NewActionRepository, New
public static final String NATIVE_QUERY_PATH_STATUS = NATIVE_QUERY_PATH + "." + STATUS;
public static final PluginType JS_PLUGIN_TYPE = PluginType.JS;
public static final String JS_PLUGIN_PACKAGE_NAME = "js-plugin";
protected final NewActionRepository repository;
private final DatasourceService datasourceService;
private final PluginService pluginService;
@ -731,6 +738,8 @@ public class NewActionServiceCEImpl extends BaseService<NewActionRepository, New
String applicationId, Boolean viewMode, AclPermission permission, Sort sort) {
return repository
.findByApplicationId(applicationId, permission, sort)
.name(VIEW_MODE_FETCH_ACTIONS_FROM_DB)
.tap(Micrometer.observation(observationRegistry))
// In case of view mode being true, filter out all the actions which haven't been published
.flatMap(action -> {
if (Boolean.TRUE.equals(viewMode)) {
@ -745,7 +754,11 @@ public class NewActionServiceCEImpl extends BaseService<NewActionRepository, New
return Mono.just(action);
})
.flatMap(this::sanitizeAction);
.name(VIEW_MODE_FILTER_ACTION)
.tap(Micrometer.observation(observationRegistry))
.flatMap(this::sanitizeAction)
.name(VIEW_MODE_SANITISE_ACTION)
.tap(Micrometer.observation(observationRegistry));
}
@Override
@ -782,8 +795,12 @@ public class NewActionServiceCEImpl extends BaseService<NewActionRepository, New
// fetch the published actions by applicationId
// No need to sort the results
return findAllByApplicationIdAndViewMode(applicationId, true, actionPermission.getExecutePermission(), null)
.name(VIEW_MODE_INITIAL_ACTION)
.tap(Micrometer.observation(observationRegistry))
.filter(newAction -> !PluginType.JS.equals(newAction.getPluginType()))
.map(action -> generateActionViewDTO(action, action.getPublishedAction(), true));
.map(action -> generateActionViewDTO(action, action.getPublishedAction(), true))
.name(VIEW_MODE_FINAL_ACTION)
.tap(Micrometer.observation(observationRegistry));
}
@Override
@ -1159,31 +1176,43 @@ public class NewActionServiceCEImpl extends BaseService<NewActionRepository, New
*/
Datasource datasource = actionDTO.getDatasource();
if (actionDTO.getCollectionId() != null) {
return setPluginIdAndTypeForJSAction(action);
return setPluginIdAndTypeForJSAction(action)
.name(VIEW_MODE_SET_PLUGIN_ID_AND_TYPE_JS)
.tap(Micrometer.observation(observationRegistry));
} else if (datasource != null && datasource.getPluginId() != null) {
String pluginId = datasource.getPluginId();
action.setPluginId(pluginId);
return setPluginTypeFromId(action, pluginId);
return setPluginTypeFromId(action, pluginId)
.name(VIEW_MODE_SET_PLUGIN_ID_AND_TYPE_ACTION)
.tap(Micrometer.observation(observationRegistry));
}
return Mono.just(action);
}
private Mono<NewAction> setPluginTypeFromId(NewAction action, String pluginId) {
return pluginService.findById(pluginId).flatMap(plugin -> {
action.setPluginType(plugin.getType());
return Mono.just(action);
});
return pluginService
.findById(pluginId)
.name(VIEW_MODE_FETCH_PLUGIN_FROM_DB)
.tap(Micrometer.observation(observationRegistry))
.flatMap(plugin -> {
action.setPluginType(plugin.getType());
return Mono.just(action);
});
}
private Mono<NewAction> setPluginIdAndTypeForJSAction(NewAction action) {
action.setPluginType(JS_PLUGIN_TYPE);
return pluginService.findByPackageName(JS_PLUGIN_PACKAGE_NAME).flatMap(plugin -> {
action.setPluginId(plugin.getId());
return Mono.just(action);
});
return pluginService
.findByPackageName(JS_PLUGIN_PACKAGE_NAME)
.name(VIEW_MODE_FETCH_PLUGIN_FROM_DB)
.tap(Micrometer.observation(observationRegistry))
.flatMap(plugin -> {
action.setPluginId(plugin.getId());
return Mono.just(action);
});
}
// We can afford to make this call all the time since we already have all the info we need in context

View File

@ -21,6 +21,7 @@ import com.appsmith.server.services.BaseService;
import com.appsmith.server.services.UserDataService;
import com.appsmith.server.solutions.ApplicationPermission;
import com.appsmith.server.solutions.PagePermission;
import io.micrometer.observation.ObservationRegistry;
import jakarta.validation.Validator;
import lombok.extern.slf4j.Slf4j;
import net.minidev.json.JSONObject;
@ -31,6 +32,7 @@ import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import reactor.core.observability.micrometer.Micrometer;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@ -44,6 +46,10 @@ import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import static com.appsmith.external.constants.spans.ce.PageSpanCE.FETCH_PAGE_FROM_DB;
import static com.appsmith.external.constants.spans.ce.PageSpanCE.GET_PAGE;
import static com.appsmith.external.constants.spans.ce.PageSpanCE.GET_PAGE_WITHOUT_BRANCH;
import static com.appsmith.external.constants.spans.ce.PageSpanCE.GET_PAGE_WITH_BRANCH;
import static com.appsmith.external.helpers.AppsmithBeanUtils.copyNewFieldValuesIntoOldObject;
import static com.appsmith.server.exceptions.AppsmithError.INVALID_PARAMETER;
@ -54,6 +60,7 @@ public class NewPageServiceCEImpl extends BaseService<NewPageRepository, NewPage
private final UserDataService userDataService;
private final ApplicationPermission applicationPermission;
private final PagePermission pagePermission;
private final ObservationRegistry observationRegistry;
@Autowired
public NewPageServiceCEImpl(
@ -63,12 +70,14 @@ public class NewPageServiceCEImpl extends BaseService<NewPageRepository, NewPage
ApplicationService applicationService,
UserDataService userDataService,
ApplicationPermission applicationPermission,
PagePermission pagePermission) {
PagePermission pagePermission,
ObservationRegistry observationRegistry) {
super(validator, repository, analyticsService);
this.applicationService = applicationService;
this.userDataService = userDataService;
this.applicationPermission = applicationPermission;
this.pagePermission = pagePermission;
this.observationRegistry = observationRegistry;
}
@Override
@ -107,7 +116,10 @@ public class NewPageServiceCEImpl extends BaseService<NewPageRepository, NewPage
@Override
public Mono<NewPage> findById(String pageId, AclPermission aclPermission) {
return repository.findById(pageId, aclPermission);
return repository
.findById(pageId, aclPermission)
.name(FETCH_PAGE_FROM_DB)
.tap(Micrometer.observation(observationRegistry));
}
@Override
@ -512,11 +524,15 @@ public class NewPageServiceCEImpl extends BaseService<NewPageRepository, NewPage
return Mono.error(new AppsmithException(AppsmithError.INVALID_PARAMETER, FieldName.PAGE_ID));
} else if (!StringUtils.hasText(branchName)) {
return this.findById(basePageId, permission)
.name(GET_PAGE_WITHOUT_BRANCH)
.tap(Micrometer.observation(observationRegistry))
.switchIfEmpty(Mono.error(
new AppsmithException(AppsmithError.NO_RESOURCE_FOUND, FieldName.PAGE, basePageId)));
}
return repository
.findPageByBranchNameAndBasePageId(branchName, basePageId, permission)
.name(GET_PAGE_WITH_BRANCH)
.tap(Micrometer.observation(observationRegistry))
.switchIfEmpty(Mono.error(new AppsmithException(
AppsmithError.NO_RESOURCE_FOUND, FieldName.PAGE, basePageId + ", " + branchName)));
}
@ -532,7 +548,9 @@ public class NewPageServiceCEImpl extends BaseService<NewPageRepository, NewPage
permission = pagePermission.getReadPermission();
}
return this.findByBranchNameAndBasePageId(branchName, basePageId, permission);
return this.findByBranchNameAndBasePageId(branchName, basePageId, permission)
.name(GET_PAGE)
.tap(Micrometer.observation(observationRegistry));
}
@Override

View File

@ -6,6 +6,7 @@ import com.appsmith.server.services.AnalyticsService;
import com.appsmith.server.services.UserDataService;
import com.appsmith.server.solutions.ApplicationPermission;
import com.appsmith.server.solutions.PagePermission;
import io.micrometer.observation.ObservationRegistry;
import jakarta.validation.Validator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -21,7 +22,8 @@ public class NewPageServiceImpl extends NewPageServiceCEImpl implements NewPageS
ApplicationService applicationService,
UserDataService userDataService,
ApplicationPermission applicationPermission,
PagePermission pagePermission) {
PagePermission pagePermission,
ObservationRegistry observationRegistry) {
super(
validator,
repository,
@ -29,6 +31,7 @@ public class NewPageServiceImpl extends NewPageServiceCEImpl implements NewPageS
applicationService,
userDataService,
applicationPermission,
pagePermission);
pagePermission,
observationRegistry);
}
}

View File

@ -1,6 +1,7 @@
package com.appsmith.server.repositories;
import com.appsmith.server.repositories.ce.CustomNewActionRepositoryCEImpl;
import io.micrometer.observation.ObservationRegistry;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.mongodb.core.ReactiveMongoOperations;
import org.springframework.stereotype.Component;
@ -10,7 +11,8 @@ import org.springframework.stereotype.Component;
public class CustomNewActionRepositoryImpl extends CustomNewActionRepositoryCEImpl
implements CustomNewActionRepository {
public CustomNewActionRepositoryImpl(ReactiveMongoOperations mongoOperations) {
super(mongoOperations);
public CustomNewActionRepositoryImpl(
ReactiveMongoOperations mongoOperations, ObservationRegistry observationRegistry) {
super(mongoOperations, observationRegistry);
}
}

View File

@ -1,6 +1,7 @@
package com.appsmith.server.repositories;
import com.appsmith.server.repositories.ce.CustomNewPageRepositoryCEImpl;
import io.micrometer.observation.ObservationRegistry;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
@ -9,7 +10,7 @@ import org.springframework.stereotype.Component;
@Slf4j
public class CustomNewPageRepositoryImpl extends CustomNewPageRepositoryCEImpl implements CustomNewPageRepository {
public CustomNewPageRepositoryImpl(MongoTemplate mongoTemplate) {
super(mongoTemplate);
public CustomNewPageRepositoryImpl(MongoTemplate mongoTemplate, ObservationRegistry observationRepository) {
super(mongoTemplate, observationRepository);
}
}

View File

@ -9,6 +9,7 @@ import com.appsmith.server.helpers.ce.bridge.Bridge;
import com.appsmith.server.helpers.ce.bridge.BridgeQuery;
import com.appsmith.server.helpers.ce.bridge.BridgeUpdate;
import com.appsmith.server.repositories.BaseAppsmithRepositoryImpl;
import io.micrometer.observation.ObservationRegistry;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.bson.types.ObjectId;
@ -21,6 +22,7 @@ import org.springframework.data.mongodb.core.aggregation.GroupOperation;
import org.springframework.data.mongodb.core.aggregation.MatchOperation;
import org.springframework.data.mongodb.core.aggregation.ProjectionOperation;
import org.springframework.data.mongodb.core.query.Criteria;
import reactor.core.observability.micrometer.Micrometer;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@ -29,6 +31,7 @@ import java.util.List;
import java.util.Optional;
import java.util.Set;
import static com.appsmith.external.constants.spans.ce.ActionSpanCE.VIEW_MODE_FETCH_ACTIONS_FROM_DB_QUERY;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.group;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.match;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation;
@ -42,12 +45,16 @@ public class CustomNewActionRepositoryCEImpl extends BaseAppsmithRepositoryImpl<
private final ReactiveMongoOperations mongoOperations;
private final ObservationRegistry observationRegistry;
@Override
public Flux<NewAction> findByApplicationId(String applicationId, AclPermission aclPermission) {
return queryBuilder()
.criteria(getCriterionForFindByApplicationId(applicationId))
.permission(aclPermission)
.all();
.all()
.name(VIEW_MODE_FETCH_ACTIONS_FROM_DB_QUERY)
.tap(Micrometer.observation(observationRegistry));
}
@Override

View File

@ -10,6 +10,7 @@ import com.appsmith.server.helpers.ce.bridge.BridgeQuery;
import com.appsmith.server.helpers.ce.bridge.BridgeUpdate;
import com.appsmith.server.projections.IdOnly;
import com.appsmith.server.repositories.BaseAppsmithRepositoryImpl;
import io.micrometer.observation.ObservationRegistry;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.mongodb.core.MongoTemplate;
@ -17,6 +18,7 @@ import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.Fields;
import org.springframework.data.mongodb.core.query.Criteria;
import reactor.core.observability.micrometer.Micrometer;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;
@ -26,6 +28,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import static com.appsmith.external.constants.spans.ce.PageSpanCE.FETCH_PAGE_FROM_DB;
import static com.appsmith.external.helpers.StringUtils.dotted;
import static org.springframework.data.mongodb.core.query.Criteria.where;
@ -35,6 +38,7 @@ public class CustomNewPageRepositoryCEImpl extends BaseAppsmithRepositoryImpl<Ne
implements CustomNewPageRepositoryCE {
private final MongoTemplate mongoTemplate;
private final ObservationRegistry observationRegistry;
@Override
public Flux<NewPage> findByApplicationId(String applicationId, AclPermission aclPermission) {
@ -160,7 +164,12 @@ public class CustomNewPageRepositoryCEImpl extends BaseAppsmithRepositoryImpl<Ne
q.isNull(NewPage.Fields.branchName);
}
return queryBuilder().criteria(q).permission(permission).one();
return queryBuilder()
.criteria(q)
.permission(permission)
.one()
.name(FETCH_PAGE_FROM_DB)
.tap(Micrometer.observation(observationRegistry));
}
public Mono<String> findBranchedPageId(String branchName, String defaultPageId, AclPermission permission) {

View File

@ -277,6 +277,8 @@ public class ConsolidatedAPIServiceCEImpl implements ConsolidatedAPIServiceCE {
if (isViewMode) {
/* Get list of all actions in view mode */
fetches.add(branchedApplicationMonoCached
.name(getQualifiedSpanName(APPLICATION_ID_SPAN, mode))
.tap(Micrometer.observation(observationRegistry))
.flatMap(branchedApplication -> newActionService
.getActionsForViewMode(branchedApplication.getId())
.collectList())

View File

@ -13,6 +13,7 @@ import com.appsmith.server.solutions.ApplicationPermission;
import com.appsmith.server.solutions.DatasourcePermission;
import com.appsmith.server.solutions.PolicySolution;
import com.appsmith.server.solutions.WorkspacePermission;
import io.micrometer.observation.ObservationRegistry;
import jakarta.validation.Validator;
import org.springframework.stereotype.Service;
@ -32,7 +33,8 @@ public class ApplicationServiceCECompatibleImpl extends ApplicationServiceCEImpl
SessionUserService sessionUserService,
UserDataService userDataService,
WorkspaceService workspaceService,
WorkspacePermission workspacePermission) {
WorkspacePermission workspacePermission,
ObservationRegistry observationRegistry) {
super(
validator,
repository,
@ -46,6 +48,7 @@ public class ApplicationServiceCECompatibleImpl extends ApplicationServiceCEImpl
sessionUserService,
userDataService,
workspaceService,
workspacePermission);
workspacePermission,
observationRegistry);
}
}