From a2380dfc08b2f648f2ef663c705eb6b6d51293a3 Mon Sep 17 00:00:00 2001 From: Georgi Date: Tue, 4 Feb 2025 17:54:14 +0100 Subject: [PATCH] [WIP] support arm 64 --- .github/workflows/integration_test.yml | 2 +- .github/workflows/trace_forwarder.yml | 2 +- .gitignore | 1 + aws/logs_monitoring/template.yaml | 2 ++ aws/logs_monitoring/tools/Dockerfile_bundle | 2 +- aws/logs_monitoring/tools/build_bundle.sh | 6 +++--- .../tools/integration_tests/integration_tests.sh | 4 ++-- aws/logs_monitoring/trace_forwarder/Dockerfile | 2 +- .../scripts/build_linux_go_bin.sh | 6 +++--- .../trace_forwarder/scripts/run_tests.sh | 2 +- aws/rds_enhanced_monitoring.zip | Bin 9155 -> 0 bytes aws/vpc_flow_log_monitoring.zip | Bin 3908 -> 0 bytes 12 files changed, 16 insertions(+), 13 deletions(-) delete mode 100644 aws/rds_enhanced_monitoring.zip delete mode 100644 aws/vpc_flow_log_monitoring.zip diff --git a/.github/workflows/integration_test.yml b/.github/workflows/integration_test.yml index 5eb8aaf02..275f8d715 100644 --- a/.github/workflows/integration_test.yml +++ b/.github/workflows/integration_test.yml @@ -17,7 +17,7 @@ on: [pull_request] jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-latest-arm64 continue-on-error: true strategy: max-parallel: 4 diff --git a/.github/workflows/trace_forwarder.yml b/.github/workflows/trace_forwarder.yml index f19d608b2..13811d7e9 100644 --- a/.github/workflows/trace_forwarder.yml +++ b/.github/workflows/trace_forwarder.yml @@ -4,7 +4,7 @@ on: [pull_request] jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-latest-arm64 steps: - name: Checkout source uses: actions/checkout@v3 diff --git a/.gitignore b/.gitignore index 23594eeac..eea0788c3 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ base.zip .vscode **/node_modules .idea +*.zip diff --git a/aws/logs_monitoring/template.yaml b/aws/logs_monitoring/template.yaml index 7a9f2e88d..1b4963b38 100644 --- a/aws/logs_monitoring/template.yaml +++ b/aws/logs_monitoring/template.yaml @@ -409,6 +409,8 @@ Resources: - ZipFile: " " MemorySize: !Ref MemorySize Runtime: python3.12 + Architectures: + - arm64 Timeout: !Ref Timeout Tags: - Key: "dd_forwarder_version" diff --git a/aws/logs_monitoring/tools/Dockerfile_bundle b/aws/logs_monitoring/tools/Dockerfile_bundle index aa80f245e..2fe0b2879 100644 --- a/aws/logs_monitoring/tools/Dockerfile_bundle +++ b/aws/logs_monitoring/tools/Dockerfile_bundle @@ -7,7 +7,7 @@ WORKDIR /build COPY . . -RUN pip install -r requirements.txt -t . +RUN pip install --no-cache-dir -r requirements.txt -t . -U # Remove *.pyc files RUN find . -name \*.pyc -delete diff --git a/aws/logs_monitoring/tools/build_bundle.sh b/aws/logs_monitoring/tools/build_bundle.sh index 0ed2f5b32..b379dbfe4 100755 --- a/aws/logs_monitoring/tools/build_bundle.sh +++ b/aws/logs_monitoring/tools/build_bundle.sh @@ -64,11 +64,11 @@ docker_build_zip() { # between different python runtimes. temp_dir=$(mktemp -d) - docker buildx build --platform linux/amd64 --file "${DIR}/Dockerfile_bundle" -t "datadog-bundle:$1" .. --no-cache --build-arg "runtime=${PYTHON_VERSION}" + docker buildx build --platform linux/arm64 --file "${DIR}/Dockerfile_bundle" -t "datadog-bundle:$1" .. --no-cache --build-arg "runtime=${PYTHON_VERSION}" # Run the image by runtime tag, tar its generated `python` directory to sdout, # then extract it to a temp directory. - docker run --platform linux/amd64 "datadog-bundle:${1}" tar cf - . | tar -xf - -C "${temp_dir}" + docker run --platform linux/arm64 "datadog-bundle:${1}" tar cf - . | tar -xf - -C "${temp_dir}" # Zip to destination, and keep directory structure as based in $temp_dir (cd "${temp_dir}" && zip -q -r "${zip_destination}" ./) @@ -82,7 +82,7 @@ docker_build_zip() { # Run the image by runtime tag, tar its generated `python` directory to sdout, # then extract it to a temp directory. - docker run --platform linux/amd64 datadog-bundle:$1 tar cf - . | tar -xf - -C $temp_dir/$SUB_DIRECTORY + docker run --platform linux/arm64 datadog-bundle:$1 tar cf - . | tar -xf - -C $temp_dir/$SUB_DIRECTORY # Zip to destination, and keep directory structure as based in $temp_dir (cd "${temp_dir}" && zip -q -r "${layer_destination}" ./) diff --git a/aws/logs_monitoring/tools/integration_tests/integration_tests.sh b/aws/logs_monitoring/tools/integration_tests/integration_tests.sh index 3afd99ac2..f3932c2a8 100755 --- a/aws/logs_monitoring/tools/integration_tests/integration_tests.sh +++ b/aws/logs_monitoring/tools/integration_tests/integration_tests.sh @@ -152,9 +152,9 @@ cd $INTEGRATION_TESTS_DIR # Build Docker image of Forwarder for tests echo "Building Docker Image for Forwarder with tag datadog-log-forwarder:$PYTHON_VERSION" -docker buildx build --platform linux/amd64 --file "${INTEGRATION_TESTS_DIR}/forwarder/Dockerfile" -t "datadog-log-forwarder:$PYTHON_VERSION" ../../.forwarder --no-cache \ +docker buildx build --platform linux/arm64 --file "${INTEGRATION_TESTS_DIR}/forwarder/Dockerfile" -t "datadog-log-forwarder:$PYTHON_VERSION" ../../.forwarder --no-cache \ --build-arg forwarder='aws-dd-forwarder-0.0.0' \ - --build-arg image="public.ecr.aws/lambda/python:${PYTHON_VERSION_TAG}-x86_64" + --build-arg image="public.ecr.aws/lambda/python:${PYTHON_VERSION_TAG}-arm64" echo "Running integration tests for ${PYTHON_VERSION}" LOG_LEVEL=${LOG_LEVEL} \ diff --git a/aws/logs_monitoring/trace_forwarder/Dockerfile b/aws/logs_monitoring/trace_forwarder/Dockerfile index 0825b53cd..b1af25835 100644 --- a/aws/logs_monitoring/trace_forwarder/Dockerfile +++ b/aws/logs_monitoring/trace_forwarder/Dockerfile @@ -7,7 +7,7 @@ RUN go get -u github.com/golang/dep/cmd/dep COPY . /go/src/github.com/DataDog/datadog-serverless-functions/aws/logs_monitoring/trace_forwarder/ WORKDIR /go/src/github.com/DataDog/datadog-serverless-functions/aws/logs_monitoring/trace_forwarder/ ENV GOOS=linux -ENV GOARCH=amd64 +ENV GOARCH=arm64 RUN dep ensure # Build the go binary diff --git a/aws/logs_monitoring/trace_forwarder/scripts/build_linux_go_bin.sh b/aws/logs_monitoring/trace_forwarder/scripts/build_linux_go_bin.sh index 969a08ddc..5998bf949 100755 --- a/aws/logs_monitoring/trace_forwarder/scripts/build_linux_go_bin.sh +++ b/aws/logs_monitoring/trace_forwarder/scripts/build_linux_go_bin.sh @@ -16,11 +16,11 @@ rm -rf ./bin # Install datadogpy in a docker container to avoid the mess from switching # between different python runtimes. -if [[ $(docker image ls | grep -c datadog-go-layer) -lt 1 ]]; then - docker buildx build --platform linux/amd64 -t datadog-go-layer . --no-cache --build-arg "runtime=python:3.12" +if [[ $(docker image ls | grep -c golang) -lt 1 ]]; then + docker buildx build --platform linux/arm64 -t golang . --no-cache --build-arg "runtime=python:3.12" fi -id=$(docker create --platform linux/amd64 datadog-go-layer) +id=$(docker create --platform linux/arm64 golang) docker cp "${id}:/go/src/github.com/DataDog/datadog-serverless-functions/aws/logs_monitoring/trace_forwarder/bin" . docker rm -v "${id}" echo "Done creating archive bin" diff --git a/aws/logs_monitoring/trace_forwarder/scripts/run_tests.sh b/aws/logs_monitoring/trace_forwarder/scripts/run_tests.sh index 4ba88503f..23ec52b22 100755 --- a/aws/logs_monitoring/trace_forwarder/scripts/run_tests.sh +++ b/aws/logs_monitoring/trace_forwarder/scripts/run_tests.sh @@ -11,5 +11,5 @@ set -e # Change to the parent of the directory this script is in cd $(dirname "$0")/.. -docker buildx build --platform linux/amd64 -t datadog-go-layer . --build-arg runtime=python:3.12 +docker buildx build --platform linux/arm64 -t datadog-go-layer . --build-arg runtime=python:3.12 docker run --rm datadog-go-layer go test -v ./... diff --git a/aws/rds_enhanced_monitoring.zip b/aws/rds_enhanced_monitoring.zip deleted file mode 100644 index edb47a86032d300c21f6faf613f145e4453cb8b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9155 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