diff --git a/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/constants/spans/TenantSpan.java b/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/constants/spans/TenantSpan.java new file mode 100644 index 000000000000..5aeaf78f9971 --- /dev/null +++ b/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/constants/spans/TenantSpan.java @@ -0,0 +1,10 @@ +package com.appsmith.external.constants.spans; + +import static com.appsmith.external.constants.spans.BaseSpan.APPSMITH_SPAN_PREFIX; + +public class TenantSpan { + public static final String FETCH_DEFAULT_TENANT_SPAN = APPSMITH_SPAN_PREFIX + "fetch_default_tenant"; + public static final String FETCH_TENANT_CACHE_POST_DESERIALIZATION_ERROR_SPAN = + APPSMITH_SPAN_PREFIX + "fetch_tenant_cache_post_deserialization_error"; + public static final String FETCH_TENANT_FROM_DB_SPAN = APPSMITH_SPAN_PREFIX + "fetch_tenant_from_db"; +} diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/CacheableRepositoryHelperImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/CacheableRepositoryHelperImpl.java index ed91d3b62139..aa018f297e5a 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/CacheableRepositoryHelperImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/CacheableRepositoryHelperImpl.java @@ -2,6 +2,7 @@ import com.appsmith.server.helpers.InMemoryCacheableRepositoryHelper; import com.appsmith.server.repositories.ce_compatible.CacheableRepositoryHelperCECompatibleImpl; +import io.micrometer.observation.ObservationRegistry; import org.springframework.data.mongodb.core.ReactiveMongoOperations; import org.springframework.stereotype.Component; @@ -11,7 +12,8 @@ public class CacheableRepositoryHelperImpl extends CacheableRepositoryHelperCECo public CacheableRepositoryHelperImpl( ReactiveMongoOperations mongoOperations, - InMemoryCacheableRepositoryHelper inMemoryCacheableRepositoryHelper) { - super(mongoOperations, inMemoryCacheableRepositoryHelper); + InMemoryCacheableRepositoryHelper inMemoryCacheableRepositoryHelper, + ObservationRegistry observationRegistry) { + super(mongoOperations, inMemoryCacheableRepositoryHelper, observationRegistry); } } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CacheableRepositoryHelperCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CacheableRepositoryHelperCEImpl.java index 9db94b33ccf5..b2eaf8bdc12e 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CacheableRepositoryHelperCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CacheableRepositoryHelperCEImpl.java @@ -14,16 +14,19 @@ import com.appsmith.server.helpers.InMemoryCacheableRepositoryHelper; import com.appsmith.server.helpers.ce.bridge.Bridge; import com.appsmith.server.helpers.ce.bridge.BridgeQuery; +import io.micrometer.observation.ObservationRegistry; import lombok.extern.slf4j.Slf4j; import net.minidev.json.JSONObject; import org.springframework.data.mongodb.core.ReactiveMongoOperations; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Component; +import reactor.core.observability.micrometer.Micrometer; import reactor.core.publisher.Mono; import java.util.Set; import java.util.stream.Collectors; +import static com.appsmith.external.constants.spans.TenantSpan.FETCH_TENANT_FROM_DB_SPAN; import static com.appsmith.server.constants.FieldName.PERMISSION_GROUP_ID; import static com.appsmith.server.constants.ce.FieldNameCE.ANONYMOUS_USER; import static com.appsmith.server.constants.ce.FieldNameCE.DEFAULT_PERMISSION_GROUP; @@ -35,12 +38,15 @@ public class CacheableRepositoryHelperCEImpl implements CacheableRepositoryHelperCE { private final ReactiveMongoOperations mongoOperations; private final InMemoryCacheableRepositoryHelper inMemoryCacheableRepositoryHelper; + private final ObservationRegistry observationRegistry; public CacheableRepositoryHelperCEImpl( ReactiveMongoOperations mongoOperations, - InMemoryCacheableRepositoryHelper inMemoryCacheableRepositoryHelper) { + InMemoryCacheableRepositoryHelper inMemoryCacheableRepositoryHelper, + ObservationRegistry observationRegistry) { this.mongoOperations = mongoOperations; this.inMemoryCacheableRepositoryHelper = inMemoryCacheableRepositoryHelper; + this.observationRegistry = observationRegistry; } @Cache(cacheName = "permissionGroupsForUser", key = "{#user.email + #user.tenantId}") @@ -182,13 +188,17 @@ public Mono fetchDefaultTenant(String tenantId) { BridgeQuery andCriteria = Bridge.and(defaultTenantCriteria, notDeletedCriteria); Query query = new Query(); query.addCriteria(andCriteria); - - return mongoOperations.findOne(query, Tenant.class).map(tenant -> { - if (tenant.getTenantConfiguration() == null) { - tenant.setTenantConfiguration(new TenantConfiguration()); - } - return tenant; - }); + log.info("FETCHING TENANT FROM DATABASE AS NOT PRESENT IN CACHE!"); + return mongoOperations + .findOne(query, Tenant.class) + .map(tenant -> { + if (tenant.getTenantConfiguration() == null) { + tenant.setTenantConfiguration(new TenantConfiguration()); + } + return tenant; + }) + .name(FETCH_TENANT_FROM_DB_SPAN) + .tap(Micrometer.observation(observationRegistry)); } @CacheEvict(cacheName = "tenant", key = "{#tenantId}") diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce_compatible/CacheableRepositoryHelperCECompatibleImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce_compatible/CacheableRepositoryHelperCECompatibleImpl.java index d7c0f10cfade..2bdef88fc9bb 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce_compatible/CacheableRepositoryHelperCECompatibleImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce_compatible/CacheableRepositoryHelperCECompatibleImpl.java @@ -2,6 +2,7 @@ import com.appsmith.server.helpers.InMemoryCacheableRepositoryHelper; import com.appsmith.server.repositories.ce.CacheableRepositoryHelperCEImpl; +import io.micrometer.observation.ObservationRegistry; import lombok.extern.slf4j.Slf4j; import org.springframework.data.mongodb.core.ReactiveMongoOperations; import org.springframework.stereotype.Component; @@ -12,7 +13,8 @@ public class CacheableRepositoryHelperCECompatibleImpl extends CacheableReposito implements CacheableRepositoryHelperCECompatible { public CacheableRepositoryHelperCECompatibleImpl( ReactiveMongoOperations mongoOperations, - InMemoryCacheableRepositoryHelper inMemoryCacheableRepositoryHelper) { - super(mongoOperations, inMemoryCacheableRepositoryHelper); + InMemoryCacheableRepositoryHelper inMemoryCacheableRepositoryHelper, + ObservationRegistry observationRegistry) { + super(mongoOperations, inMemoryCacheableRepositoryHelper, observationRegistry); } } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/TenantServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/TenantServiceImpl.java index 94b62d21d064..fba38e745aad 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/TenantServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/TenantServiceImpl.java @@ -6,6 +6,7 @@ import com.appsmith.server.repositories.TenantRepository; import com.appsmith.server.services.ce.TenantServiceCEImpl; import com.appsmith.server.solutions.EnvManager; +import io.micrometer.observation.ObservationRegistry; import jakarta.validation.Validator; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -23,7 +24,8 @@ public TenantServiceImpl( @Lazy EnvManager envManager, FeatureFlagMigrationHelper featureFlagMigrationHelper, CacheableRepositoryHelper cacheableRepositoryHelper, - CommonConfig commonConfig) { + CommonConfig commonConfig, + ObservationRegistry observationRegistry) { super( validator, repository, @@ -32,6 +34,7 @@ public TenantServiceImpl( envManager, featureFlagMigrationHelper, cacheableRepositoryHelper, - commonConfig); + commonConfig, + observationRegistry); } } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/TenantServiceCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/TenantServiceCEImpl.java index 7d3a02439af2..d37b761f1aba 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/TenantServiceCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/TenantServiceCEImpl.java @@ -19,14 +19,18 @@ import com.appsmith.server.services.BaseService; import com.appsmith.server.services.ConfigService; import com.appsmith.server.solutions.EnvManager; +import io.micrometer.observation.ObservationRegistry; import jakarta.validation.Validator; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.util.StringUtils; +import reactor.core.observability.micrometer.Micrometer; import reactor.core.publisher.Mono; import java.util.Map; +import static com.appsmith.external.constants.spans.TenantSpan.FETCH_DEFAULT_TENANT_SPAN; +import static com.appsmith.external.constants.spans.TenantSpan.FETCH_TENANT_CACHE_POST_DESERIALIZATION_ERROR_SPAN; import static com.appsmith.server.acl.AclPermission.MANAGE_TENANT; import static java.lang.Boolean.TRUE; @@ -44,6 +48,7 @@ public class TenantServiceCEImpl extends BaseService getDefaultTenant() { // Fetching Tenant from redis cache return getDefaultTenantId() .flatMap(tenantId -> cacheableRepositoryHelper.fetchDefaultTenant(tenantId)) + .name(FETCH_DEFAULT_TENANT_SPAN) + .tap(Micrometer.observation(observationRegistry)) .flatMap(tenant -> repository.setUserPermissionsInObject(tenant).switchIfEmpty(Mono.just(tenant))) .onErrorResume(e -> { log.error("Error fetching default tenant from redis!", e); @@ -191,6 +200,8 @@ public Mono getDefaultTenant() { } return tenant; })) + .name(FETCH_TENANT_CACHE_POST_DESERIALIZATION_ERROR_SPAN) + .tap(Micrometer.observation(observationRegistry)) .flatMap(tenant -> repository .setUserPermissionsInObject(tenant) .switchIfEmpty(Mono.just(tenant)));