From 53548282cedbbe040c64501cbb45bd22b621464b Mon Sep 17 00:00:00 2001 From: Pankaj Agrawal Date: Tue, 27 Jul 2021 14:43:23 +0200 Subject: [PATCH] chore: Logging and SQS utility Optimisations (#484) * fix: logging optimisations to reduce unnecessary logics and inits * fix: lazy load sqs client Co-authored-by: Pankaj Agrawal --- .../core/internal/LambdaHandlerProcessor.java | 8 +++---- .../powertools/logging/LoggingUtils.java | 6 ++++- .../logging/internal/LambdaLoggingAspect.java | 24 ++++++++++++------- .../metrics/internal/LambdaMetricsAspect.java | 11 +++++---- .../lambda/powertools/sqs/SqsUtils.java | 6 ++++- 5 files changed, 37 insertions(+), 18 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..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 @@ -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 extractedContext = extractContext(pjp); + + if(null != extractedContext) { + appendKeys(DefaultLambdaFields.values(extractedContext)); + 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..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 @@ -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 extractedContext = extractContext(pjp); + + if( null != extractedContext) { + coldStartSingleMetricIfApplicable(extractedContext.getAwsRequestId(), extractedContext.getFunctionName(), metrics); + logger.putProperty(REQUEST_ID_PROPERTY, extractedContext.getAwsRequestId()); + } LambdaHandlerProcessor.getXrayTraceId() .ifPresent(traceId -> logger.putProperty(TRACE_ID_PROPERTY, traceId)); 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()) {