From 0338ecd70c468ad3d5269db44ea02bb1211ea6af Mon Sep 17 00:00:00 2001 From: Pankaj Agrawal Date: Fri, 26 Feb 2021 22:44:47 +0100 Subject: [PATCH 1/3] feat: single metric utility method to pick default namespace --- .../emf/model/MetricsLoggerHelper.java | 2 +- .../powertools/metrics/MetricsUtils.java | 32 +++++++++++++++++++ .../powertools/metrics/MetricsLoggerTest.java | 27 ++++++++++++++++ .../PowertoolsMetricsEnabledHandler.java | 6 ++++ .../internal/LambdaMetricsAspectTest.java | 18 +++++++++-- 5 files changed, 82 insertions(+), 3 deletions(-) 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 348f489da..f59658e9c 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 @@ -16,7 +16,7 @@ public static long dimensionsCount() { return metricsContext().getDimensions().size(); } - private static MetricsContext metricsContext() { + public static MetricsContext metricsContext() { try { Field f = metricsLogger().getClass().getDeclaredField("context"); f.setAccessible(true); 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 e787ff588..d338ce495 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 @@ -2,7 +2,10 @@ import java.util.function.Consumer; +import software.amazon.cloudwatchlogs.emf.config.SystemWrapper; import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger; +import software.amazon.cloudwatchlogs.emf.model.MetricsContext; +import software.amazon.cloudwatchlogs.emf.model.MetricsLoggerHelper; import software.amazon.cloudwatchlogs.emf.model.Unit; /** @@ -26,6 +29,29 @@ public static MetricsLogger metricsLogger() { return metricsLogger; } + /** + * Add and immediately flush a single metric. It will use the default namespace + * specific either on {@link Metrics} annotation or via POWERTOOLS_METRICS_NAMESPACE env var. + * + * @param name the name of the metric + * @param value the value of the metric + * @param unit the unit type of the metric + * @param logger the MetricsLogger + */ + public static void withSingleMetricOnDefaultNameSpace(final String name, + final double value, + final Unit unit, + final Consumer logger) { + MetricsLogger metricsLogger = new MetricsLogger(); + try { + metricsLogger.setNamespace(defaultNameSpace()); + metricsLogger.putMetric(name, value, unit); + logger.accept(metricsLogger); + } finally { + metricsLogger.flush(); + } + } + /** * Add and immediately flush a single metric. * @@ -49,4 +75,10 @@ public static void withSingleMetric(final String name, metricsLogger.flush(); } } + + private static String defaultNameSpace() { + MetricsContext context = MetricsLoggerHelper.metricsContext(); + return "aws-embedded-metrics".equals(context.getNamespace()) ? + SystemWrapper.getenv("POWERTOOLS_METRICS_NAMESPACE"): context.getNamespace(); + } } 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 55fecb09e..61e7f982c 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 @@ -62,6 +62,33 @@ void singleMetricsCaptureUtility() { } } + @Test + void singleMetricsCaptureUtilityWithDefaultNameSpace() { + try (MockedStatic mocked = mockStatic(SystemWrapper.class)) { + mocked.when(() -> SystemWrapper.getenv("AWS_EMF_ENVIRONMENT")).thenReturn("Lambda"); + mocked.when(() -> SystemWrapper.getenv("POWERTOOLS_METRICS_NAMESPACE")).thenReturn("GlobalName"); + + MetricsUtils.withSingleMetricOnDefaultNameSpace("Metric1", 1, Unit.COUNT, + metricsLogger -> metricsLogger.setDimensions(DimensionSet.of("Dimension1", "Value1"))); + + assertThat(out.toString()) + .satisfies(s -> { + Map logAsJson = readAsJson(s); + + assertThat(logAsJson) + .containsEntry("Metric1", 1.0) + .containsEntry("Dimension1", "Value1") + .containsKey("_aws"); + + Map aws = (Map) logAsJson.get("_aws"); + + assertThat(aws.get("CloudWatchMetrics")) + .asString() + .contains("Namespace=GlobalName"); + }); + } + } + 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/PowertoolsMetricsEnabledHandler.java b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsEnabledHandler.java index 7bccb3f48..9f66fb31c 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 @@ -3,10 +3,12 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger; +import software.amazon.cloudwatchlogs.emf.model.DimensionSet; import software.amazon.cloudwatchlogs.emf.model.Unit; import software.amazon.lambda.powertools.metrics.Metrics; import static software.amazon.lambda.powertools.metrics.MetricsUtils.metricsLogger; +import static software.amazon.lambda.powertools.metrics.MetricsUtils.withSingleMetricOnDefaultNameSpace; public class PowertoolsMetricsEnabledHandler implements RequestHandler { @@ -16,6 +18,10 @@ public Object handleRequest(Object input, Context context) { MetricsLogger metricsLogger = metricsLogger(); metricsLogger.putMetric("Metric1", 1, Unit.BYTES); + + withSingleMetricOnDefaultNameSpace("Metric2", 1, Unit.COUNT, + log -> log.setDimensions(DimensionSet.of("Dimension1", "Value1"))); + return null; } } diff --git a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/internal/LambdaMetricsAspectTest.java b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/internal/LambdaMetricsAspectTest.java index 60086132b..00ec31994 100644 --- a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/internal/LambdaMetricsAspectTest.java +++ b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/internal/LambdaMetricsAspectTest.java @@ -75,9 +75,23 @@ public void metricsWithoutColdStart() { mocked.when(() -> SystemWrapper.getenv("AWS_EMF_ENVIRONMENT")).thenReturn("Lambda"); requestHandler.handleRequest("input", context); - assertThat(out.toString()) + assertThat(out.toString().split("\n")) + .hasSize(2) .satisfies(s -> { - Map logAsJson = readAsJson(s); + Map logAsJson = readAsJson(s[0]); + + assertThat(logAsJson) + .containsEntry("Metric2", 1.0) + .containsEntry("Dimension1", "Value1") + .containsKey("_aws"); + + Map aws = (Map) logAsJson.get("_aws"); + + assertThat(aws.get("CloudWatchMetrics")) + .asString() + .contains("Namespace=ExampleApplication"); + + logAsJson = readAsJson(s[1]); assertThat(logAsJson) .containsEntry("Metric1", 1.0) From e6f712097f08308f9dae377f08f4b9c02bb66dcf Mon Sep 17 00:00:00 2001 From: Pankaj Agrawal Date: Sat, 27 Feb 2021 13:42:05 +0100 Subject: [PATCH 2/3] chore: move trace id logic to core for reuse --- .../core/internal/LambdaHandlerProcessor.java | 9 +++++++++ .../powertools/core}/internal/SystemWrapper.java | 4 ++-- .../logging/internal/LambdaLoggingAspect.java | 11 +---------- .../logging/internal/LambdaLoggingAspectTest.java | 3 ++- 4 files changed, 14 insertions(+), 13 deletions(-) rename {powertools-logging/src/main/java/software/amazon/lambda/powertools/logging => powertools-core/src/main/java/software/amazon/lambda/powertools/core}/internal/SystemWrapper.java (60%) 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 f049b0b04..57e0160a3 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 @@ -24,6 +24,7 @@ import static java.util.Optional.empty; import static java.util.Optional.of; +import static software.amazon.lambda.powertools.core.internal.SystemWrapper.getenv; public final class LambdaHandlerProcessor { // SERVICE_NAME cannot be final for testing purposes @@ -83,4 +84,12 @@ public static void coldStartDone() { public static boolean isSamLocal() { return "true".equals(System.getenv("AWS_SAM_LOCAL")); } + + public static Optional getXrayTraceId() { + final String X_AMZN_TRACE_ID = getenv("_X_AMZN_TRACE_ID"); + if(X_AMZN_TRACE_ID != null) { + return of(X_AMZN_TRACE_ID.split(";")[0].replace("Root=", "")); + } + return empty(); + } } diff --git a/powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/internal/SystemWrapper.java b/powertools-core/src/main/java/software/amazon/lambda/powertools/core/internal/SystemWrapper.java similarity index 60% rename from powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/internal/SystemWrapper.java rename to powertools-core/src/main/java/software/amazon/lambda/powertools/core/internal/SystemWrapper.java index c521fe77f..aef64378f 100644 --- a/powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/internal/SystemWrapper.java +++ b/powertools-core/src/main/java/software/amazon/lambda/powertools/core/internal/SystemWrapper.java @@ -1,6 +1,6 @@ -package software.amazon.lambda.powertools.logging.internal; +package software.amazon.lambda.powertools.core.internal; -class SystemWrapper { +public class SystemWrapper { private SystemWrapper() { } 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 4c9f48c82..3f21b5c2e 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 @@ -39,10 +39,10 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Optional.empty; -import static java.util.Optional.of; import static java.util.Optional.ofNullable; import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.coldStartDone; import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.extractContext; +import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.getXrayTraceId; import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.isColdStart; import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.isHandlerMethod; import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.placedOnRequestHandler; @@ -50,7 +50,6 @@ import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.serviceName; import static software.amazon.lambda.powertools.logging.LoggingUtils.appendKey; import static software.amazon.lambda.powertools.logging.LoggingUtils.appendKeys; -import static software.amazon.lambda.powertools.logging.internal.SystemWrapper.getenv; @Aspect public final class LambdaLoggingAspect { @@ -200,12 +199,4 @@ private Optional asJson(final ProceedingJoinPoint pjp, private Logger logger(final ProceedingJoinPoint pjp) { return LogManager.getLogger(pjp.getSignature().getDeclaringType()); } - - private static Optional getXrayTraceId() { - final String X_AMZN_TRACE_ID = getenv("_X_AMZN_TRACE_ID"); - if(X_AMZN_TRACE_ID != null) { - return of(X_AMZN_TRACE_ID.split(";")[0].replace("Root=", "")); - } - return empty(); - } } diff --git a/powertools-logging/src/test/java/software/amazon/lambda/powertools/logging/internal/LambdaLoggingAspectTest.java b/powertools-logging/src/test/java/software/amazon/lambda/powertools/logging/internal/LambdaLoggingAspectTest.java index 7f38db0a7..df1857438 100644 --- a/powertools-logging/src/test/java/software/amazon/lambda/powertools/logging/internal/LambdaLoggingAspectTest.java +++ b/powertools-logging/src/test/java/software/amazon/lambda/powertools/logging/internal/LambdaLoggingAspectTest.java @@ -41,6 +41,7 @@ import org.mockito.Mock; import org.mockito.MockedStatic; import software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor; +import software.amazon.lambda.powertools.core.internal.SystemWrapper; import software.amazon.lambda.powertools.logging.handlers.PowerLogToolEnabled; import software.amazon.lambda.powertools.logging.handlers.PowerLogToolEnabledForStream; import software.amazon.lambda.powertools.logging.handlers.PowerToolDisabled; @@ -65,7 +66,7 @@ import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.openMocks; import static org.skyscreamer.jsonassert.JSONAssert.assertEquals; -import static software.amazon.lambda.powertools.logging.internal.SystemWrapper.getenv; +import static software.amazon.lambda.powertools.core.internal.SystemWrapper.getenv; class LambdaLoggingAspectTest { From 10d7ff8cbe179d89e3a20a5037e893049d0a89c6 Mon Sep 17 00:00:00 2001 From: Pankaj Agrawal Date: Sat, 27 Feb 2021 14:10:07 +0100 Subject: [PATCH 3/3] feat: capture xray trace id and request id by default as property for emf logs --- .../powertools/metrics/MetricsUtils.java | 36 ++++++++++++++++--- .../metrics/internal/LambdaMetricsAspect.java | 10 ++++-- .../powertools/metrics/MetricsLoggerTest.java | 17 ++++++--- .../PowertoolsMetricsEnabledHandler.java | 4 +-- .../internal/LambdaMetricsAspectTest.java | 11 ++++-- 5 files changed, 62 insertions(+), 16 deletions(-) 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 d338ce495..314b53d24 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 @@ -1,5 +1,6 @@ package software.amazon.lambda.powertools.metrics; +import java.util.Optional; import java.util.function.Consumer; import software.amazon.cloudwatchlogs.emf.config.SystemWrapper; @@ -8,6 +9,11 @@ import software.amazon.cloudwatchlogs.emf.model.MetricsLoggerHelper; import software.amazon.cloudwatchlogs.emf.model.Unit; +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; +import static software.amazon.lambda.powertools.metrics.internal.LambdaMetricsAspect.TRACE_ID_PROPERTY; + /** * A class used to retrieve the instance of the {@code MetricsLogger} used by * {@code Metrics}. @@ -31,21 +37,24 @@ public static MetricsLogger metricsLogger() { /** * Add and immediately flush a single metric. It will use the default namespace - * specific either on {@link Metrics} annotation or via POWERTOOLS_METRICS_NAMESPACE env var. + * specified either on {@link Metrics} annotation or via POWERTOOLS_METRICS_NAMESPACE env var. + * It by default captures AwsRequestId as property if used together with {@link Metrics} annotation. It will also + * capture XrayTraceId as property if tracing is enabled. * * @param name the name of the metric * @param value the value of the metric * @param unit the unit type of the metric * @param logger the MetricsLogger */ - public static void withSingleMetricOnDefaultNameSpace(final String name, - final double value, - final Unit unit, - final Consumer logger) { + public static void withSingleMetric(final String name, + final double value, + final Unit unit, + final Consumer logger) { MetricsLogger metricsLogger = new MetricsLogger(); try { metricsLogger.setNamespace(defaultNameSpace()); metricsLogger.putMetric(name, value, unit); + captureRequestAndTraceId(metricsLogger); logger.accept(metricsLogger); } finally { metricsLogger.flush(); @@ -54,6 +63,8 @@ public static void withSingleMetricOnDefaultNameSpace(final String name, /** * Add and immediately flush a single metric. + * It by default captures AwsRequestId as property if used together with {@link Metrics} annotation. It will also + * capture XrayTraceId as property if tracing is enabled. * * @param name the name of the metric * @param value the value of the metric @@ -70,15 +81,30 @@ public static void withSingleMetric(final String name, try { metricsLogger.setNamespace(namespace); metricsLogger.putMetric(name, value, unit); + captureRequestAndTraceId(metricsLogger); logger.accept(metricsLogger); } finally { metricsLogger.flush(); } } + private static void captureRequestAndTraceId(MetricsLogger metricsLogger) { + awsRequestId(). + ifPresent(requestId -> metricsLogger.putProperty(REQUEST_ID_PROPERTY, requestId)); + + getXrayTraceId() + .ifPresent(traceId -> metricsLogger.putProperty(TRACE_ID_PROPERTY, traceId)); + } + private static String defaultNameSpace() { MetricsContext context = MetricsLoggerHelper.metricsContext(); return "aws-embedded-metrics".equals(context.getNamespace()) ? SystemWrapper.getenv("POWERTOOLS_METRICS_NAMESPACE"): context.getNamespace(); } + + private static Optional awsRequestId() { + MetricsContext context = MetricsLoggerHelper.metricsContext(); + return ofNullable(context.getProperty(REQUEST_ID_PROPERTY)) + .map(Object::toString); + } } 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 1ff04fee3..e2bf4f2db 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 @@ -10,6 +10,7 @@ import software.amazon.cloudwatchlogs.emf.model.DimensionSet; import software.amazon.cloudwatchlogs.emf.model.MetricsContext; import software.amazon.cloudwatchlogs.emf.model.Unit; +import software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor; import software.amazon.lambda.powertools.metrics.Metrics; import software.amazon.lambda.powertools.metrics.ValidationException; @@ -27,6 +28,8 @@ @Aspect public class LambdaMetricsAspect { private static final String NAMESPACE = System.getenv("POWERTOOLS_METRICS_NAMESPACE"); + public static final String TRACE_ID_PROPERTY = "XrayTraceId"; + public static final String REQUEST_ID_PROPERTY = "AwsRequestId"; @SuppressWarnings({"EmptyMethod"}) @Pointcut("@annotation(metrics)") @@ -49,9 +52,12 @@ public Object around(ProceedingJoinPoint pjp, extractContext(pjp).ifPresent((context) -> { coldStartSingleMetricIfApplicable(context.getAwsRequestId(), context.getFunctionName(), metrics); - logger.putProperty("AwsRequestId", context.getAwsRequestId()); + logger.putProperty(REQUEST_ID_PROPERTY, context.getAwsRequestId()); }); + LambdaHandlerProcessor.getXrayTraceId() + .ifPresent(traceId -> logger.putProperty(TRACE_ID_PROPERTY, traceId)); + try { return pjp.proceed(proceedArgs); @@ -75,7 +81,7 @@ && isColdStart()) { metricsLogger.setNamespace(namespace(metrics)); metricsLogger.putMetric("ColdStart", 1, Unit.COUNT); metricsLogger.setDimensions(DimensionSet.of("Service", service(metrics), "FunctionName", functionName)); - metricsLogger.putProperty("AwsRequestId", awsRequestId); + metricsLogger.putProperty(REQUEST_ID_PROPERTY, awsRequestId); metricsLogger.flush(); } 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 61e7f982c..7fc8529e7 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 @@ -18,6 +18,7 @@ import static java.util.Collections.*; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mockStatic; +import static software.amazon.lambda.powertools.core.internal.SystemWrapper.getenv; class MetricsLoggerTest { @@ -44,8 +45,10 @@ static void beforeAll() { @Test void singleMetricsCaptureUtility() { - try (MockedStatic mocked = mockStatic(SystemWrapper.class)) { + 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"); + 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"))); @@ -57,18 +60,21 @@ void singleMetricsCaptureUtility() { assertThat(logAsJson) .containsEntry("Metric1", 1.0) .containsEntry("Dimension1", "Value1") - .containsKey("_aws"); + .containsKey("_aws") + .containsEntry("XrayTraceId", "1-5759e988-bd862e3fe1be46a994272793"); }); } } @Test void singleMetricsCaptureUtilityWithDefaultNameSpace() { - try (MockedStatic mocked = mockStatic(SystemWrapper.class)) { + 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"); mocked.when(() -> SystemWrapper.getenv("POWERTOOLS_METRICS_NAMESPACE")).thenReturn("GlobalName"); + internalWrapper.when(() -> getenv("_X_AMZN_TRACE_ID")).thenReturn("Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1\""); - MetricsUtils.withSingleMetricOnDefaultNameSpace("Metric1", 1, Unit.COUNT, + MetricsUtils.withSingleMetric("Metric1", 1, Unit.COUNT, metricsLogger -> metricsLogger.setDimensions(DimensionSet.of("Dimension1", "Value1"))); assertThat(out.toString()) @@ -78,7 +84,8 @@ void singleMetricsCaptureUtilityWithDefaultNameSpace() { assertThat(logAsJson) .containsEntry("Metric1", 1.0) .containsEntry("Dimension1", "Value1") - .containsKey("_aws"); + .containsKey("_aws") + .containsEntry("XrayTraceId", "1-5759e988-bd862e3fe1be46a994272793"); Map aws = (Map) logAsJson.get("_aws"); 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 9f66fb31c..160109787 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 @@ -8,7 +8,7 @@ import software.amazon.lambda.powertools.metrics.Metrics; import static software.amazon.lambda.powertools.metrics.MetricsUtils.metricsLogger; -import static software.amazon.lambda.powertools.metrics.MetricsUtils.withSingleMetricOnDefaultNameSpace; +import static software.amazon.lambda.powertools.metrics.MetricsUtils.withSingleMetric; public class PowertoolsMetricsEnabledHandler implements RequestHandler { @@ -19,7 +19,7 @@ public Object handleRequest(Object input, Context context) { metricsLogger.putMetric("Metric1", 1, Unit.BYTES); - withSingleMetricOnDefaultNameSpace("Metric2", 1, Unit.COUNT, + withSingleMetric("Metric2", 1, Unit.COUNT, log -> log.setDimensions(DimensionSet.of("Dimension1", "Value1"))); return null; diff --git a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/internal/LambdaMetricsAspectTest.java b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/internal/LambdaMetricsAspectTest.java index 00ec31994..dfb67cc08 100644 --- a/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/internal/LambdaMetricsAspectTest.java +++ b/powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/internal/LambdaMetricsAspectTest.java @@ -36,6 +36,7 @@ import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.openMocks; +import static software.amazon.lambda.powertools.core.internal.SystemWrapper.getenv; public class LambdaMetricsAspectTest { @Mock @@ -71,8 +72,12 @@ void tearDown() { @Test public void metricsWithoutColdStart() { - try (MockedStatic mocked = mockStatic(SystemWrapper.class)) { + 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"); + internalWrapper.when(() -> getenv("_X_AMZN_TRACE_ID")).thenReturn("Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1\""); + requestHandler.handleRequest("input", context); assertThat(out.toString().split("\n")) @@ -83,7 +88,9 @@ public void metricsWithoutColdStart() { assertThat(logAsJson) .containsEntry("Metric2", 1.0) .containsEntry("Dimension1", "Value1") - .containsKey("_aws"); + .containsKey("_aws") + .containsEntry("XrayTraceId", "1-5759e988-bd862e3fe1be46a994272793") + .containsEntry("AwsRequestId", "123ABC"); Map aws = (Map) logAsJson.get("_aws");