Skip to content

Commit 30c667c

Browse files
author
Ramisa Alam
committed
feat: add tenant id to lambda context and structured log message
1 parent c5a4d2e commit 30c667c

File tree

11 files changed

+72
-4
lines changed

11 files changed

+72
-4
lines changed

aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/EventHandlerLoader.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,8 @@ public ByteArrayOutputStream call(InvocationRequest request) throws Error, Excep
581581
cognitoIdentity,
582582
LambdaEnvironment.FUNCTION_VERSION,
583583
request.getInvokedFunctionArn(),
584-
clientContext
584+
clientContext,
585+
request.getTenantId()
585586
);
586587

587588
safeAddContextToLambdaLogger(context);

aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/api/LambdaContext.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class LambdaContext implements Context {
2222
private final long deadlineTimeInMs;
2323
private final CognitoIdentity cognitoIdentity;
2424
private final ClientContext clientContext;
25+
private final String tenantId;
2526
private final LambdaLogger logger;
2627

2728
public LambdaContext(
@@ -34,7 +35,8 @@ public LambdaContext(
3435
CognitoIdentity identity,
3536
String functionVersion,
3637
String invokedFunctionArn,
37-
ClientContext clientContext
38+
ClientContext clientContext,
39+
String tenantId
3840
) {
3941
this.memoryLimit = memoryLimit;
4042
this.deadlineTimeInMs = deadlineTimeInMs;
@@ -46,6 +48,7 @@ public LambdaContext(
4648
this.clientContext = clientContext;
4749
this.functionVersion = functionVersion;
4850
this.invokedFunctionArn = invokedFunctionArn;
51+
this.tenantId = tenantId;
4952
this.logger = com.amazonaws.services.lambda.runtime.LambdaRuntime.getLogger();
5053
}
5154

@@ -91,6 +94,10 @@ public int getRemainingTimeInMillis() {
9194
return delta > 0 ? delta : 0;
9295
}
9396

97+
public String getTenantId() {
98+
return tenantId;
99+
}
100+
94101
public LambdaLogger getLogger() {
95102
return logger;
96103
}

aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/logging/JsonLogFormatter.java

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ private StructuredLogMessage createLogMessage(String message, LogLevel logLevel)
4141

4242
if (lambdaContext != null) {
4343
msg.AWSRequestId = lambdaContext.getAwsRequestId();
44+
msg.tenantId = lambdaContext.getTenantId();
4445
}
4546
return msg;
4647
}

aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/logging/StructuredLogMessage.java

+1
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ class StructuredLogMessage {
1212
public String message;
1313
public LogLevel level;
1414
public String AWSRequestId;
15+
public String tenantId;
1516
}

aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/runtimeapi/dto/InvocationRequest.java

+13
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ public class InvocationRequest {
4040
*/
4141
private String cognitoIdentity;
4242

43+
/**
44+
* The tenant ID associated with the request.
45+
*/
46+
private String tenantId;
47+
4348
private byte[] content;
4449

4550
public String getId() {
@@ -94,6 +99,14 @@ public void setCognitoIdentity(String cognitoIdentity) {
9499
this.cognitoIdentity = cognitoIdentity;
95100
}
96101

102+
public String getTenantId() {
103+
return tenantId;
104+
}
105+
106+
public void setTenantId(String tenantId) {
107+
this.tenantId = tenantId;
108+
}
109+
97110
public byte[] getContent() {
98111
return content;
99112
}

aws-lambda-java-runtime-interface-client/src/main/jni/com_amazonaws_services_lambda_runtime_api_client_runtimeapi_NativeClient.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ static jfieldID contentField;
2020
static jfieldID clientContextField;
2121
static jfieldID cognitoIdentityField;
2222
static jfieldID xrayTraceIdField;
23+
static jfieldID tenantIdField;
2324

2425

2526
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
@@ -41,6 +42,7 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) {
4142
xrayTraceIdField = env->GetFieldID(invocationRequestClass , "xrayTraceId", "Ljava/lang/String;");
4243
clientContextField = env->GetFieldID(invocationRequestClass , "clientContext", "Ljava/lang/String;");
4344
cognitoIdentityField = env->GetFieldID(invocationRequestClass , "cognitoIdentity", "Ljava/lang/String;");
45+
tenantIdField = env->GetFieldID(invocationRequestClass, "tenantId", "Ljava/lang/String;");
4446

4547
return JNI_VERSION;
4648
}
@@ -106,6 +108,10 @@ JNIEXPORT jobject JNICALL Java_com_amazonaws_services_lambda_runtime_api_client_
106108
CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, cognitoIdentityField, env->NewStringUTF(response.cognito_identity.c_str())));
107109
}
108110

111+
if(response.tenant_id != ""){
112+
CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, tenantIdField, env->NewStringUTF(response.tenant_id.c_str())));
113+
}
114+
109115
bytes = reinterpret_cast<const jbyte*>(response.payload.c_str());
110116
CHECK_EXCEPTION(env, jArray = env->NewByteArray(response.payload.length()));
111117
CHECK_EXCEPTION(env, env->SetByteArrayRegion(jArray, 0, response.payload.length(), bytes));

aws-lambda-java-runtime-interface-client/src/main/jni/deps/aws-lambda-cpp-0.2.7/include/aws/lambda-runtime/runtime.h

