Skip to content

feat(v2): Add GraalVM reachability metadata for core utilities #1753

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 24 commits into from
Mar 13, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
fd40160
Initial version of PT common GraalVM reachability metadata
rr-on-gh Nov 29, 2024
ee03ae4
Initial version of PT logging GraalVM reachability metadata
rr-on-gh Nov 29, 2024
866fd82
Initial version of PT serialization GraalVM reachability metadata
rr-on-gh Nov 29, 2024
b72280f
Initial version of PT logging log4j GraalVM reachability metadata
rr-on-gh Nov 29, 2024
97650c0
Initial version of PT logging log4j GraalVM reachability metadata
rr-on-gh Nov 29, 2024
276984d
Initial version of PT logging logback GraalVM reachability metadata
rr-on-gh Nov 29, 2024
63105bf
Example of PT logging with GraalVM
rr-on-gh Dec 2, 2024
1a2cad2
Added GRM for powertools-metrics and update the example
rr-on-gh Dec 3, 2024
90fe66e
Added GRM for powertools-metrics and update the example
rr-on-gh Dec 3, 2024
617a57c
Cleanup of junit and mockito references
rr-on-gh Dec 3, 2024
a0791a4
Cleanup of junit and mockito references
rr-on-gh Dec 3, 2024
7bfedb3
Added documentation
rr-on-gh Dec 5, 2024
e867523
Added GraalVM documentation
rr-on-gh Mar 7, 2025
9b0b623
Added GraalVM documentation
rr-on-gh Mar 7, 2025
9759aad
Merge branch 'v2' into graalvm-logging-v2
phipag Mar 10, 2025
13f5cc4
Added GRM files for tracing module. Also changed the tests to use @Se…
rr-on-gh Mar 10, 2025
c45325a
Merge remote-tracking branch 'origin/graalvm-logging-v2' into graalvm…
rr-on-gh Mar 10, 2025
a969e3c
Switch commons module to use JUnit Pioneer
rr-on-gh Mar 11, 2025
ea9a1a2
Switch logging module to use JUnit Pioneer
rr-on-gh Mar 11, 2025
d96539b
Switch logging-log4j module to use JUnit Pioneer
rr-on-gh Mar 11, 2025
d186e91
Switch metrics module to use JUnit Pioneer
rr-on-gh Mar 11, 2025
e879e06
Fix testGetVersionFromProperties_InvalidFile test when running as nat…
phipag Mar 12, 2025
a1651ae
Cleaned up documentation and fixed review comments
rr-on-gh Mar 12, 2025
9b2b6e8
Cosmetic fixes/formatting. Re-order imports in changed test files, fi…
phipag Mar 13, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Switch logging module to use JUnit Pioneer
  • Loading branch information
rr-on-gh committed Mar 11, 2025
commit ea9a1a2d491cc77cc74525711b885e0977b03e98
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,19 @@ This file defines the Lambda function to be deployed as well as API Gateway for
- Set the environment to use GraalVM

```shell
export JAVA_HOME=<path to GraalVM>
````
export JAVA_HOME=<path to GraalVM>
```

## Build the sample application

- Build the Docker image that will be used as the environment for SAM build:
```shell
docker build --platform linux/amd64 . -t powertools-examples-core-sam-graalvm
docker build --platform linux/amd64 . -t powertools-examples-core-sam-graalvm
```

