@@ -88,6 +88,7 @@ def test_handle_event_request_happy_case(self):
8888 {},
8989 "invoked_function_arn" ,
9090 0 ,
91+ "tenant_id" ,
9192 bootstrap .StandardLogSink (),
9293 )
9394 self .lambda_runtime .post_invocation_result .assert_called_once_with (
@@ -111,6 +112,7 @@ def test_handle_event_request_invalid_client_context(self):
111112 {},
112113 "invoked_function_arn" ,
113114 0 ,
115+ "tenant_id" ,
114116 bootstrap .StandardLogSink (),
115117 )
116118 args , _ = self .lambda_runtime .post_invocation_error .call_args
@@ -152,6 +154,7 @@ def test_handle_event_request_invalid_cognito_idenity(self):
152154 "invalid_cognito_identity" ,
153155 "invoked_function_arn" ,
154156 0 ,
157+ "tenant_id" ,
155158 bootstrap .StandardLogSink (),
156159 )
157160 args , _ = self .lambda_runtime .post_invocation_error .call_args
@@ -194,6 +197,7 @@ def test_handle_event_request_invalid_event_body(self):
194197 {},
195198 "invoked_function_arn" ,
196199 0 ,
200+ "tenant_id" ,
197201 bootstrap .StandardLogSink (),
198202 )
199203 args , _ = self .lambda_runtime .post_invocation_error .call_args
@@ -238,6 +242,7 @@ def invalid_json_response(json_input, lambda_context):
238242 {},
239243 "invoked_function_arn" ,
240244 0 ,
245+ "tenant_id" ,
241246 bootstrap .StandardLogSink (),
242247 )
243248 args , _ = self .lambda_runtime .post_invocation_error .call_args
@@ -283,6 +288,7 @@ def __init__(self, message):
283288 {},
284289 "invoked_function_arn" ,
285290 0 ,
291+ "tenant_id" ,
286292 bootstrap .StandardLogSink (),
287293 )
288294 args , _ = self .lambda_runtime .post_invocation_error .call_args
@@ -335,6 +341,7 @@ def __init__(self, message):
335341 {},
336342 "invoked_function_arn" ,
337343 0 ,
344+ "tenant_id" ,
338345 bootstrap .StandardLogSink (),
339346 )
340347 args , _ = self .lambda_runtime .post_invocation_error .call_args
@@ -386,6 +393,7 @@ def unable_to_import_module(json_input, lambda_context):
386393 {},
387394 "invoked_function_arn" ,
388395 0 ,
396+ "tenant_id" ,
389397 bootstrap .StandardLogSink (),
390398 )
391399 args , _ = self .lambda_runtime .post_invocation_error .call_args
@@ -425,6 +433,7 @@ def raise_exception_handler(json_input, lambda_context):
425433 {},
426434 "invoked_function_arn" ,
427435 0 ,
436+ "tenant_id" ,
428437 bootstrap .StandardLogSink (),
429438 )
430439 args , _ = self .lambda_runtime .post_invocation_error .call_args
@@ -475,15 +484,12 @@ def raise_exception_handler(json_input, lambda_context):
475484 {},
476485 "invoked_function_arn" ,
477486 0 ,
487+ "tenant_id" ,
478488 bootstrap .StandardLogSink (),
479489 )
480490
481491 # NOTE: Indentation characters are NO-BREAK SPACE (U+00A0) not SPACE (U+0020)
482- error_logs = (
483- lambda_unhandled_exception_warning_message
484- + "\n "
485- + "[ERROR] FaultExceptionType: Fault exception msg\r "
486- )
492+ error_logs = "[ERROR] FaultExceptionType: Fault exception msg\r "
487493 error_logs += "Traceback (most recent call last):\r "
488494 error_logs += ' File "spam.py", line 3, in <module>\r '
489495 error_logs += " spam.eggs()\r "
@@ -514,13 +520,10 @@ def raise_exception_handler(json_input, lambda_context):
514520 {},
515521 "invoked_function_arn" ,
516522 0 ,
523+ "tenant_id" ,
517524 bootstrap .StandardLogSink (),
518525 )
519- error_logs = (
520- lambda_unhandled_exception_warning_message
521- + "\n "
522- + "[ERROR] FaultExceptionType: Fault exception msg\r Traceback (most recent call last):\n "
523- )
526+ error_logs = "[ERROR] FaultExceptionType: Fault exception msg\r Traceback (most recent call last):\n "
524527
525528 self .assertEqual (mock_stdout .getvalue (), error_logs )
526529
@@ -546,13 +549,10 @@ def raise_exception_handler(json_input, lambda_context):
546549 {},
547550 "invoked_function_arn" ,
548551 0 ,
552+ "tenant_id" ,
549553 bootstrap .StandardLogSink (),
550554 )
551- error_logs = (
552- lambda_unhandled_exception_warning_message
553- + "\n "
554- + "[ERROR] FaultExceptionType\r Traceback (most recent call last):\n "
555- )
555+ error_logs = "[ERROR] FaultExceptionType\r Traceback (most recent call last):\n "
556556
557557 self .assertEqual (mock_stdout .getvalue (), error_logs )
558558
@@ -578,13 +578,10 @@ def raise_exception_handler(json_input, lambda_context):
578578 {},
579579 "invoked_function_arn" ,
580580 0 ,
581+ "tenant_id" ,
581582 bootstrap .StandardLogSink (),
582583 )
583- error_logs = (
584- lambda_unhandled_exception_warning_message
585- + "\n "
586- + "[ERROR] Fault exception msg\r Traceback (most recent call last):\n "
587- )
584+ error_logs = "[ERROR] Fault exception msg\r Traceback (most recent call last):\n "
588585
589586 self .assertEqual (mock_stdout .getvalue (), error_logs )
590587
@@ -619,9 +616,10 @@ def raise_exception_handler(json_input, lambda_context):
619616 {},
620617 "invoked_function_arn" ,
621618 0 ,
619+ "tenant_id" ,
622620 bootstrap .StandardLogSink (),
623621 )
624- error_logs = lambda_unhandled_exception_warning_message + " \n [ERROR]\r "
622+ error_logs = " [ERROR]\r "
625623 error_logs += "Traceback (most recent call last):\r "
626624 error_logs += ' File "spam.py", line 3, in <module>\r '
627625 error_logs += " spam.eggs()\r "
@@ -652,25 +650,16 @@ def raise_exception_handler(json_input, lambda_context):
652650 {},
653651 "invoked_function_arn" ,
654652 0 ,
653+ "tenant_id" ,
655654 bootstrap .StandardLogSink (),
656655 )
657656
658657 stdout_value = mock_stdout .getvalue ()
659- received_warning = stdout_value .split ("\n " )[0 ]
660- received_rest = stdout_value [len (received_warning ) + 1 :]
661-
662- warning = json .loads (received_warning )
663- self .assertEqual (warning ["level" ], "WARNING" )
664- self .assertEqual (warning ["message" ], lambda_unhandled_exception_warning_message )
665- self .assertEqual (warning ["logger" ], "root" )
666- self .assertIn ("timestamp" , warning )
667658
668659 # this line is not in json because of the way the test runtime is bootstrapped
669- error_logs = (
670- "\n [ERROR] FaultExceptionType\r Traceback (most recent call last):\n "
671- )
660+ error_logs = "[ERROR] FaultExceptionType\r Traceback (most recent call last):\n "
672661
673- self .assertEqual (received_rest , error_logs )
662+ self .assertEqual (stdout_value , error_logs )
674663
675664
676665class TestXrayFault (unittest .TestCase ):
@@ -868,6 +857,7 @@ def test_application_json(self):
868857 cognito_identity_json = None ,
869858 invoked_function_arn = "invocation-arn" ,
870859 epoch_deadline_time_in_ms = 1415836801003 ,
860+ tenant_id = None ,
871861 log_sink = bootstrap .StandardLogSink (),
872862 )
873863
@@ -887,6 +877,7 @@ def test_binary_request_binary_response(self):
887877 cognito_identity_json = None ,
888878 invoked_function_arn = "invocation-arn" ,
889879 epoch_deadline_time_in_ms = 1415836801003 ,
880+ tenant_id = None ,
890881 log_sink = bootstrap .StandardLogSink (),
891882 )
892883
@@ -906,6 +897,7 @@ def test_json_request_binary_response(self):
906897 cognito_identity_json = None ,
907898 invoked_function_arn = "invocation-arn" ,
908899 epoch_deadline_time_in_ms = 1415836801003 ,
900+ tenant_id = None ,
909901 log_sink = bootstrap .StandardLogSink (),
910902 )
911903
@@ -924,6 +916,7 @@ def test_binary_with_application_json(self):
924916 cognito_identity_json = None ,
925917 invoked_function_arn = "invocation-arn" ,
926918 epoch_deadline_time_in_ms = 1415836801003 ,
919+ tenant_id = None ,
927920 log_sink = bootstrap .StandardLogSink (),
928921 )
929922
@@ -1360,6 +1353,31 @@ def test_json_formatter(self, mock_stderr):
13601353 )
13611354 self .assertEqual (mock_stderr .getvalue (), "" )
13621355
1356+ @patch ("awslambdaric.bootstrap._GLOBAL_TENANT_ID" , "test-tenant-id" )
1357+ @patch ("sys.stderr" , new_callable = StringIO )
1358+ def test_json_formatter_with_tenant_id (self , mock_stderr ):
1359+ logger = logging .getLogger ("a.b" )
1360+ level = logging .INFO
1361+ message = "Test json formatting with tenant id"
1362+ expected = {
1363+ "level" : "INFO" ,
1364+ "logger" : "a.b" ,
1365+ "message" : message ,
1366+ "requestId" : "" ,
1367+ "tenantId" : "test-tenant-id" ,
1368+ }
1369+
1370+ with patch ("sys.stdout" , new_callable = StringIO ) as mock_stdout :
1371+ logger .log (level , message )
1372+
1373+ data = json .loads (mock_stdout .getvalue ())
1374+ data .pop ("timestamp" )
1375+ self .assertEqual (
1376+ data ,
1377+ expected ,
1378+ )
1379+ self .assertEqual (mock_stderr .getvalue (), "" )
1380+
13631381 @patch ("sys.stdout" , new_callable = StringIO )
13641382 @patch ("sys.stderr" , new_callable = StringIO )
13651383 def test_exception (self , mock_stderr , mock_stdout ):
0 commit comments