diff --git a/app/server/appsmith-server/pom.xml b/app/server/appsmith-server/pom.xml index 5aa1316f38..925cbae4b4 100644 --- a/app/server/appsmith-server/pom.xml +++ b/app/server/appsmith-server/pom.xml @@ -41,6 +41,12 @@ + + io.projectreactor + reactor-tools + 3.6.0 + original + io.opentelemetry opentelemetry-api diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/ServerApplication.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/ServerApplication.java index 43195d4702..af8cd30311 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/ServerApplication.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/ServerApplication.java @@ -4,6 +4,7 @@ import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.aop.ObservedAspect; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.boot.Banner; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -11,14 +12,26 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.EnableScheduling; +import reactor.tools.agent.ReactorDebugAgent; import static com.appsmith.server.constants.EnvVariables.APPSMITH_NEW_RELIC_ACCOUNT_ENABLE; +import static com.appsmith.server.constants.EnvVariables.APPSMITH_VERBOSE_LOGGING_ENABLED; @SpringBootApplication @EnableScheduling +@Slf4j public class ServerApplication { public static void main(String[] args) { + String loggingEnabled = System.getenv(String.valueOf(APPSMITH_VERBOSE_LOGGING_ENABLED)); + + if ("true".equalsIgnoreCase(loggingEnabled)) { + log.info("Enabling Reactor Debug Agent enabled"); + ReactorDebugAgent.init(); + } else { + log.info("Reactor Debug Agent not enabled"); + } + new SpringApplicationBuilder(ServerApplication.class) .bannerMode(Banner.Mode.OFF) .run(args); diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/performancelogging/PerformanceLoggingHandler.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/performancelogging/PerformanceLoggingHandler.java index b9be134421..024f2c7723 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/performancelogging/PerformanceLoggingHandler.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/performancelogging/PerformanceLoggingHandler.java @@ -1,5 +1,6 @@ package com.appsmith.server.performancelogging; +import io.micrometer.common.KeyValue; import io.micrometer.observation.Observation; import io.micrometer.observation.Observation.Context; import io.micrometer.observation.ObservationHandler; @@ -7,13 +8,44 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Component; +import java.lang.management.ManagementFactory; +import java.lang.management.MemoryMXBean; + @Component @Slf4j @ConditionalOnExpression("${logging.verbose.enabled}") class PerformanceLoggingHandler implements ObservationHandler { @Override public void onStart(Context context) { - context.put("executionTime", System.currentTimeMillis()); + if (needsLogStatement(context)) { + context.put("executionTime", System.currentTimeMillis()); + + KeyValue url = context.getHighCardinalityKeyValue("http.url"); + String urlName = url == null ? "null" : url.getValue(); + log.info("Execution Started : {}, Context : {}, {}", context.getName(), urlName, memoryFootprint()); + } + } + + private String memoryFootprint() { + MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); + + return String.format( + "Initial memory: %.2f GB, Used heap memory: %.2f GB, Max heap memory: %.2f GB, Committed memory: %.2f GB", + (double) memoryMXBean.getHeapMemoryUsage().getInit() / 1073741824, + (double) memoryMXBean.getHeapMemoryUsage().getUsed() / 1073741824, + (double) memoryMXBean.getHeapMemoryUsage().getMax() / 1073741824, + (double) memoryMXBean.getHeapMemoryUsage().getCommitted() / 1073741824); + } + + private Boolean needsLogStatement(Context context) { + String name = context.getName(); + if (name.equals("spring.security.authorizations") + || name.equals("spring.security.filterchains") + || name.equals("spring.security.http.secured.requests")) { + return false; + } else { + return true; + } } @Override @@ -23,13 +55,20 @@ class PerformanceLoggingHandler implements ObservationHandler