+5
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ struct invocation_request {
6161
*/
6262
std::chrono::time_point<std::chrono::system_clock> deadline;
6363

64+
/**
65+
* Tenant ID of the current invocation.
66+
*/
67+
std::string tenant_id;
68+
6469
/**
6570
* The number of milliseconds left before lambda terminates the current execution.
6671
*/

aws-lambda-java-runtime-interface-client/src/main/jni/deps/aws-lambda-cpp-0.2.7/src/runtime.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ static constexpr auto CLIENT_CONTEXT_HEADER = "lambda-runtime-client-context";
4040
static constexpr auto COGNITO_IDENTITY_HEADER = "lambda-runtime-cognito-identity";
4141
static constexpr auto DEADLINE_MS_HEADER = "lambda-runtime-deadline-ms";
4242
static constexpr auto FUNCTION_ARN_HEADER = "lambda-runtime-invoked-function-arn";
43+
static constexpr auto TENANT_ID_HEADER = "lambda-runtime-aws-tenant-id";
4344

4445
enum Endpoints {
4546
INIT,
@@ -301,6 +302,10 @@ runtime::next_outcome runtime::get_next()
301302
req.payload.c_str(),
302303
static_cast<int64_t>(req.get_time_remaining().count()));
303304
}
305+
306+
if (resp.has_header(TENANT_ID_HEADER)) {
307+
req.tenant_id = resp.get_header(TENANT_ID_HEADER);
308+
}
304309
return next_outcome(req);
305310
}
306311

aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/api/client/api/LambdaContextTest.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public class LambdaContextTest {
1818
private static final String INVOKED_FUNCTION_ARN = "invoked-function-arn";
1919
private static final LambdaClientContext CLIENT_CONTEXT = new LambdaClientContext();
2020
public static final int MEMORY_LIMIT = 128;
21+
public static final String TENANT_ID = "tenant-id";
2122

2223
@Test
2324
public void getRemainingTimeInMillis() {
@@ -54,6 +55,6 @@ public void getRemainingTimeInMillis_Deadline() throws InterruptedException {
5455

5556
private LambdaContext createContextWithDeadline(long deadlineTimeInMs) {
5657
return new LambdaContext(MEMORY_LIMIT, deadlineTimeInMs, REQUEST_ID, LOG_GROUP_NAME, LOG_STREAM_NAME,
57-
FUNCTION_NAME, IDENTITY, FUNCTION_VERSION, INVOKED_FUNCTION_ARN, CLIENT_CONTEXT);
58+
FUNCTION_NAME, IDENTITY, FUNCTION_VERSION, INVOKED_FUNCTION_ARN, CLIENT_CONTEXT, TENANT_ID);
5859
}
5960
}

aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/api/client/logging/JsonLogFormatterTest.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ void testFormattingWithLambdaContext() {
2929
null,
3030
null,
3131
"function-arn",
32-
null
32+
null,
33+
"tenant-id"
3334
);
3435
assertFormatsString("test log", LogLevel.WARN, context);
3536
}
@@ -52,6 +53,7 @@ void assert_expected_log_message(StructuredLogMessage result, String message, Lo
5253

5354
if (context != null) {
5455
assertEquals(context.getAwsRequestId(), result.AWSRequestId);
56+
assertEquals(context.getTenantId(), result.tenantId);
5557
}
5658
}
5759
}

aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/api/client/runtimeapi/LambdaRuntimeApiClientImplTest.java

+26
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import static org.junit.jupiter.api.Assertions.assertEquals;
1616
import static org.junit.jupiter.api.Assertions.assertThrows;
1717
import com.amazonaws.services.lambda.runtime.api.client.runtimeapi.dto.ErrorRequest;
18+
import com.amazonaws.services.lambda.runtime.api.client.runtimeapi.dto.InvocationRequest;
1819
import com.amazonaws.services.lambda.runtime.api.client.runtimeapi.dto.StackElement;
1920
import com.amazonaws.services.lambda.runtime.api.client.runtimeapi.dto.XRayErrorCause;
2021
import com.amazonaws.services.lambda.runtime.api.client.runtimeapi.dto.XRayException;
@@ -333,6 +334,31 @@ public void nextTest() {
333334
}
334335
}
335336

337+
@Test
338+
public void nextWithTenantIdTest() {
339+
try {
340+
MockResponse mockResponse = new MockResponse();
341+
mockResponse.setResponseCode(HTTP_ACCEPTED);
342+
mockResponse.setHeader("lambda-runtime-aws-request-id", "1234567890");
343+
mockResponse.setHeader("Content-Type", "application/json");
344+
String expectedTenantId = "my-tenant-id";
345+
mockResponse.setHeader("lambda-runtime-aws-tenant-id", expectedTenantId);
346+
mockWebServer.enqueue(mockResponse);
347+
348+
InvocationRequest invocationRequest = lambdaRuntimeApiClientImpl.nextInvocation();
349+
assertEquals(expectedTenantId, invocationRequest.getTenantId());
350+
351+
RecordedRequest recordedRequest = mockWebServer.takeRequest();
352+
HttpUrl actualUrl = recordedRequest.getRequestUrl();
353+
String expectedUrl = "http://" + getHostnamePort() + "/2018-06-01/runtime/invocation/next";
354+
assertEquals(expectedUrl, actualUrl.toString());
355+
356+
String actualBody = recordedRequest.getBody().readUtf8();
357+
assertEquals("", actualBody);
358+
} catch(Exception e) {
359+
fail();
360+
}
361+
}
336362

337363
@Test
338364
public void createUrlMalformedTest() {

0 commit comments

Comments
 (0)