Skip to content

feat: Add support for POWERTOOLS_LOGGER_LOG_EVENT #1510

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
5 changes: 0 additions & 5 deletions powertools-logging/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -129,11 +129,6 @@
<artifactId>jsonassert</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit-pioneer</groupId>
<artifactId>junit-pioneer</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public final class LambdaLoggingAspect {

private static final String LOG_LEVEL = System.getenv("POWERTOOLS_LOG_LEVEL");
private static final String SAMPLING_RATE = System.getenv("POWERTOOLS_LOGGER_SAMPLE_RATE");
private static final Boolean LOG_EVENT;
private static Boolean LOG_EVENT;

private static Level LEVEL_AT_INITIALISATION;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,6 @@

package software.amazon.lambda.powertools.logging.internal;

import static java.util.Collections.emptyMap;
import static java.util.Collections.singletonList;
import static java.util.stream.Collectors.joining;
import static org.apache.commons.lang3.reflect.FieldUtils.writeStaticField;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
import static org.mockito.Mockito.mockStatic;
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.core.internal.SystemWrapper.getProperty;
import static software.amazon.lambda.powertools.core.internal.SystemWrapper.getenv;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
Expand All @@ -37,45 +24,42 @@
import com.amazonaws.services.lambda.runtime.tests.annotations.Event;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.channels.FileChannel;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.ThreadContext;
import org.json.JSONException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junitpioneer.jupiter.SetEnvironmentVariable;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import software.amazon.lambda.powertools.core.internal.EnvironmentVariables;
import software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor;
import software.amazon.lambda.powertools.core.internal.SystemWrapper;
import software.amazon.lambda.powertools.logging.handlers.PowerLogToolApiGatewayHttpApiCorrelationId;
import software.amazon.lambda.powertools.logging.handlers.PowerLogToolApiGatewayRestApiCorrelationId;
import software.amazon.lambda.powertools.logging.handlers.PowerLogToolEnabled;
import software.amazon.lambda.powertools.logging.handlers.PowerLogToolEnabledForStream;
import software.amazon.lambda.powertools.logging.handlers.PowerToolDisabled;
import software.amazon.lambda.powertools.logging.handlers.PowerToolDisabledForStream;
import software.amazon.lambda.powertools.logging.handlers.PowerToolLogEventEnabled;
import software.amazon.lambda.powertools.logging.handlers.PowerToolLogEventEnabledForStream;
import software.amazon.lambda.powertools.logging.handlers.PowerToolLogEventEnabledWithCustomMapper;
import software.amazon.lambda.powertools.logging.handlers.PowertoolsLogAlbCorrelationId;
import software.amazon.lambda.powertools.logging.handlers.PowertoolsLogEnabledWithClearState;
import software.amazon.lambda.powertools.logging.handlers.PowertoolsLogEventBridgeCorrelationId;
import software.amazon.lambda.powertools.logging.handlers.*;

import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.channels.FileChannel;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import static java.util.Collections.emptyMap;
import static java.util.Collections.singletonList;
import static java.util.stream.Collectors.joining;
import static org.apache.commons.lang3.reflect.FieldUtils.writeStaticField;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
import static org.mockito.Mockito.mockStatic;
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.core.internal.SystemWrapper.getProperty;
import static software.amazon.lambda.powertools.core.internal.SystemWrapper.getenv;

class LambdaLoggingAspectTest {

Expand All @@ -91,6 +75,7 @@ void setUp() throws IllegalAccessException, IOException, NoSuchMethodException,
openMocks(this);
ThreadContext.clearAll();
writeStaticField(LambdaHandlerProcessor.class, "IS_COLD_START", null, true);
writeStaticField(LambdaLoggingAspect.class, "LOG_EVENT", Boolean.TRUE, true);
setupContext();
requestHandler = new PowerLogToolEnabled();
requestStreamHandler = new PowerLogToolEnabledForStream();
Expand Down Expand Up @@ -180,7 +165,6 @@ void shouldHaveNoEffectIfNotUsedOnLambdaHandler() {
}

@Test
@SetEnvironmentVariable(key = EnvironmentVariables.LOGGER.LOG_EVENT, value = "true")
void shouldLogEventForHandler() throws IOException, JSONException {
requestHandler = new PowerToolLogEventEnabled();
S3EventNotification s3EventNotification = s3EventNotification();
Expand All @@ -198,27 +182,24 @@ void shouldLogEventForHandler() throws IOException, JSONException {
assertEquals(expectEvent, event, false);
}

/**
* If POWERTOOLS_LOGGER_LOG_EVENT was set to false, the handler should log anything, despite @Logging(logEvent=true)
Copy link
Contributor

Choose a reason for hiding this comment

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

no, see my other comment

Copy link
Contributor

Choose a reason for hiding this comment

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

python is the ref, not typescript

* @throws IOException
*/
@Test
@SetEnvironmentVariable(key = EnvironmentVariables.LOGGER.LOG_EVENT, value = "false")
void shouldNotLogEventForHandlerWhenEnvVariableSetToFalse() throws IOException, JSONException {
void shouldNotLogEventForHandlerWhenEnvVariableSetToFalse() throws IOException, IllegalAccessException {
writeStaticField(LambdaLoggingAspect.class, "LOG_EVENT", Boolean.FALSE, true);

requestHandler = new PowerToolLogEventEnabled();
S3EventNotification s3EventNotification = s3EventNotification();

requestHandler.handleRequest(s3EventNotification, context);

Map<String, Object> log = parseToMap(Files.lines(Paths.get("target/logfile.json")).collect(joining()));

String event = (String) log.get("message");

String expectEvent = new BufferedReader(
new InputStreamReader(this.getClass().getResourceAsStream("/s3EventNotification.json")))
.lines().collect(joining("\n"));

assertEquals(expectEvent, event, false);
String s = Files.lines(Paths.get("target/logfile.json")).collect(joining());
assertThat(s).isEmpty();
}

@Test
@SetEnvironmentVariable(key = EnvironmentVariables.LOGGER.LOG_EVENT, value = "true")
void shouldLogEventForHandlerWithOverriddenObjectMapper() throws IOException, JSONException {
RequestHandler<S3EventNotification, Object> handler = new PowerToolLogEventEnabledWithCustomMapper();
S3EventNotification s3EventNotification = s3EventNotification();
Expand All @@ -237,7 +218,6 @@ void shouldLogEventForHandlerWithOverriddenObjectMapper() throws IOException, JS
}

@Test
@SetEnvironmentVariable(key = EnvironmentVariables.LOGGER.LOG_EVENT, value = "true")
void shouldLogEventForStreamAndLambdaStreamIsValid() throws IOException, JSONException {
requestStreamHandler = new PowerToolLogEventEnabledForStream();
ByteArrayOutputStream output = new ByteArrayOutputStream();
Expand Down