From 8cc11eba1f50f514e64ac575ebed8abdcee3abd8 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Wed, 1 Oct 2025 10:09:25 -0700 Subject: [PATCH 1/7] Run unittests twice daily to catch issues with ddtrace sooner. --- .github/workflows/build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d218bdefd..050624478 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,6 +5,8 @@ on: branches: - "main" pull_request: + schedule: + - cron: '0 0,12 * * *' # Runs every day at midnight and noon utc jobs: lint: From dd400420eabf26e15996ea9ada31b7511dca4186 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Wed, 1 Oct 2025 10:09:42 -0700 Subject: [PATCH 2/7] Testing for exception_replay_enabled. --- tests/test_wrapper.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 0083b3faa..7dea97488 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -789,3 +789,45 @@ def lambda_handler(event, context): self.mock_asm_start_response.assert_not_called() assert lambda_handler.span.get_tag("http.status_code") == "200" + + +@patch("datadog_lambda.config.Config.exception_replay_enabled", True) +def test_exception_replay_enabled(monkeypatch): + importlib.reload(wrapper) + + original_SpanExceptionHandler_enable = wrapper.SpanExceptionHandler.enable + SpanExceptionHandler_enable_calls = [] + + def SpanExceptionHandler_enable(*args, **kwargs): + SpanExceptionHandler_enable_calls.append((args, kwargs)) + return original_SpanExceptionHandler_enable(*args, **kwargs) + + original_SignalUploader_periodic = wrapper.SignalUploader.periodic + SignalUploader_periodic_calls = [] + + def SignalUploader_periodic(*args, **kwargs): + SignalUploader_periodic_calls.append((args, kwargs)) + return original_SignalUploader_periodic(*args, **kwargs) + + monkeypatch.setattr( + "datadog_lambda.wrapper.SpanExceptionHandler.enable", + SpanExceptionHandler_enable, + ) + monkeypatch.setattr( + "datadog_lambda.wrapper.SignalUploader.periodic", SignalUploader_periodic + ) + + expected_response = { + "statusCode": 200, + "body": "This should be returned", + } + + @wrapper.datadog_lambda_wrapper + def lambda_handler(event, context): + return expected_response + + response = lambda_handler({}, get_mock_context()) + + assert response == expected_response + assert len(SpanExceptionHandler_enable_calls) == 1 + assert len(SignalUploader_periodic_calls) == 1 From 6a2163ff4256af134df198f4e8d2fde5cc91d654 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Wed, 1 Oct 2025 10:20:00 -0700 Subject: [PATCH 3/7] Testing for profiling_enabled. --- tests/test_wrapper.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 7dea97488..71e5c778d 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -831,3 +831,34 @@ def lambda_handler(event, context): assert response == expected_response assert len(SpanExceptionHandler_enable_calls) == 1 assert len(SignalUploader_periodic_calls) == 1 + + +@patch("datadog_lambda.config.Config.profiling_enabled", True) +def test_profiling_enabled(monkeypatch): + importlib.reload(wrapper) + + original_Profiler_start = wrapper.profiler.Profiler.start + Profiler_start_calls = [] + + def Profiler_start(*args, **kwargs): + Profiler_start_calls.append((args, kwargs)) + return original_Profiler_start(*args, **kwargs) + + monkeypatch.setattr('datadog_lambda.wrapper.is_new_sandbox', lambda: True) + monkeypatch.setattr( + "datadog_lambda.wrapper.profiler.Profiler.start", Profiler_start + ) + + expected_response = { + "statusCode": 200, + "body": "This should be returned", + } + + @wrapper.datadog_lambda_wrapper + def lambda_handler(event, context): + return expected_response + + response = lambda_handler({}, get_mock_context()) + + assert response == expected_response + assert len(Profiler_start_calls) == 1 From 0e26b0564ad82d740dda364e808228cb7a858c93 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Wed, 1 Oct 2025 10:24:10 -0700 Subject: [PATCH 4/7] Tests for llmobs_enabled. --- tests/test_wrapper.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 71e5c778d..9b5ab3e4d 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -862,3 +862,41 @@ def lambda_handler(event, context): assert response == expected_response assert len(Profiler_start_calls) == 1 + + +@patch("datadog_lambda.config.Config.llmobs_enabled", True) +def test_llmobs_enabled(monkeypatch): + importlib.reload(wrapper) + + original_LLMObs_enable = wrapper.LLMObs.enable + LLMObs_enable_calls = [] + + def LLMObs_enable(*args, **kwargs): + LLMObs_enable_calls.append((args, kwargs)) + return original_LLMObs_enable(*args, **kwargs) + + original_LLMObs_flush = wrapper.LLMObs.flush + LLMObs_flush_calls = [] + + def LLMObs_flush(*args, **kwargs): + LLMObs_flush_calls.append((args, kwargs)) + return original_LLMObs_flush(*args, **kwargs) + + monkeypatch.setattr('datadog_lambda.wrapper.is_new_sandbox', lambda: True) + monkeypatch.setattr("datadog_lambda.wrapper.LLMObs.enable", LLMObs_enable) + monkeypatch.setattr("datadog_lambda.wrapper.LLMObs.flush", LLMObs_flush) + + expected_response = { + "statusCode": 200, + "body": "This should be returned", + } + + @wrapper.datadog_lambda_wrapper + def lambda_handler(event, context): + return expected_response + + response = lambda_handler({}, get_mock_context()) + + assert response == expected_response + assert len(LLMObs_enable_calls) == 1 + assert len(LLMObs_flush_calls) == 1 From 5cc6f51048233d05278dee8a69fccb2b06f56992 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Wed, 1 Oct 2025 10:28:10 -0700 Subject: [PATCH 5/7] Run linter. --- tests/test_wrapper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 9b5ab3e4d..94193a88d 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -844,7 +844,7 @@ def Profiler_start(*args, **kwargs): Profiler_start_calls.append((args, kwargs)) return original_Profiler_start(*args, **kwargs) - monkeypatch.setattr('datadog_lambda.wrapper.is_new_sandbox', lambda: True) + monkeypatch.setattr("datadog_lambda.wrapper.is_new_sandbox", lambda: True) monkeypatch.setattr( "datadog_lambda.wrapper.profiler.Profiler.start", Profiler_start ) @@ -882,7 +882,7 @@ def LLMObs_flush(*args, **kwargs): LLMObs_flush_calls.append((args, kwargs)) return original_LLMObs_flush(*args, **kwargs) - monkeypatch.setattr('datadog_lambda.wrapper.is_new_sandbox', lambda: True) + monkeypatch.setattr("datadog_lambda.wrapper.is_new_sandbox", lambda: True) monkeypatch.setattr("datadog_lambda.wrapper.LLMObs.enable", LLMObs_enable) monkeypatch.setattr("datadog_lambda.wrapper.LLMObs.flush", LLMObs_flush) From a4b9c9d72f66f1bc17bc06db676f6867c7633201 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Wed, 1 Oct 2025 10:31:12 -0700 Subject: [PATCH 6/7] Remove unneded monkeypatch. --- datadog_lambda/wrapper.py | 4 ++++ tests/test_wrapper.py | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index de24d71d4..0cbedd9f7 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -46,6 +46,10 @@ extract_http_status_code_tag, ) +# ddtrace imports are also tested in +# dd-trace-py/tests/internal/test_serverless.py please update those tests when +# making changes to any ddtrace import. + if config.appsec_enabled: from datadog_lambda.asm import ( asm_set_context, diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 94193a88d..fe7678ac3 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -882,7 +882,6 @@ def LLMObs_flush(*args, **kwargs): LLMObs_flush_calls.append((args, kwargs)) return original_LLMObs_flush(*args, **kwargs) - monkeypatch.setattr("datadog_lambda.wrapper.is_new_sandbox", lambda: True) monkeypatch.setattr("datadog_lambda.wrapper.LLMObs.enable", LLMObs_enable) monkeypatch.setattr("datadog_lambda.wrapper.LLMObs.flush", LLMObs_flush) From fc49a66937651197b1ce9ca29ee54fc3709efc00 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Wed, 1 Oct 2025 11:22:52 -0700 Subject: [PATCH 7/7] Increase layer size allowance. --- scripts/check_layer_size.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/check_layer_size.sh b/scripts/check_layer_size.sh index b074d74e4..ce67d92d9 100755 --- a/scripts/check_layer_size.sh +++ b/scripts/check_layer_size.sh @@ -8,7 +8,7 @@ # Compares layer size to threshold, and fails if below that threshold set -e -MAX_LAYER_COMPRESSED_SIZE_KB=$(expr 17 \* 1024 / 2) # 8704 KB +MAX_LAYER_COMPRESSED_SIZE_KB=$(expr 9 \* 1024) # 9216 KB MAX_LAYER_UNCOMPRESSED_SIZE_KB=$(expr 25 \* 1024) # 25600 KB