diff --git a/README.md b/README.md index 68827a999..c4b38a5e9 100644 --- a/README.md +++ b/README.md @@ -17,17 +17,17 @@ Powertools is available in Maven Central. You can use your favourite dependency software.amazon.lambda powertools-tracing - 1.12.3 + 2.0.0-beta software.amazon.lambda powertools-logging - 1.12.3 + 2.0.0-beta software.amazon.lambda powertools-metrics - 1.12.3 + 2.0.0-beta ... diff --git a/docs/core/metrics.md b/docs/core/metrics.md index 4d250df48..65aecf680 100644 --- a/docs/core/metrics.md +++ b/docs/core/metrics.md @@ -89,8 +89,12 @@ You can create metrics using `putMetric`, and manually create dimensions for all @Override @Metrics(namespace = "ExampleApplication", service = "booking") public Object handleRequest(Object input, Context context) { - metricsLogger.putDimensions(DimensionSet.of("environment", "prod")); - metricsLogger.putMetric("SuccessfulBooking", 1, Unit.COUNT); + try { + metricsLogger.putDimensions(DimensionSet.of("environment", "prod")); + metricsLogger.putMetric("SuccessfulBooking", 1, Unit.COUNT); + } catch (InvalidDimensionException | InvalidMetricException | DimensionSetExceededException e) { + LOG.error(e); + } ... } } @@ -173,8 +177,12 @@ You can use `putMetadata` for advanced use cases, where you want to metadata as @Override @Metrics(namespace = "ServerlessAirline", service = "payment") public Object handleRequest(Object input, Context context) { - metricsLogger().putMetric("CustomMetric1", 1, Unit.COUNT); - metricsLogger().putMetadata("booking_id", "1234567890"); + try { + metricsLogger().putMetadata("booking_id", "1234567890"); + metricsLogger().putMetric("CustomMetric1", 1, Unit.COUNT); + } catch (InvalidMetricException e) { + throw new RuntimeException(e); + } ... } } @@ -199,7 +207,11 @@ Dimension, it can be done via `#!java MetricsUtils.defaultDimensions()`. MetricsLogger metricsLogger = MetricsUtils.metricsLogger(); static { - MetricsUtils.defaultDimensions(DimensionSet.of("CustomDimension", "booking")); + try { + MetricsUtils.defaultDimensions(DimensionSet.of("CustomDimension", "booking")); + } catch (InvalidDimensionException | DimensionSetExceededException e) { + throw new RuntimeException(e); + } } @Override @@ -228,8 +240,12 @@ CloudWatch EMF uses the same dimensions across all your metrics. Use `withSingle @Override public Object handleRequest(Object input, Context context) { - withSingleMetric("CustomMetrics2", 1, Unit.COUNT, "Another", (metric) -> { - metric.setDimensions(DimensionSet.of("AnotherService", "CustomService")); + withSingleMetric("CustomMetrics2", 1, Unit.COUNT, "Another", (metric) -> { + try { + metric.setDimensions(DimensionSet.of("AnotherService", "CustomService")); + } catch (InvalidDimensionException | DimensionSetExceededException e) { + throw new RuntimeException(e); + } }); } } diff --git a/docs/utilities/sqs_large_message_handling.md b/docs/utilities/sqs_large_message_handling.md index 95dc34e35..65c4b7b4d 100644 --- a/docs/utilities/sqs_large_message_handling.md +++ b/docs/utilities/sqs_large_message_handling.md @@ -144,7 +144,7 @@ To disable deletion of payloads setting the following annotation parameter: ## Utility If you want to avoid using annotation and have control over error that can happen during payload enrichment use `SqsUtils.enrichedMessageFromS3()`. -It provides you access with list of `SQSMessage` object enriched from S3 payload. +It provides you access with a list of `SQSMessage` object enriched from S3 payload. Original `SQSEvent` object is never mutated. You can also control if the S3 payload should be deleted after successful processing. diff --git a/mkdocs.yml b/mkdocs.yml index 574b8b30a..d9ccf4f69 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -76,7 +76,7 @@ extra_javascript: extra: powertools: - version: 1.12.3 + version: 2.0.0-beta repo_url: https://github.com/awslabs/aws-lambda-powertools-java edit_uri: edit/master/docs diff --git a/pom.xml b/pom.xml index b9dfd769f..670febd95 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ software.amazon.lambda powertools-parent - 1.12.3 + 2.0.0-beta pom AWS Lambda Powertools for Java library Parent @@ -56,13 +56,13 @@ 1.8 1.8 2.19.0 - 2.13.4.2 + 2.14.1 1.9.7 - 2.18.9 - 2.12.0 + 2.18.22 + 2.13.0 2.1.2 UTF-8 - 1.2.1 + 1.2.2 3.11.0 1.0.0 3.10.1 @@ -75,7 +75,7 @@ 3.2.1 3.0.1 5.9.1 - 1.0.6 + 4.0.3 0.5.1 @@ -244,13 +244,13 @@ org.mockito mockito-core - 4.8.1 + 4.9.0 test org.mockito mockito-inline - 4.8.1 + 4.9.0 test @@ -457,7 +457,7 @@ com.github.spotbugs spotbugs-maven-plugin - 4.7.2.1 + 4.7.3.0 test diff --git a/powertools-cloudformation/pom.xml b/powertools-cloudformation/pom.xml index 2547e717e..bfb931f09 100644 --- a/powertools-cloudformation/pom.xml +++ b/powertools-cloudformation/pom.xml @@ -10,7 +10,7 @@ powertools-parent software.amazon.lambda - 1.12.3 + 2.0.0-beta AWS Lambda Powertools for Java library Cloudformation diff --git a/powertools-core/pom.xml b/powertools-core/pom.xml index f54c24e12..025775e4d 100644 --- a/powertools-core/pom.xml +++ b/powertools-core/pom.xml @@ -10,7 +10,7 @@ powertools-parent software.amazon.lambda - 1.12.3 + 2.0.0-beta AWS Lambda Powertools for Java library Core diff --git a/powertools-idempotency/pom.xml b/powertools-idempotency/pom.xml index 632619d45..06e776971 100644 --- a/powertools-idempotency/pom.xml +++ b/powertools-idempotency/pom.xml @@ -7,7 +7,7 @@ software.amazon.lambda powertools-parent - 1.12.3 + 2.0.0-beta powertools-idempotency @@ -91,7 +91,7 @@ org.junit-pioneer junit-pioneer - 1.7.1 + 1.9.0 test diff --git a/powertools-logging/pom.xml b/powertools-logging/pom.xml index 59a98b4a9..a9df2ef0e 100644 --- a/powertools-logging/pom.xml +++ b/powertools-logging/pom.xml @@ -10,7 +10,7 @@ powertools-parent software.amazon.lambda - 1.12.3 + 2.0.0-beta AWS Lambda Powertools for Java library Logging diff --git a/powertools-metrics/pom.xml b/powertools-metrics/pom.xml index 1f83a6c19..dbc05b2f5 100644 --- a/powertools-metrics/pom.xml +++ b/powertools-metrics/pom.xml @@ -10,7 +10,7 @@ powertools-parent software.amazon.lambda - 1.12.3 + 2.0.0-beta AWS Lambda Powertools for Java library Metrics diff --git a/powertools-metrics/src/main/java/software/amazon/cloudwatchlogs/emf/model/MetricsLoggerHelper.java b/powertools-metrics/src/main/java/software/amazon/cloudwatchlogs/emf/model/MetricsLoggerHelper.java index f59658e9c..30d443fce 100644 --- a/powertools-metrics/src/main/java/software/amazon/cloudwatchlogs/emf/model/MetricsLoggerHelper.java +++ b/powertools-metrics/src/main/java/software/amazon/cloudwatchlogs/emf/model/MetricsLoggerHelper.java @@ -1,10 +1,13 @@ package software.amazon.cloudwatchlogs.emf.model; +import software.amazon.cloudwatchlogs.emf.exception.DimensionSetExceededException; + import java.lang.reflect.Field; import static software.amazon.lambda.powertools.metrics.MetricsUtils.metricsLogger; public final class MetricsLoggerHelper { + private MetricsLoggerHelper() { } @@ -13,7 +16,11 @@ public static boolean hasNoMetrics() { } public static long dimensionsCount() { - return metricsContext().getDimensions().size(); + try { + return metricsContext().getDimensions().size(); + } catch (DimensionSetExceededException e) { + throw new RuntimeException("Too many dimensions defined", e); + } } public static MetricsContext metricsContext() { diff --git a/powertools-metrics/src/main/java/software/amazon/lambda/powertools/metrics/MetricsUtils.java b/powertools-metrics/src/main/java/software/amazon/lambda/powertools/metrics/MetricsUtils.java index 443ef3976..4a416b3c8 100644 --- a/powertools-metrics/src/main/java/software/amazon/lambda/powertools/metrics/MetricsUtils.java +++ b/powertools-metrics/src/main/java/software/amazon/lambda/powertools/metrics/MetricsUtils.java @@ -6,13 +6,14 @@ import software.amazon.cloudwatchlogs.emf.config.SystemWrapper; import software.amazon.cloudwatchlogs.emf.environment.EnvironmentProvider; +import software.amazon.cloudwatchlogs.emf.exception.InvalidMetricException; +import software.amazon.cloudwatchlogs.emf.exception.InvalidNamespaceException; import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger; import software.amazon.cloudwatchlogs.emf.model.DimensionSet; import software.amazon.cloudwatchlogs.emf.model.MetricsContext; import software.amazon.cloudwatchlogs.emf.model.MetricsLoggerHelper; import software.amazon.cloudwatchlogs.emf.model.Unit; -import static java.util.Objects.requireNonNull; import static java.util.Optional.ofNullable; import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.getXrayTraceId; import static software.amazon.lambda.powertools.metrics.internal.LambdaMetricsAspect.REQUEST_ID_PROPERTY; @@ -49,23 +50,6 @@ public static void defaultDimensions(final DimensionSet... dimensionSets) { MetricsUtils.defaultDimensions = dimensionSets; } - /** - * Configure default dimension to be used by logger. - * By default, @{@link Metrics} annotation captures configured service as a dimension Service - * @param dimensionSet Default value of dimension set for logger - * @deprecated use {@link #defaultDimensions(DimensionSet...)} instead - * - */ - @Deprecated - public static void defaultDimensionSet(final DimensionSet dimensionSet) { - requireNonNull(dimensionSet, "Null dimension set not allowed"); - - if(dimensionSet.getDimensionKeys().size() > 0) { - defaultDimensions(dimensionSet); - } - } - - /** * Add and immediately flush a single metric. It will use the default namespace * specified either on {@link Metrics} annotation or via POWERTOOLS_METRICS_NAMESPACE env var. @@ -88,6 +72,10 @@ public static void withSingleMetric(final String name, metricsLogger.putMetric(name, value, unit); captureRequestAndTraceId(metricsLogger); logger.accept(metricsLogger); + } catch (InvalidNamespaceException e) { + throw new RuntimeException("A valid namespace is required, either pass it to the @Metrics annotation or set the environment variable POWERTOOLS_METRICS_NAMESPACE", e); + } catch (InvalidMetricException e) { + throw new RuntimeException(e); } finally { metricsLogger.flush(); } @@ -116,6 +104,10 @@ public static void withSingleMetric(final String name, metricsLogger.putMetric(name, value, unit); captureRequestAndTraceId(metricsLogger); logger.accept(metricsLogger); + } catch (InvalidNamespaceException e) { + throw new RuntimeException("A valid namespace is required, either pass it to the @Metrics annotation or set the environment variable POWERTOOLS_METRICS_NAMESPACE", e); + } catch (InvalidMetricException e) { + throw new RuntimeException(e); } finally { metricsLogger.flush(); } 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 09fd5d87d..b45dfbc4b 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 @@ -7,6 +7,10 @@ import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; +import software.amazon.cloudwatchlogs.emf.exception.DimensionSetExceededException; +import software.amazon.cloudwatchlogs.emf.exception.InvalidDimensionException; +import software.amazon.cloudwatchlogs.emf.exception.InvalidMetricException; +import software.amazon.cloudwatchlogs.emf.exception.InvalidNamespaceException; import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger; import software.amazon.cloudwatchlogs.emf.model.DimensionSet; import software.amazon.cloudwatchlogs.emf.model.MetricsContext; @@ -83,12 +87,24 @@ private void coldStartSingleMetricIfApplicable(final String awsRequestId, final Metrics metrics) { if (metrics.captureColdStart() && isColdStart()) { - MetricsLogger metricsLogger = new MetricsLogger(); + MetricsLogger metricsLogger = new MetricsLogger(); + try { metricsLogger.setNamespace(namespace(metrics)); + } catch (InvalidNamespaceException e) { + throw new RuntimeException("A valid namespace is required, either pass it to the @Metrics annotation or set the environment variable POWERTOOLS_METRICS_NAMESPACE", e); + } + try { metricsLogger.putMetric("ColdStart", 1, Unit.COUNT); + } catch (InvalidMetricException e) { + // should not occur + } + try { metricsLogger.setDimensions(DimensionSet.of("Service", service(metrics), "FunctionName", functionName)); - metricsLogger.putProperty(REQUEST_ID_PROPERTY, awsRequestId); - metricsLogger.flush(); + } catch (InvalidDimensionException | DimensionSetExceededException e) { + throw new RuntimeException("A valid service is required, either pass it to the @Metrics annotation or set the environment variable POWERTOOLS_SERVICE_NAME", e); + } + metricsLogger.putProperty(REQUEST_ID_PROPERTY, awsRequestId); + metricsLogger.flush(); } } @@ -136,6 +152,8 @@ public static void refreshMetricsContext(Metrics metrics) { f.set(metricsLogger(), context); } catch (NoSuchFieldException | IllegalAccessException e) { throw new RuntimeException(e); + } catch (InvalidDimensionException | DimensionSetExceededException e) { + throw new RuntimeException("A valid service is required, either pass it to the @Metrics annotation or set the environment variable POWERTOOLS_SERVICE_NAME", e); } } } diff --git a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/MetricsLoggerTest.java b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/MetricsLoggerTest.java index 449f12815..53bd44410 100644 --- a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/MetricsLoggerTest.java +++ b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/MetricsLoggerTest.java @@ -13,6 +13,8 @@ import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; import software.amazon.cloudwatchlogs.emf.config.SystemWrapper; +import software.amazon.cloudwatchlogs.emf.exception.DimensionSetExceededException; +import software.amazon.cloudwatchlogs.emf.exception.InvalidDimensionException; import software.amazon.cloudwatchlogs.emf.model.DimensionSet; import software.amazon.cloudwatchlogs.emf.model.Unit; @@ -46,7 +48,7 @@ static void beforeAll() { } @Test - void singleMetricsCaptureUtilityWithDefaultDimension() { + void singleMetricsCaptureUtilityWithDefaultDimension() throws InvalidDimensionException, DimensionSetExceededException { try (MockedStatic mocked = mockStatic(SystemWrapper.class); MockedStatic internalWrapper = mockStatic(software.amazon.lambda.powertools.core.internal.SystemWrapper.class)) { mocked.when(() -> SystemWrapper.getenv("AWS_EMF_ENVIRONMENT")).thenReturn("Lambda"); @@ -78,7 +80,13 @@ void singleMetricsCaptureUtility() { internalWrapper.when(() -> getenv("_X_AMZN_TRACE_ID")).thenReturn("Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1\""); MetricsUtils.withSingleMetric("Metric1", 1, Unit.COUNT, "test", - metricsLogger -> metricsLogger.setDimensions(DimensionSet.of("Dimension1", "Value1"))); + metricsLogger -> { + try { + metricsLogger.setDimensions(DimensionSet.of("Dimension1", "Value1")); + } catch (InvalidDimensionException | DimensionSetExceededException e) { + throw new RuntimeException(e); + } + }); assertThat(out.toString()) .satisfies(s -> { @@ -102,7 +110,13 @@ void singleMetricsCaptureUtilityWithDefaultNameSpace() { internalWrapper.when(() -> getenv("_X_AMZN_TRACE_ID")).thenReturn("Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1\""); MetricsUtils.withSingleMetric("Metric1", 1, Unit.COUNT, - metricsLogger -> metricsLogger.setDimensions(DimensionSet.of("Dimension1", "Value1"))); + metricsLogger -> { + try { + metricsLogger.setDimensions(DimensionSet.of("Dimension1", "Value1")); + } catch (InvalidDimensionException | DimensionSetExceededException e) { + throw new RuntimeException(e); + } + }); assertThat(out.toString()) .satisfies(s -> { @@ -123,13 +137,6 @@ void singleMetricsCaptureUtilityWithDefaultNameSpace() { } } - @Test - void shouldThrowExceptionWhenDefaultDimensionIsNull() { - assertThatNullPointerException() - .isThrownBy(() -> MetricsUtils.defaultDimensionSet(null)) - .withMessage("Null dimension set not allowed"); - } - private Map readAsJson(String s) { try { return mapper.readValue(s, Map.class); diff --git a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsColdStartEnabledHandler.java b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsColdStartEnabledHandler.java index a722bd689..85bb6b4e4 100644 --- a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsColdStartEnabledHandler.java +++ b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsColdStartEnabledHandler.java @@ -2,6 +2,7 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; +import software.amazon.cloudwatchlogs.emf.exception.InvalidMetricException; import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger; import software.amazon.cloudwatchlogs.emf.model.Unit; import software.amazon.lambda.powertools.metrics.Metrics; @@ -14,7 +15,11 @@ public class PowertoolsMetricsColdStartEnabledHandler implements RequestHandler< @Metrics(namespace = "ExampleApplication", service = "booking", captureColdStart = true) public Object handleRequest(Object input, Context context) { MetricsLogger metricsLogger = metricsLogger(); - metricsLogger.putMetric("Metric1", 1, Unit.BYTES); + try { + metricsLogger.putMetric("Metric1", 1, Unit.BYTES); + } catch (InvalidMetricException e) { + throw new RuntimeException(e); + } return null; } diff --git a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsEnabledDefaultDimensionHandler.java b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsEnabledDefaultDimensionHandler.java index f66269546..8b77b6672 100644 --- a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsEnabledDefaultDimensionHandler.java +++ b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsEnabledDefaultDimensionHandler.java @@ -2,6 +2,9 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; +import software.amazon.cloudwatchlogs.emf.exception.DimensionSetExceededException; +import software.amazon.cloudwatchlogs.emf.exception.InvalidDimensionException; +import software.amazon.cloudwatchlogs.emf.exception.InvalidMetricException; import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger; import software.amazon.cloudwatchlogs.emf.model.DimensionSet; import software.amazon.cloudwatchlogs.emf.model.Unit; @@ -14,14 +17,23 @@ public class PowertoolsMetricsEnabledDefaultDimensionHandler implements RequestHandler { static { - defaultDimensions(DimensionSet.of("CustomDimension", "booking")); + try { + defaultDimensions(DimensionSet.of("CustomDimension", "booking")); + } catch (InvalidDimensionException | DimensionSetExceededException e) { + throw new RuntimeException(e); + } } @Override @Metrics(namespace = "ExampleApplication", service = "booking") public Object handleRequest(Object input, Context context) { MetricsLogger metricsLogger = metricsLogger(); - metricsLogger.putMetric("Metric1", 1, Unit.BYTES); + + try { + metricsLogger.putMetric("Metric1", 1, Unit.BYTES); + } catch (InvalidMetricException e) { + throw new RuntimeException(e); + } withSingleMetric("Metric2", 1, Unit.COUNT, log -> {}); diff --git a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsEnabledDefaultNoDimensionHandler.java b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsEnabledDefaultNoDimensionHandler.java index 761362f43..dd7809f20 100644 --- a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsEnabledDefaultNoDimensionHandler.java +++ b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsEnabledDefaultNoDimensionHandler.java @@ -2,6 +2,7 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; +import software.amazon.cloudwatchlogs.emf.exception.InvalidMetricException; import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger; import software.amazon.cloudwatchlogs.emf.model.Unit; import software.amazon.lambda.powertools.metrics.Metrics; @@ -20,7 +21,11 @@ public class PowertoolsMetricsEnabledDefaultNoDimensionHandler implements Reques @Metrics(namespace = "ExampleApplication", service = "booking") public Object handleRequest(Object input, Context context) { MetricsLogger metricsLogger = metricsLogger(); - metricsLogger.putMetric("Metric1", 1, Unit.BYTES); + try { + metricsLogger.putMetric("Metric1", 1, Unit.BYTES); + } catch (InvalidMetricException e) { + throw new RuntimeException(e); + } withSingleMetric("Metric2", 1, Unit.COUNT, log -> {}); diff --git a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsEnabledHandler.java b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsEnabledHandler.java index 160109787..67631cdb4 100644 --- a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsEnabledHandler.java +++ b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsEnabledHandler.java @@ -2,6 +2,9 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; +import software.amazon.cloudwatchlogs.emf.exception.DimensionSetExceededException; +import software.amazon.cloudwatchlogs.emf.exception.InvalidDimensionException; +import software.amazon.cloudwatchlogs.emf.exception.InvalidMetricException; import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger; import software.amazon.cloudwatchlogs.emf.model.DimensionSet; import software.amazon.cloudwatchlogs.emf.model.Unit; @@ -16,11 +19,20 @@ public class PowertoolsMetricsEnabledHandler implements RequestHandler log.setDimensions(DimensionSet.of("Dimension1", "Value1"))); + log -> { + try { + log.setDimensions(DimensionSet.of("Dimension1", "Value1")); + } catch (InvalidDimensionException | DimensionSetExceededException e) { + throw new RuntimeException(e); + } + }); return null; } diff --git a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsEnabledStreamHandler.java b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsEnabledStreamHandler.java index 2eb877dc3..c56c60db9 100644 --- a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsEnabledStreamHandler.java +++ b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsEnabledStreamHandler.java @@ -5,6 +5,7 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestStreamHandler; +import software.amazon.cloudwatchlogs.emf.exception.InvalidMetricException; import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger; import software.amazon.cloudwatchlogs.emf.model.Unit; import software.amazon.lambda.powertools.metrics.Metrics; @@ -17,6 +18,10 @@ public class PowertoolsMetricsEnabledStreamHandler implements RequestStreamHandl @Metrics(namespace = "ExampleApplication", service = "booking") public void handleRequest(InputStream input, OutputStream output, Context context) { MetricsLogger metricsLogger = metricsLogger(); - metricsLogger.putMetric("Metric1", 1, Unit.BYTES); + try { + metricsLogger.putMetric("Metric1", 1, Unit.BYTES); + } catch (InvalidMetricException e) { + throw new RuntimeException(e); + } } } diff --git a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsNoDimensionsHandler.java b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsNoDimensionsHandler.java index 1c4cc3f77..30af9237f 100644 --- a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsNoDimensionsHandler.java +++ b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsNoDimensionsHandler.java @@ -2,6 +2,7 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; +import software.amazon.cloudwatchlogs.emf.exception.InvalidMetricException; import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger; import software.amazon.cloudwatchlogs.emf.model.DimensionSet; import software.amazon.lambda.powertools.metrics.Metrics; @@ -14,7 +15,11 @@ public class PowertoolsMetricsNoDimensionsHandler implements RequestHandler { @Override - @Metrics + @Metrics(namespace = "ExampleApplication", service = "booking") public Object handleRequest(Object input, Context context) { MetricsLogger metricsLogger = metricsLogger(); + + metricsLogger.setDimensions(IntStream.range(1, 15) - .mapToObj(value -> DimensionSet.of("Dimension" + value, "DimensionValue" + value)) + .mapToObj(value -> { + try { + return DimensionSet.of("Dimension" + value, "DimensionValue" + value); + } catch (InvalidDimensionException | DimensionSetExceededException e) { + throw new RuntimeException(e); + } + }) .toArray(DimensionSet[]::new)); return null; diff --git a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsWithExceptionInHandler.java b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsWithExceptionInHandler.java index db75d9f95..7fec627f7 100644 --- a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsWithExceptionInHandler.java +++ b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsWithExceptionInHandler.java @@ -2,6 +2,7 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; +import software.amazon.cloudwatchlogs.emf.exception.InvalidMetricException; import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger; import software.amazon.lambda.powertools.metrics.Metrics; @@ -13,7 +14,11 @@ public class PowertoolsMetricsWithExceptionInHandler implements RequestHandler powertools-parent software.amazon.lambda - 1.12.3 + 2.0.0-beta powertools-parameters diff --git a/powertools-parameters/src/main/java/software/amazon/lambda/powertools/parameters/cache/DataStore.java b/powertools-parameters/src/main/java/software/amazon/lambda/powertools/parameters/cache/DataStore.java index 351ba054d..9ad8df12c 100644 --- a/powertools-parameters/src/main/java/software/amazon/lambda/powertools/parameters/cache/DataStore.java +++ b/powertools-parameters/src/main/java/software/amazon/lambda/powertools/parameters/cache/DataStore.java @@ -46,7 +46,8 @@ public void remove(String Key){ } public Object get(String key) { - return store.containsKey(key)?store.get(key).value:null; + ValueNode node = store.get(key); + return node != null ? node.value : null; } public boolean hasExpired(String key, Instant now) { diff --git a/powertools-serialization/pom.xml b/powertools-serialization/pom.xml index 69176ea3a..640a1d526 100644 --- a/powertools-serialization/pom.xml +++ b/powertools-serialization/pom.xml @@ -7,7 +7,7 @@ powertools-parent software.amazon.lambda - 1.12.3 + 2.0.0-beta powertools-serialization diff --git a/powertools-sqs/pom.xml b/powertools-sqs/pom.xml index f3ebd5e58..3a76941d3 100644 --- a/powertools-sqs/pom.xml +++ b/powertools-sqs/pom.xml @@ -10,7 +10,7 @@ powertools-parent software.amazon.lambda - 1.12.3 + 2.0.0-beta AWS Lambda Powertools for Java library SQS diff --git a/powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/internal/BatchContext.java b/powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/internal/BatchContext.java index 93ad2abc4..1e4eff3bf 100644 --- a/powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/internal/BatchContext.java +++ b/powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/internal/BatchContext.java @@ -114,7 +114,7 @@ private void processFailedMessages(List successReturns, map(SQSMessage::getMessageId) .collect(toList()); - LOG.debug(format("[%s] records failed processing, but exceptions are suppressed. " + + LOG.debug(format("[%d] records failed processing, but exceptions are suppressed. " + "Failed messages %s", failedMessages.size(), messageIds)); } else { throw new SQSBatchProcessingException(exceptions, failedMessages, successReturns); diff --git a/powertools-test-suite/pom.xml b/powertools-test-suite/pom.xml index 95f9a8b22..adf199df5 100644 --- a/powertools-test-suite/pom.xml +++ b/powertools-test-suite/pom.xml @@ -10,7 +10,7 @@ powertools-parent software.amazon.lambda - 1.12.3 + 2.0.0-beta AWS Lambda Powertools for Java library Test Suite diff --git a/powertools-tracing/pom.xml b/powertools-tracing/pom.xml index 59221ac4d..dc3be7682 100644 --- a/powertools-tracing/pom.xml +++ b/powertools-tracing/pom.xml @@ -10,7 +10,7 @@ powertools-parent software.amazon.lambda - 1.12.3 + 2.0.0-beta AWS Lambda Powertools for Java library Tracing diff --git a/powertools-validation/pom.xml b/powertools-validation/pom.xml index c5a0a767c..0a3ec0f27 100644 --- a/powertools-validation/pom.xml +++ b/powertools-validation/pom.xml @@ -10,7 +10,7 @@ powertools-parent software.amazon.lambda - 1.12.3 + 2.0.0-beta AWS Lambda Powertools for Java validation library diff --git a/powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/ValidationUtils.java b/powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/ValidationUtils.java index 12c51c632..9b73806a5 100644 --- a/powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/ValidationUtils.java +++ b/powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/ValidationUtils.java @@ -239,12 +239,17 @@ public static JsonSchema getJsonSchema(String schema) { * @return the loaded json schema */ public static JsonSchema getJsonSchema(String schema, boolean validateSchema) { - JsonSchema jsonSchema = schemas.get(schema); + JsonSchema jsonSchema = schemas.computeIfAbsent(schema, ValidationUtils::createJsonSchema); - if (jsonSchema != null) { - return jsonSchema; + if (validateSchema) { + validateSchema(schema, jsonSchema); } + return jsonSchema; + } + + private static JsonSchema createJsonSchema(String schema) { + JsonSchema jsonSchema; if (schema.startsWith(CLASSPATH)) { String filePath = schema.substring(CLASSPATH.length()); try (InputStream schemaStream = ValidationAspect.class.getResourceAsStream(filePath)) { @@ -260,21 +265,19 @@ public static JsonSchema getJsonSchema(String schema, boolean validateSchema) { jsonSchema = ValidationConfig.get().getFactory().getSchema(schema); } - if (validateSchema) { - String version = ValidationConfig.get().getSchemaVersion().toString(); - try { - validate(jsonSchema.getSchemaNode(), - getJsonSchema("classpath:/schemas/meta_schema_" + version)); - } catch (ValidationException ve) { - throw new IllegalArgumentException("The schema " + schema + " is not valid, it does not respect the specification " + version, ve); - } - } - - schemas.put(schema, jsonSchema); - return jsonSchema; } + private static void validateSchema(String schema, JsonSchema jsonSchema) { + String version = ValidationConfig.get().getSchemaVersion().toString(); + try { + validate(jsonSchema.getSchemaNode(), + getJsonSchema("classpath:/schemas/meta_schema_" + version)); + } catch (ValidationException ve) { + throw new IllegalArgumentException("The schema " + schema + " is not valid, it does not respect the specification " + version, ve); + } + } + /** * */ diff --git a/spotbugs-exclude.xml b/spotbugs-exclude.xml index 0c8d1d8f8..378a5a5a6 100644 --- a/spotbugs-exclude.xml +++ b/spotbugs-exclude.xml @@ -120,6 +120,10 @@ + + + +