From de9caa50ddfc6dede9f30d14664a0391e2e3aad2 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Thu, 19 Dec 2024 13:31:04 -0800 Subject: [PATCH 1/4] Use vendored version of requests package in layer. --- Dockerfile | 9 +++++++++ datadog_lambda/__init__.py | 10 ++++++++++ scripts/check_layer_size.sh | 2 +- tests/integration/handle.py | 9 +++++++-- 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 610fef38..91f2a046 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,6 +30,15 @@ RUN rm ./python/lib/$runtime/site-packages/ddtrace/internal/datadog/profiling/dd RUN rm ./python/lib/$runtime/site-packages/ddtrace/internal/datadog/profiling/stack_v2/_stack_v2.*.so RUN find . -name "*.dist-info" -type d | xargs rm -rf +# The requests package is available in the lambda runtime already as +# pip._vendor.requests. Before importing requests, `/path/to/pip/_vendor` must +# be added to `sys.path`. +RUN rm -rf \ + ./python/lib/$runtime/site-packages/requests* \ + ./python/lib/$runtime/site-packages/certifi* \ + ./python/lib/$runtime/site-packages/idna* \ + ./python/lib/$runtime/site-packages/charset_normalizer* + # Precompile all .pyc files and remove .py files. This speeds up load time. # Compile with optimization level 2 (-OO) and PYTHONNODEBUGRANGES=1 to redtce # size of .pyc files. diff --git a/datadog_lambda/__init__.py b/datadog_lambda/__init__.py index 378fd15c..a35eb4c3 100644 --- a/datadog_lambda/__init__.py +++ b/datadog_lambda/__init__.py @@ -1,3 +1,13 @@ +import sys + + +# The requests package is no longer included in the lambda layer, instead use +# the vendored version of requests included in the pip package. Appending to +# sys.path will make the vendered requests package discoverable. +for i in range(len(sys.path)): + path = sys.path[i] + sys.path.append(f"{path}/pip/_vendor") + from datadog_lambda.cold_start import initialize_cold_start_tracing import os diff --git a/scripts/check_layer_size.sh b/scripts/check_layer_size.sh index 90d5861b..977c0283 100755 --- a/scripts/check_layer_size.sh +++ b/scripts/check_layer_size.sh @@ -9,7 +9,7 @@ set -e MAX_LAYER_COMPRESSED_SIZE_KB=$(expr 5 \* 1024) -MAX_LAYER_UNCOMPRESSED_SIZE_KB=$(expr 13 \* 1024) +MAX_LAYER_UNCOMPRESSED_SIZE_KB=$(expr 12 \* 1024) LAYER_FILES_PREFIX="datadog_lambda_py" diff --git a/tests/integration/handle.py b/tests/integration/handle.py index 3590cb18..e485cdde 100644 --- a/tests/integration/handle.py +++ b/tests/integration/handle.py @@ -1,8 +1,9 @@ -import requests - from datadog_lambda.metric import lambda_metric from datadog_lambda.wrapper import datadog_lambda_wrapper +import requests +import time + @datadog_lambda_wrapper def handle(event, context): @@ -20,7 +21,11 @@ def handle(event, context): record_ids.append(record["Sns"]["MessageId"]) # Generate custom metrics + timestamp = time.time() - 60 lambda_metric("hello.dog", 1, tags=["team:serverless", "role:hello"]) + lambda_metric( + "hello.cat", 1, tags=["team:serverless", "role:hello"], timestamp=timestamp + ) lambda_metric( "tests.integration.count", 21, tags=["test:integration", "role:hello"] ) From 69d6f8e467e0a919579e82095d473b129b7f76e2 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Thu, 19 Dec 2024 14:42:49 -0800 Subject: [PATCH 2/4] Update integration test snapshots. --- .../logs/async-metrics_python310.log | 90 +++++++++++++++++++ .../logs/async-metrics_python311.log | 90 +++++++++++++++++++ .../logs/async-metrics_python312.log | 90 +++++++++++++++++++ .../snapshots/logs/async-metrics_python38.log | 90 +++++++++++++++++++ .../snapshots/logs/async-metrics_python39.log | 90 +++++++++++++++++++ 5 files changed, 450 insertions(+) diff --git a/tests/integration/snapshots/logs/async-metrics_python310.log b/tests/integration/snapshots/logs/async-metrics_python310.log index b3b94ca4..9d3f0be2 100644 --- a/tests/integration/snapshots/logs/async-metrics_python310.log +++ b/tests/integration/snapshots/logs/async-metrics_python310.log @@ -26,6 +26,16 @@ START "dd_lambda_layer:datadog-python310_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python310_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -198,6 +208,16 @@ START "dd_lambda_layer:datadog-python310_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python310_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -396,6 +416,16 @@ START "dd_lambda_layer:datadog-python310_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python310_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -555,6 +585,16 @@ START "dd_lambda_layer:datadog-python310_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python310_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -730,6 +770,16 @@ START "dd_lambda_layer:datadog-python310_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python310_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -896,6 +946,16 @@ START "dd_lambda_layer:datadog-python310_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python310_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -1071,6 +1131,16 @@ START "dd_lambda_layer:datadog-python310_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python310_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -1235,6 +1305,16 @@ START "dd_lambda_layer:datadog-python310_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python310_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -1398,6 +1478,16 @@ START "dd_lambda_layer:datadog-python310_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python310_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, diff --git a/tests/integration/snapshots/logs/async-metrics_python311.log b/tests/integration/snapshots/logs/async-metrics_python311.log index 5ea440b3..9d1ef2a2 100644 --- a/tests/integration/snapshots/logs/async-metrics_python311.log +++ b/tests/integration/snapshots/logs/async-metrics_python311.log @@ -26,6 +26,16 @@ START "dd_lambda_layer:datadog-python311_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python311_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -198,6 +208,16 @@ START "dd_lambda_layer:datadog-python311_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python311_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -396,6 +416,16 @@ START "dd_lambda_layer:datadog-python311_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python311_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -555,6 +585,16 @@ START "dd_lambda_layer:datadog-python311_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python311_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -730,6 +770,16 @@ START "dd_lambda_layer:datadog-python311_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python311_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -896,6 +946,16 @@ START "dd_lambda_layer:datadog-python311_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python311_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -1071,6 +1131,16 @@ START "dd_lambda_layer:datadog-python311_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python311_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -1235,6 +1305,16 @@ START "dd_lambda_layer:datadog-python311_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python311_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -1398,6 +1478,16 @@ START "dd_lambda_layer:datadog-python311_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python311_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, diff --git a/tests/integration/snapshots/logs/async-metrics_python312.log b/tests/integration/snapshots/logs/async-metrics_python312.log index ceaaa759..60ee0734 100644 --- a/tests/integration/snapshots/logs/async-metrics_python312.log +++ b/tests/integration/snapshots/logs/async-metrics_python312.log @@ -26,6 +26,16 @@ START "dd_lambda_layer:datadog-python312_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python312_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -198,6 +208,16 @@ START "dd_lambda_layer:datadog-python312_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python312_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -396,6 +416,16 @@ START "dd_lambda_layer:datadog-python312_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python312_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -555,6 +585,16 @@ START "dd_lambda_layer:datadog-python312_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python312_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -730,6 +770,16 @@ START "dd_lambda_layer:datadog-python312_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python312_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -896,6 +946,16 @@ START "dd_lambda_layer:datadog-python312_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python312_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -1071,6 +1131,16 @@ START "dd_lambda_layer:datadog-python312_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python312_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -1235,6 +1305,16 @@ START "dd_lambda_layer:datadog-python312_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python312_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -1398,6 +1478,16 @@ START "dd_lambda_layer:datadog-python312_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python312_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, diff --git a/tests/integration/snapshots/logs/async-metrics_python38.log b/tests/integration/snapshots/logs/async-metrics_python38.log index 3ce5c99d..f9be211a 100644 --- a/tests/integration/snapshots/logs/async-metrics_python38.log +++ b/tests/integration/snapshots/logs/async-metrics_python38.log @@ -26,6 +26,16 @@ START "dd_lambda_layer:datadog-python38_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python38_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -198,6 +208,16 @@ START "dd_lambda_layer:datadog-python38_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python38_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -396,6 +416,16 @@ START "dd_lambda_layer:datadog-python38_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python38_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -555,6 +585,16 @@ START "dd_lambda_layer:datadog-python38_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python38_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -730,6 +770,16 @@ START "dd_lambda_layer:datadog-python38_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python38_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -896,6 +946,16 @@ START "dd_lambda_layer:datadog-python38_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python38_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -1071,6 +1131,16 @@ START "dd_lambda_layer:datadog-python38_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python38_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -1235,6 +1305,16 @@ START "dd_lambda_layer:datadog-python38_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python38_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -1398,6 +1478,16 @@ START "dd_lambda_layer:datadog-python38_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python38_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, diff --git a/tests/integration/snapshots/logs/async-metrics_python39.log b/tests/integration/snapshots/logs/async-metrics_python39.log index ede453ff..4506d0d4 100644 --- a/tests/integration/snapshots/logs/async-metrics_python39.log +++ b/tests/integration/snapshots/logs/async-metrics_python39.log @@ -26,6 +26,16 @@ START "dd_lambda_layer:datadog-python39_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python39_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -198,6 +208,16 @@ START "dd_lambda_layer:datadog-python39_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python39_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -396,6 +416,16 @@ START "dd_lambda_layer:datadog-python39_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python39_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -555,6 +585,16 @@ START "dd_lambda_layer:datadog-python39_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python39_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -730,6 +770,16 @@ START "dd_lambda_layer:datadog-python39_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python39_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -896,6 +946,16 @@ START "dd_lambda_layer:datadog-python39_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python39_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -1071,6 +1131,16 @@ START "dd_lambda_layer:datadog-python39_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python39_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -1235,6 +1305,16 @@ START "dd_lambda_layer:datadog-python39_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python39_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, @@ -1398,6 +1478,16 @@ START "dd_lambda_layer:datadog-python39_X.X.X" ] } +{ + "m": "hello.cat", + "v": 1, + "e": XXXX, + "t": [ + "team:serverless", + "role:hello", + "dd_lambda_layer:datadog-python39_X.X.X" + ] +} { "m": "tests.integration.count", "v": 21, From 5ee2c8c0e0ac11cc8bdff6d7ce2a31fa89a84e37 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Thu, 19 Dec 2024 15:07:35 -0800 Subject: [PATCH 3/4] Ignore linting issue. --- datadog_lambda/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog_lambda/__init__.py b/datadog_lambda/__init__.py index a35eb4c3..cdf95625 100644 --- a/datadog_lambda/__init__.py +++ b/datadog_lambda/__init__.py @@ -1,3 +1,4 @@ +import os import sys @@ -8,8 +9,7 @@ path = sys.path[i] sys.path.append(f"{path}/pip/_vendor") -from datadog_lambda.cold_start import initialize_cold_start_tracing -import os +from datadog_lambda.cold_start import initialize_cold_start_tracing # noqa: E402 if os.environ.get("DD_INSTRUMENTATION_TELEMETRY_ENABLED") is None: From 591509d813a8f6ba143f11d8b1564d674a1810a2 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Thu, 19 Dec 2024 15:18:27 -0800 Subject: [PATCH 4/4] Github action to ensure vendored requests version. --- .github/workflows/check_dependencies.yml | 23 +++++++++++ scripts/check_dependencies.sh | 50 ++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 .github/workflows/check_dependencies.yml create mode 100755 scripts/check_dependencies.sh diff --git a/.github/workflows/check_dependencies.yml b/.github/workflows/check_dependencies.yml new file mode 100644 index 00000000..888212bb --- /dev/null +++ b/.github/workflows/check_dependencies.yml @@ -0,0 +1,23 @@ +name: Check Dependencies + +on: + pull_request: + +jobs: + check: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] + steps: + - uses: actions/checkout@v3 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Check Dependencies + run: | + PYTHON_VERSION=${{ matrix.python-version }} \ + ./scripts/check_dependencies.sh diff --git a/scripts/check_dependencies.sh b/scripts/check_dependencies.sh new file mode 100755 index 00000000..813e2822 --- /dev/null +++ b/scripts/check_dependencies.sh @@ -0,0 +1,50 @@ +#!/bin/bash -e + +# This script checks to make sure that the vendored version of requests shipped +# with pip meets the minimum required version of requests as defined by the +# datadog package. + +if [[ -z $PYTHON_VERSION ]]; then + PYTHON_VERSION=latest +fi + +# create virtual environment +rm -rf venv +pip install virtualenv +virtualenv venv +source venv/bin/activate + +# determine highest available version of requests +pip install . +highest=$(pip freeze | grep requests | tr -d 'requests==') +echo "Highest available version of requests: $highest" + +# determine minumum required version of requests +pip uninstall -y requests +pip install uv +uv pip install --resolution=lowest . +lowest=$(pip freeze | grep requests | tr -d 'requests==') +echo "Minimum required version of requests: $lowest" + +# determine version of requests packaged with pip +vendored=$( + docker run \ + --entrypoint='' \ + public.ecr.aws/lambda/python:$PYTHON_VERSION \ + python -c "import pip._vendor.requests; print(pip._vendor.requests.__version__)" +) +echo "Version of vendored requests: $vendored" + +# compare versions +compared=$(python -c " +parse = lambda v: tuple(map(int, v.split('.'))) +print(parse('$lowest') <= parse('$vendored'))") + +if [[ "$compared" == "True" ]]; then + echo "The vendored version of requests meets the minimum requirement" + echo " lowest required ($lowest) <= vendored version ($vendored) <= highest available ($highest)" +else + echo "The vendored version of requests does not meet the minimum requirement" + echo " vendered version ($vendored) < lowest required ($lowest) <= highest available ($highest)" + exit 1 +fi