- Build the SAM project using the docker image
```shell
sam build --use-container --build-image powertools-examples-core-sam-graalvm
sam build --use-container --build-image powertools-examples-core-sam-graalvm

```
#### [Optional] Building with -SNAPSHOT versions of PowerTools
Expand Down
16 changes: 11 additions & 5 deletions powertools-logging/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit-pioneer</groupId>
<artifactId>junit-pioneer</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
Expand Down Expand Up @@ -116,7 +121,10 @@
<artifactId>maven-surefire-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<argLine>-Dmockito.mock.maker=subclass -Dorg.graalvm.nativeimage.imagecode=agent -agentlib:native-image-agent=config-output-dir=src/main/resources/META-INF/native-image/software.amazon.lambda/powertools-logging,experimental-class-define-support</argLine>
<argLine>-Dmockito.mock.maker=subclass -Dorg.graalvm.nativeimage.imagecode=agent -agentlib:native-image-agent=config-output-dir=src/main/resources/META-INF/native-image/software.amazon.lambda/powertools-logging,experimental-class-define-support
--add-opens java.base/java.util=ALL-UNNAMED
--add-opens java.base/java.lang=ALL-UNNAMED
</argLine>
</configuration>
</plugin>
</plugins>
Expand Down Expand Up @@ -149,12 +157,10 @@
</execution>
</executions>
<configuration>
<agent>
<enabled>true</enabled>
<defaultMode>Standard</defaultMode>
</agent>
<imageName>powertools-logging</imageName>
<buildArgs>
<buildArg>--add-opens java.base/java.util=ALL-UNNAMED</buildArg>
<buildArg>--add-opens java.base/java.lang=ALL-UNNAMED</buildArg>
<buildArg>--no-fallback</buildArg>
<buildArg>-Dorg.graalvm.nativeimage.imagecode=agent</buildArg>
<buildArg>-H:ClassInitialization=net.bytebuddy.ClassFileVersion:rerun</buildArg>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,10 @@
"queryAllDeclaredConstructors":true,
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"clone","parameterTypes":[] }, {"name":"getClass","parameterTypes":[] }, {"name":"toString","parameterTypes":[] }]
},
{
"name":"java.lang.ProcessEnvironment",
"fields":[{"name":"theCaseInsensitiveEnvironment"}, {"name":"theEnvironment"}]
},
{
"name":"java.lang.ProcessHandle",
"methods":[{"name":"current","parameterTypes":[] }, {"name":"pid","parameterTypes":[] }]
Expand Down Expand Up @@ -276,6 +280,10 @@
"name":"java.security.AccessController",
"methods":[{"name":"doPrivileged","parameterTypes":["java.security.PrivilegedAction"] }, {"name":"doPrivileged","parameterTypes":["java.security.PrivilegedExceptionAction"] }]
},
{
"name":"java.util.Collections$UnmodifiableMap",
"fields":[{"name":"m"}]
},
{
"name":"java.util.Map"
},
Expand Down Expand Up @@ -616,29 +624,11 @@
"queryAllDeclaredMethods":true,
"queryAllPublicMethods":true
},
{
"name":"software.amazon.lambda.powertools.logging.internal.JsonSerializerTest",
"allDeclaredFields":true,
"allDeclaredClasses":true,
"queryAllDeclaredMethods":true,
"queryAllPublicMethods":true,
"queryAllDeclaredConstructors":true,
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"setUp","parameterTypes":[] }, {"name":"writeBigDecimal_shouldWriteBigDecimal","parameterTypes":[] }, {"name":"writeBoolean_shouldWriteBooleanValue","parameterTypes":[] }, {"name":"writeCustomObject_shouldWriteObjectAsJson","parameterTypes":[] }, {"name":"writeDouble_shouldWriteDoubleValue","parameterTypes":[] }, {"name":"writeFloat_shouldWriteFloatValue","parameterTypes":[] }, {"name":"writeInt_shouldWriteIntValue","parameterTypes":[] }, {"name":"writeJsonNodeObject_shouldWriteObjectAsJson","parameterTypes":[] }, {"name":"writeListObject_shouldWriteListAsArray","parameterTypes":[] }, {"name":"writeLong_shouldWriteLongValue","parameterTypes":[] }, {"name":"writeMapObject_shouldWriteMapAsJson","parameterTypes":[] }, {"name":"writeNull_shouldWriteNullValue","parameterTypes":[] }, {"name":"writeStringObject_shouldWriteStringWithQuotes","parameterTypes":[] }, {"name":"writeString_shouldWriteStringWithQuotes","parameterTypes":[] }, {"name":"writeTreeNodeArrayObject_shouldWriteObjectAsJson","parameterTypes":[] }, {"name":"writeTreeNodeObject_shouldWriteObjectAsJson","parameterTypes":[] }]
},
{
"name":"software.amazon.lambda.powertools.logging.internal.LambdaLoggingAspect",
"fields":[{"name":"LEVEL_AT_INITIALISATION"}],
"methods":[{"name":"setLogLevels","parameterTypes":["org.slf4j.event.Level"] }]
},
{
"name":"software.amazon.lambda.powertools.logging.internal.LambdaLoggingAspectTest",
"allDeclaredFields":true,
"allDeclaredClasses":true,
"queryAllDeclaredMethods":true,
"queryAllPublicMethods":true,
"queryAllDeclaredConstructors":true,
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"cleanUp","parameterTypes":[] }, {"name":"setUp","parameterTypes":[] }, {"name":"shouldClearStateWhenClearStateIsTrue","parameterTypes":[] }, {"name":"shouldHaveNoEffectIfNotUsedOnLambdaHandler","parameterTypes":[] }, {"name":"shouldLogCorrelationIdOnALBEvent","parameterTypes":["com.amazonaws.services.lambda.runtime.events.ApplicationLoadBalancerRequestEvent"] }, {"name":"shouldLogCorrelationIdOnAPIGatewayProxyRequestEvent","parameterTypes":["com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent"] }, {"name":"shouldLogCorrelationIdOnAPIGatewayV2HTTPEvent","parameterTypes":["com.amazonaws.services.lambda.runtime.events.APIGatewayV2HTTPEvent"] }, {"name":"shouldLogCorrelationIdOnAppSyncEvent","parameterTypes":[] }, {"name":"shouldLogCorrelationIdOnStreamHandler","parameterTypes":[] }, {"name":"shouldLogDebugWhenPowertoolsLevelEnvVarIsDebug","parameterTypes":[] }, {"name":"shouldLogDebugWhenSamplingEnvVarEqualsOne","parameterTypes":[] }, {"name":"shouldLogDebugWhenSamplingEqualsOne","parameterTypes":[] }, {"name":"shouldLogErrorForHandlerWhenEnvVariableSetToTrue","parameterTypes":[] }, {"name":"shouldLogErrorForHandlerWithLogErrorAnnotation","parameterTypes":[] }, {"name":"shouldLogErrorWhenPowertoolsLevelEnvVarIsError","parameterTypes":[] }, {"name":"shouldLogErrorWhenPowertoolsLevelEnvVarIsFatal","parameterTypes":[] }, {"name":"shouldLogEventForHandlerWhenEnvVariableSetToTrue","parameterTypes":[] }, {"name":"shouldLogEventForHandlerWithLogEventAnnotation","parameterTypes":[] }, {"name":"shouldLogEventForStreamHandler","parameterTypes":[] }, {"name":"shouldLogInfoWhenPowertoolsLevelEnvVarIsInfo","parameterTypes":[] }, {"name":"shouldLogInfoWhenPowertoolsLevelEnvVarIsInfoAndLambdaLevelVarIsWarn","parameterTypes":[] }, {"name":"shouldLogInfoWhenPowertoolsLevelEnvVarIsInvalid","parameterTypes":[] }, {"name":"shouldLogResponseForHandlerWhenEnvVariableSetToTrue","parameterTypes":[] }, {"name":"shouldLogResponseForHandlerWithLogResponseAnnotation","parameterTypes":[] }, {"name":"shouldLogResponseForStreamHandler","parameterTypes":[] }, {"name":"shouldLogServiceNameWhenEnvVarSet","parameterTypes":[] }, {"name":"shouldLogWarnWhenPowertoolsLevelEnvVarINotSetAndLambdaLevelVarIsWarn","parameterTypes":[] }, {"name":"shouldLogWarnWhenPowertoolsLevelEnvVarIsWarn","parameterTypes":[] }, {"name":"shouldLogWarnWhenPowertoolsLevelEnvVarIsWarnAndLambdaLevelVarIsInfo","parameterTypes":[] }, {"name":"shouldNotLogDebugWhenSamplingEnvVarIsInvalid","parameterTypes":[] }, {"name":"shouldNotLogDebugWhenSamplingEnvVarIsTooBig","parameterTypes":[] }, {"name":"shouldNotLogDebugWhenSamplingEqualsZero","parameterTypes":[] }, {"name":"shouldNotLogEventForHandlerWhenEnvVariableSetToFalse","parameterTypes":[] }, {"name":"shouldNotSetLambdaContextForStreamHandlerWhenDisabled","parameterTypes":[] }, {"name":"shouldNotSetLambdaContextWhenDisabled","parameterTypes":[] }, {"name":"shouldSetColdStartFlagOnFirstCallNotOnSecondCall","parameterTypes":[] }, {"name":"shouldSetLambdaContextForStreamHandlerWhenEnabled","parameterTypes":[] }, {"name":"shouldSetLambdaContextWhenEnabled","parameterTypes":[] }, {"name":"testMultipleLoggingManagers_shouldWarnAndSelectFirstOne","parameterTypes":[] }, {"name":"testNoLoggingManagers_shouldWarnAndCreateDefault","parameterTypes":[] }]
},
{
"name":"software.amazon.lambda.powertools.logging.internal.LoggingConstants",
"fields":[{"name":"LAMBDA_LOG_LEVEL"}, {"name":"POWERTOOLS_LOG_EVENT"}, {"name":"POWERTOOLS_LOG_LEVEL"}, {"name":"POWERTOOLS_SAMPLING_RATE"}]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,8 @@
import static org.apache.commons.lang3.reflect.FieldUtils.writeStaticField;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.contentOf;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.openMocks;
import static software.amazon.lambda.powertools.common.internal.SystemWrapper.getProperty;
import static software.amazon.lambda.powertools.common.internal.SystemWrapper.getenv;
import static software.amazon.lambda.powertools.logging.internal.PowertoolsLoggedFields.FUNCTION_ARN;
import static software.amazon.lambda.powertools.logging.internal.PowertoolsLoggedFields.FUNCTION_COLD_START;
import static software.amazon.lambda.powertools.logging.internal.PowertoolsLoggedFields.FUNCTION_MEMORY_SIZE;
Expand Down Expand Up @@ -62,6 +59,9 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junitpioneer.jupiter.ClearEnvironmentVariable;
import org.junitpioneer.jupiter.SetEnvironmentVariable;
import org.junitpioneer.jupiter.SetSystemProperty;
import org.mockito.Mock;
import org.mockito.MockedStatic;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This import is unused now.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The same for SystemWrapper in line 73.

import org.slf4j.Logger;
Expand Down Expand Up @@ -426,40 +426,31 @@ void shouldLogServiceNameWhenEnvVarSet() throws IllegalAccessException {
}

@Test
@ClearEnvironmentVariable(key = "_X_AMZN_TRACE_ID")
@SetSystemProperty(key = "com.amazonaws.xray.traceHeader", value = "Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1")
void shouldLogxRayTraceIdSystemPropertySet() {
String xRayTraceId = "1-5759e988-bd862e3fe1be46a994272793";

try (MockedStatic<SystemWrapper> mocked = mockStatic(SystemWrapper.class)) {
mocked.when(() -> getenv("_X_AMZN_TRACE_ID"))
.thenReturn(null);
mocked.when(() -> getProperty("com.amazonaws.xray.traceHeader"))
.thenReturn("Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1");

requestHandler.handleRequest(new Object(), context);
requestHandler.handleRequest(new Object(), context);

assertThat(MDC.getCopyOfContextMap())
.hasSize(EXPECTED_CONTEXT_SIZE + 1)
.containsEntry("xray_trace_id", xRayTraceId);
}
assertThat(MDC.getCopyOfContextMap())
.hasSize(EXPECTED_CONTEXT_SIZE + 1)
.containsEntry("xray_trace_id", xRayTraceId);
}

@Test
@SetEnvironmentVariable(key = "_X_AMZN_TRACE_ID", value = "Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1")
void shouldLogxRayTraceIdEnvVarSet() {
// GIVEN
String xRayTraceId = "1-5759e988-bd862e3fe1be46a994272793";

try (MockedStatic<SystemWrapper> mocked = mockStatic(SystemWrapper.class)) {
mocked.when(() -> getenv("_X_AMZN_TRACE_ID"))
.thenReturn("Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1");

// WHEN
requestHandler.handleRequest(new Object(), context);
// WHEN
requestHandler.handleRequest(new Object(), context);

// THEN
assertThat(MDC.getCopyOfContextMap())
.hasSize(EXPECTED_CONTEXT_SIZE + 1)
.containsEntry(FUNCTION_TRACE_ID.getName(), xRayTraceId);
}
// THEN
assertThat(MDC.getCopyOfContextMap())
.hasSize(EXPECTED_CONTEXT_SIZE + 1)
.containsEntry(FUNCTION_TRACE_ID.getName(), xRayTraceId);
}

@Test
Expand Down