Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,9 @@ public int getMemoryLimitInMB() {
public LambdaLogger getLogger() {
return null;
}

@Override
public String getTenantId() {
return "test-tenant";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import static software.amazon.lambda.powertools.logging.internal.PowertoolsLoggedFields.FUNCTION_VERSION;
import static software.amazon.lambda.powertools.logging.internal.PowertoolsLoggedFields.SAMPLING_RATE;
import static software.amazon.lambda.powertools.logging.internal.PowertoolsLoggedFields.SERVICE;
import static software.amazon.lambda.powertools.logging.internal.PowertoolsLoggedFields.TENANT_ID;

import java.io.IOException;
import java.util.Collections;
Expand Down Expand Up @@ -186,6 +187,23 @@ public void resolve(LogEvent logEvent, JsonWriter jsonWriter) {
}
};

private static final EventResolver TENANT_ID_RESOLVER = new EventResolver() {
@Override
public boolean isResolvable(LogEvent logEvent) {
final String tenantId =
logEvent.getContextData().getValue(PowertoolsLoggedFields.TENANT_ID.getName());
return null != tenantId && !tenantId.isEmpty();
}

@Override
public void resolve(LogEvent logEvent, JsonWriter jsonWriter) {
final String tenantId =
logEvent.getContextData().getValue(PowertoolsLoggedFields.TENANT_ID.getName());
jsonWriter.writeString(tenantId);
}
};


@SuppressWarnings("java:S106")
private static final EventResolver NON_POWERTOOLS_FIELD_RESOLVER =
(LogEvent logEvent, JsonWriter jsonWriter) -> {
Expand Down Expand Up @@ -233,6 +251,7 @@ public void resolve(LogEvent logEvent, JsonWriter jsonWriter) {
{ FUNCTION_TRACE_ID.getName(), XRAY_TRACE_RESOLVER },
{ CORRELATION_ID.getName(), CORRELATION_ID_RESOLVER },
{ SAMPLING_RATE.getName(), SAMPLING_RATE_RESOLVER },
{ TENANT_ID.getName(), TENANT_ID_RESOLVER },
{ "region", REGION_RESOLVER },
{ "account_id", ACCOUNT_ID_RESOLVER }
}).collect(Collectors.toMap(data -> (String) data[0], data -> (EventResolver) data[1])));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,11 @@
"$resolver": "powertools",
"field": "correlation_id"
},
"tenant.id": {
"$resolver": "powertools",
"field": "tenant_id"
},
"": {
"$resolver": "powertools"
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,11 @@
"$resolver": "powertools",
"field": "correlation_id"
},
"tenant_id": {
"$resolver": "powertools",
"field": "tenant_id"
},
"": {
"$resolver": "powertools"
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import static software.amazon.lambda.powertools.logging.internal.PowertoolsLoggedFields.FUNCTION_TRACE_ID;
import static software.amazon.lambda.powertools.logging.internal.PowertoolsLoggedFields.FUNCTION_VERSION;
import static software.amazon.lambda.powertools.logging.logback.JsonUtils.*;
import static software.amazon.lambda.powertools.logging.internal.PowertoolsLoggedFields.TENANT_ID;

import ch.qos.logback.classic.pattern.ThrowableHandlingConverter;
import ch.qos.logback.classic.pattern.ThrowableProxyConverter;
Expand Down Expand Up @@ -72,6 +73,7 @@ public class LambdaEcsEncoder extends EncoderBase<ILoggingEvent> {
protected static final String FUNCTION_MEMORY_ATTR_NAME = "faas.memory";
protected static final String FUNCTION_TRACE_ID_ATTR_NAME = "trace.id";
protected static final String CORRELATION_ID_ATTR_NAME = "correlation.id";
protected static final String TENANT_ID_ATTR_NAME = "tenant.id";

protected static final String ECS_VERSION = "1.2.0";
protected static final String CLOUD_PROVIDER = "aws";
Expand Down Expand Up @@ -169,6 +171,12 @@ private void serializeFunctionInfo(JsonSerializer serializer, String arn, Map<St
serializer.writeRaw(',');
serializer.writeStringField(CORRELATION_ID_ATTR_NAME, correlationId);
}

String tenantId = mdcPropertyMap.get(TENANT_ID.getName());
if (tenantId != null && !tenantId.isEmpty()) {
serializer.writeRaw(',');
serializer.writeStringField(TENANT_ID_ATTR_NAME, tenantId);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,9 @@ private void serializePowertools(TreeMap<String, String> sortedMap, JsonSerializ
if (includePowertoolsInfo) {
for (Map.Entry<String, String> entry : sortedMap.entrySet()) {
if (PowertoolsLoggedFields.stringValues().contains(entry.getKey())
&& !(entry.getKey().equals(PowertoolsLoggedFields.SAMPLING_RATE.getName()) && entry.getValue().equals("0.0"))) {
&& !(entry.getKey().equals(PowertoolsLoggedFields.SAMPLING_RATE.getName()) && "0.0".equals(entry.getValue()))
&& !(entry.getKey().equals(PowertoolsLoggedFields.TENANT_ID.getName())
&& (entry.getValue() == null || entry.getValue().isEmpty()))) {
serializeMDCEntry(entry, serializer);
}
}
Expand Down Expand Up @@ -236,6 +238,7 @@ public void setIncludeThreadInfo(boolean includeThreadInfo) {
* <li>xray_trace_id</li>
* <li>sampling_rate</li>
* <li>service</li>
* <li>tenant_id</li>
* </ul>
* <br/>
* We strongly recommend to keep these information.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@ void shouldLogInJsonFormat() {
// THEN
File logFile = new File("target/logfile.json");
assertThat(contentOf(logFile)).contains(
"{\"level\":\"DEBUG\",\"message\":\"Test debug event\",\"cold_start\":true,\"function_arn\":\"arn:aws:lambda:us-east-1:123456789012:function:test\",\"function_memory_size\":128,\"function_name\":\"test-function\",\"function_request_id\":\"test-request-id\",\"function_version\":1,\"service\":\"testLogback\",\"xray_trace_id\":\"1-63441c4a-abcdef012345678912345678\",\"myKey\":\"myValue\",\"timestamp\":");
}
"{\"level\":\"DEBUG\",\"message\":\"Test debug event\",\"cold_start\":true,\"function_arn\":\"arn:aws:lambda:us-east-1:123456789012:function:test\",\"function_memory_size\":128,\"function_name\":\"test-function\",\"function_request_id\":\"test-request-id\",\"function_version\":1,\"service\":\"testLogback\",\"tenant_id\":\"test-tenant\",\"xray_trace_id\":\"1-63441c4a-abcdef012345678912345678\",\"myKey\":\"myValue\",\"timestamp\":\"");
}

@Test
void shouldLogArgumentsAsJsonWhenUsingRawJson() {
Expand Down Expand Up @@ -196,14 +196,16 @@ void shouldNotLogPowertoolsInfo() {
MDC.put(PowertoolsLoggedFields.FUNCTION_COLD_START.getName(), "false");
MDC.put(PowertoolsLoggedFields.SAMPLING_RATE.getName(), "0.2");
MDC.put(PowertoolsLoggedFields.SERVICE.getName(), "Service");
MDC.put(PowertoolsLoggedFields.TENANT_ID.getName(), "test-tenant");

// WHEN
byte[] encoded = encoder.encode(loggingEvent);
String result = new String(encoded, StandardCharsets.UTF_8);

// THEN
assertThat(result).contains(
"{\"level\":\"INFO\",\"message\":\"message\",\"cold_start\":false,\"function_arn\":\"arn:aws:lambda:us-east-1:123456789012:function:test\",\"function_memory_size\":128,\"function_name\":\"test-function\",\"function_request_id\":\"test-request-id\",\"function_version\":1,\"sampling_rate\":0.2,\"service\":\"Service\",\"timestamp\":");
"{\"level\":\"INFO\",\"message\":\"message\",\"cold_start\":false,\"function_arn\":\"arn:aws:lambda:us-east-1:123456789012:function:test\",\"function_memory_size\":128,\"function_name\":\"test-function\",\"function_request_id\":\"test-request-id\",\"function_version\":1,\"sampling_rate\":0.2,\"service\":\"Service\",\"tenant_id\":\"test-tenant\",\"timestamp\":\""
);

// WHEN (powertoolsInfo = false)
encoder.setIncludePowertoolsInfo(false);
Expand All @@ -212,7 +214,7 @@ void shouldNotLogPowertoolsInfo() {

// THEN (no powertools info in logs)
assertThat(result).doesNotContain("cold_start", "function_arn", "function_memory_size", "function_name",
"function_request_id", "function_version", "sampling_rate", "service");
"function_request_id", "function_version", "sampling_rate", "service", "tenant_id");
}

@Test
Expand Down Expand Up @@ -441,7 +443,9 @@ void shouldLogException() {
// THEN (stack is logged with root cause first)
assertThat(result).contains("\"message\":\"Unexpected value\"")
.contains("\"name\":\"java.lang.IllegalStateException\"")
.contains("\"stack\":\"java.lang.IllegalStateException: Unexpected value\\n");
.containsAnyOf(
"\"stack\":\"java.lang.IllegalStateException: Unexpected value\\n",
"\"stack\":\"java.lang.IllegalStateException: Unexpected value\\r\\n");
}

@Test
Expand Down Expand Up @@ -481,4 +485,33 @@ void shouldLogKeyValuePairs() {
;
}

@Test
void shouldNotLogTenantIdWhenNull() {
// GIVEN
LambdaJsonEncoder encoder = new LambdaJsonEncoder();
MDC.put(PowertoolsLoggedFields.TENANT_ID.getName(), null);

// WHEN
byte[] encoded = encoder.encode(loggingEvent);
String result = new String(encoded, StandardCharsets.UTF_8);

// THEN
assertThat(result).doesNotContain("tenant_id");
}

@Test
void shouldNotLogTenantIdWhenEmpty() {
// GIVEN
LambdaJsonEncoder encoder = new LambdaJsonEncoder();
MDC.put(PowertoolsLoggedFields.TENANT_ID.getName(), "");

// WHEN
byte[] encoded = encoder.encode(loggingEvent);
String result = new String(encoded, StandardCharsets.UTF_8);

// THEN
assertThat(result).doesNotContain("tenant_id");
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ public enum PowertoolsLoggedFields {
FUNCTION_TRACE_ID("xray_trace_id"),
SAMPLING_RATE("sampling_rate"),
CORRELATION_ID("correlation_id"),
SERVICE("service");
SERVICE("service"),
TENANT_ID("tenant_id");

private final String name;

Expand All @@ -55,6 +56,10 @@ public static Map<String, String> setValuesFromLambdaContext(Context context) {
hashMap.put(FUNCTION_ARN.name, context.getInvokedFunctionArn());
hashMap.put(FUNCTION_MEMORY_SIZE.name, String.valueOf(context.getMemoryLimitInMB()));
hashMap.put(FUNCTION_REQUEST_ID.name, String.valueOf(context.getAwsRequestId()));
String tenantId = context.getTenantId();
if (tenantId != null && !tenantId.isEmpty()) {
Comment thread
phipag marked this conversation as resolved.
hashMap.put(TENANT_ID.name, tenantId);
}

return hashMap;
}
Expand Down