From 3fd8bb51c770324360112f7ad70daae084f22c7e Mon Sep 17 00:00:00 2001 From: Pankaj Agrawal Date: Mon, 26 Jul 2021 18:51:53 +0200 Subject: [PATCH 1/2] fix: logging optimisations to reduce unnecessary logics and inits --- .../core/internal/LambdaHandlerProcessor.java | 8 +++---- .../powertools/logging/LoggingUtils.java | 6 ++++- .../logging/internal/LambdaLoggingAspect.java | 24 ++++++++++++------- .../metrics/internal/LambdaMetricsAspect.java | 11 +++++---- 4 files changed, 32 insertions(+), 17 deletions(-) diff --git a/powertools-core/src/main/java/software/amazon/lambda/powertools/core/internal/LambdaHandlerProcessor.java b/powertools-core/src/main/java/software/amazon/lambda/powertools/core/internal/LambdaHandlerProcessor.java index 02e06dd29..ffe889db9 100644 --- a/powertools-core/src/main/java/software/amazon/lambda/powertools/core/internal/LambdaHandlerProcessor.java +++ b/powertools-core/src/main/java/software/amazon/lambda/powertools/core/internal/LambdaHandlerProcessor.java @@ -56,19 +56,19 @@ public static boolean placedOnStreamHandler(final ProceedingJoinPoint pjp) { && pjp.getArgs()[2] instanceof Context; } - public static Optional extractContext(final ProceedingJoinPoint pjp) { + public static Context extractContext(final ProceedingJoinPoint pjp) { if (isHandlerMethod(pjp)) { if (placedOnRequestHandler(pjp)) { - return of((Context) pjp.getArgs()[1]); + return (Context) pjp.getArgs()[1]; } if (placedOnStreamHandler(pjp)) { - return of((Context) pjp.getArgs()[2]); + return (Context) pjp.getArgs()[2]; } } - return empty(); + return null; } public static String serviceName() { diff --git a/powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/LoggingUtils.java b/powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/LoggingUtils.java index 29f983cb2..f23e274d4 100644 --- a/powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/LoggingUtils.java +++ b/powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/LoggingUtils.java @@ -26,7 +26,7 @@ * {@see Logging} */ public final class LoggingUtils { - private static ObjectMapper objectMapper = new ObjectMapper(); + private static ObjectMapper objectMapper; private LoggingUtils() { } @@ -93,6 +93,10 @@ public static void defaultObjectMapper(ObjectMapper objectMapper) { } public static ObjectMapper objectMapper() { + if(null == objectMapper) { + objectMapper = new ObjectMapper(); + } + return objectMapper; } } diff --git a/powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/internal/LambdaLoggingAspect.java b/powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/internal/LambdaLoggingAspect.java index 74da2a8ce..7956890cc 100644 --- a/powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/internal/LambdaLoggingAspect.java +++ b/powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/internal/LambdaLoggingAspect.java @@ -23,6 +23,7 @@ import java.util.Optional; import java.util.Random; +import com.amazonaws.services.lambda.runtime.Context; import com.fasterxml.jackson.core.JsonPointer; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; @@ -85,12 +86,13 @@ public Object around(ProceedingJoinPoint pjp, setLogLevelBasedOnSamplingRate(pjp, logging); - extractContext(pjp) - .ifPresent(context -> { - appendKeys(DefaultLambdaFields.values(context)); - appendKey("coldStart", isColdStart() ? "true" : "false"); - appendKey("service", serviceName()); - }); + Context extractContext = extractContext(pjp); + + if(null != extractContext) { + appendKeys(DefaultLambdaFields.values(extractContext)); + appendKey("coldStart", isColdStart() ? "true" : "false"); + appendKey("service", serviceName()); + } getXrayTraceId().ifPresent(xRayTraceId -> appendKey("xray_trace_id", xRayTraceId)); @@ -120,9 +122,9 @@ private static void resetLogLevels(Level logLevel) { private void setLogLevelBasedOnSamplingRate(final ProceedingJoinPoint pjp, final Logging logging) { + double samplingRate = samplingRate(logging); + if (isHandlerMethod(pjp)) { - float sample = SAMPLER.nextFloat(); - double samplingRate = samplingRate(logging); if (samplingRate < 0 || samplingRate > 1) { LOG.debug("Skipping sampling rate configuration because of invalid value. Sampling rate: {}", samplingRate); @@ -131,6 +133,12 @@ private void setLogLevelBasedOnSamplingRate(final ProceedingJoinPoint pjp, appendKey("samplingRate", String.valueOf(samplingRate)); + if (samplingRate == 0) { + return; + } + + float sample = SAMPLER.nextFloat(); + if (samplingRate > sample) { resetLogLevels(Level.DEBUG); diff --git a/powertools-metrics/src/main/java/software/amazon/lambda/powertools/metrics/internal/LambdaMetricsAspect.java b/powertools-metrics/src/main/java/software/amazon/lambda/powertools/metrics/internal/LambdaMetricsAspect.java index f429c52e7..8268c33fc 100644 --- a/powertools-metrics/src/main/java/software/amazon/lambda/powertools/metrics/internal/LambdaMetricsAspect.java +++ b/powertools-metrics/src/main/java/software/amazon/lambda/powertools/metrics/internal/LambdaMetricsAspect.java @@ -2,6 +2,7 @@ import java.lang.reflect.Field; +import com.amazonaws.services.lambda.runtime.Context; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @@ -53,10 +54,12 @@ public Object around(ProceedingJoinPoint pjp, logger.setNamespace(namespace(metrics)); - extractContext(pjp).ifPresent((context) -> { - coldStartSingleMetricIfApplicable(context.getAwsRequestId(), context.getFunctionName(), metrics); - logger.putProperty(REQUEST_ID_PROPERTY, context.getAwsRequestId()); - }); + Context extractContext = extractContext(pjp); + + if( null != extractContext) { + coldStartSingleMetricIfApplicable(extractContext.getAwsRequestId(), extractContext.getFunctionName(), metrics); + logger.putProperty(REQUEST_ID_PROPERTY, extractContext.getAwsRequestId()); + } LambdaHandlerProcessor.getXrayTraceId() .ifPresent(traceId -> logger.putProperty(TRACE_ID_PROPERTY, traceId)); From 73b1820e6eca05223748f39843fde8317ff572b4 Mon Sep 17 00:00:00 2001 From: Pankaj Agrawal Date: Mon, 26 Jul 2021 18:53:21 +0200 Subject: [PATCH 2/2] fix: lazy load sqs client --- .../powertools/logging/internal/LambdaLoggingAspect.java | 6 +++--- .../powertools/metrics/internal/LambdaMetricsAspect.java | 8 ++++---- .../software/amazon/lambda/powertools/sqs/SqsUtils.java | 6 +++++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/internal/LambdaLoggingAspect.java b/powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/internal/LambdaLoggingAspect.java index 7956890cc..8f37377e1 100644 --- a/powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/internal/LambdaLoggingAspect.java +++ b/powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/internal/LambdaLoggingAspect.java @@ -86,10 +86,10 @@ public Object around(ProceedingJoinPoint pjp, setLogLevelBasedOnSamplingRate(pjp, logging); - Context extractContext = extractContext(pjp); + Context extractedContext = extractContext(pjp); - if(null != extractContext) { - appendKeys(DefaultLambdaFields.values(extractContext)); + if(null != extractedContext) { + appendKeys(DefaultLambdaFields.values(extractedContext)); appendKey("coldStart", isColdStart() ? "true" : "false"); appendKey("service", serviceName()); } diff --git a/powertools-metrics/src/main/java/software/amazon/lambda/powertools/metrics/internal/LambdaMetricsAspect.java b/powertools-metrics/src/main/java/software/amazon/lambda/powertools/metrics/internal/LambdaMetricsAspect.java index 8268c33fc..09fd5d87d 100644 --- a/powertools-metrics/src/main/java/software/amazon/lambda/powertools/metrics/internal/LambdaMetricsAspect.java +++ b/powertools-metrics/src/main/java/software/amazon/lambda/powertools/metrics/internal/LambdaMetricsAspect.java @@ -54,11 +54,11 @@ public Object around(ProceedingJoinPoint pjp, logger.setNamespace(namespace(metrics)); - Context extractContext = extractContext(pjp); + Context extractedContext = extractContext(pjp); - if( null != extractContext) { - coldStartSingleMetricIfApplicable(extractContext.getAwsRequestId(), extractContext.getFunctionName(), metrics); - logger.putProperty(REQUEST_ID_PROPERTY, extractContext.getAwsRequestId()); + if( null != extractedContext) { + coldStartSingleMetricIfApplicable(extractedContext.getAwsRequestId(), extractedContext.getFunctionName(), metrics); + logger.putProperty(REQUEST_ID_PROPERTY, extractedContext.getAwsRequestId()); } LambdaHandlerProcessor.getXrayTraceId() diff --git a/powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/SqsUtils.java b/powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/SqsUtils.java index 2f9c21286..756d4f109 100644 --- a/powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/SqsUtils.java +++ b/powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/SqsUtils.java @@ -41,7 +41,7 @@ public final class SqsUtils { private static final Logger LOG = LoggerFactory.getLogger(SqsUtils.class); private static final ObjectMapper objectMapper = new ObjectMapper(); - private static SqsClient client = SqsClient.create(); + private static SqsClient client; private SqsUtils() { } @@ -231,6 +231,10 @@ public static List batchProcessor(final SQSEvent event, final SqsMessageHandler handler) { final List handlerReturn = new ArrayList<>(); + if(client == null) { + client = SqsClient.create(); + } + BatchContext batchContext = new BatchContext(client); for (SQSMessage message : event.getRecords()) {