From 0c6614ebb5881caa8043ef3a03300accc72a52b0 Mon Sep 17 00:00:00 2001 From: Thomas Pierce Date: Tue, 10 Feb 2026 21:40:36 -0800 Subject: [PATCH] Add arm64 support for .NET e2e tests - Add cpu-architecture input parameter to dotnet-ec2-default-test workflow - Update terraform to support arm64 EC2 instances (t4g.small) - Make AMI selection architecture-aware - Make ADOT distro download architecture-aware - Make profiler path architecture-aware (linux-x64 vs linux-arm64) --- .github/workflows/dotnet-ec2-default-test.yml | 9 ++++++++- terraform/dotnet/ec2/default/main.tf | 18 ++++++++++++------ terraform/dotnet/ec2/default/variables.tf | 4 ++++ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/.github/workflows/dotnet-ec2-default-test.yml b/.github/workflows/dotnet-ec2-default-test.yml index 8cd89db99..d89daacf8 100644 --- a/.github/workflows/dotnet-ec2-default-test.yml +++ b/.github/workflows/dotnet-ec2-default-test.yml @@ -23,6 +23,11 @@ on: required: false type: string default: '8.0' + cpu-architecture: + description: "Permitted values: x86_64 or arm64" + required: false + type: string + default: "x86_64" outputs: job-started: value: ${{ jobs.dotnet-ec2-default.outputs.job-started }} @@ -96,12 +101,13 @@ jobs: - name: Set Get ADOT Distro command environment variable run: | + ARCH_SUFFIX=${{ inputs.cpu-architecture == 'arm64' && 'arm64' || 'x64' }} if [ "${{ env.REPOSITORY_NAME }}" = "aws-otel-dotnet-instrumentation" ]; then # Get staging distro file from staging bucket echo GET_ADOT_DISTRO_COMMAND="aws s3 cp s3://adot-autoinstrumentation-dotnet-staging/${{ env.ADOT_DISTRO_NAME }} ./${{ env.ADOT_DISTRO_NAME }} && unzip -d dotnet-distro ${{ env.ADOT_DISTRO_NAME }}" >> $GITHUB_ENV else # After Release will switch to latest tag instead of hard code version for canary purpose - echo GET_ADOT_DISTRO_COMMAND="wget -O aws-distro-opentelemetry-dotnet-instrumentation-linux-glibc-x64.zip https://github.com/aws-observability/aws-otel-dotnet-instrumentation/releases/latest/download/aws-distro-opentelemetry-dotnet-instrumentation-linux-glibc-x64.zip && unzip -d dotnet-distro aws-distro-opentelemetry-dotnet-instrumentation-linux-glibc-x64.zip" >> $GITHUB_ENV + echo GET_ADOT_DISTRO_COMMAND="wget -O aws-distro-opentelemetry-dotnet-instrumentation-linux-glibc-${ARCH_SUFFIX}.zip https://github.com/aws-observability/aws-otel-dotnet-instrumentation/releases/latest/download/aws-distro-opentelemetry-dotnet-instrumentation-linux-glibc-${ARCH_SUFFIX}.zip && unzip -d dotnet-distro aws-distro-opentelemetry-dotnet-instrumentation-linux-glibc-${ARCH_SUFFIX}.zip" >> $GITHUB_ENV fi - name: Set Get CW Agent command environment variable @@ -149,6 +155,7 @@ jobs: -var="get_cw_agent_rpm_command=${{ env.GET_CW_AGENT_RPM_COMMAND }}" \ -var="get_adot_distro_command=${{ env.GET_ADOT_DISTRO_COMMAND }}" \ -var="language_version=${{ env.DOTNET_VERSION }}" \ + -var="cpu_architecture=${{ inputs.cpu-architecture }}" \ || deployment_failed=$? if [ $deployment_failed -eq 1 ]; then diff --git a/terraform/dotnet/ec2/default/main.tf b/terraform/dotnet/ec2/default/main.tf index 7deb90499..a4338d347 100644 --- a/terraform/dotnet/ec2/default/main.tf +++ b/terraform/dotnet/ec2/default/main.tf @@ -46,7 +46,7 @@ data "aws_ami" "ami" { most_recent = true filter { name = "name" - values = ["al20*-ami-minimal-*-x86_64"] + values = ["al20*-ami-minimal-*-${var.cpu_architecture}"] } filter { name = "state" @@ -54,7 +54,7 @@ data "aws_ami" "ami" { } filter { name = "architecture" - values = ["x86_64"] + values = [var.cpu_architecture] } filter { name = "image-type" @@ -79,7 +79,7 @@ data "aws_ami" "ami" { resource "aws_instance" "main_service_instance" { ami = data.aws_ami.ami.id # Amazon Linux 2 (free tier) - instance_type = "t3.small" + instance_type = var.cpu_architecture == "x86_64" ? "t3.small" : "t4g.small" key_name = local.ssh_key_name iam_instance_profile = "APP_SIGNALS_EC2_TEST_ROLE" vpc_security_group_ids = [aws_default_vpc.default.default_security_group_id] @@ -140,12 +140,15 @@ resource "null_resource" "main_service_setup" { current_dir=$(pwd) echo $current_dir + # Set architecture-specific path + ARCH_PATH="${var.cpu_architecture == "x86_64" ? "linux-x64" : "linux-arm64"}" + # Export environment variables for instrumentation cd ./asp_frontend_service dotnet build export CORECLR_ENABLE_PROFILING=1 export CORECLR_PROFILER={918728DD-259F-4A6A-AC2B-B85E1B658318} - export CORECLR_PROFILER_PATH=$current_dir/dotnet-distro/linux-x64/OpenTelemetry.AutoInstrumentation.Native.so + export CORECLR_PROFILER_PATH=$current_dir/dotnet-distro/$ARCH_PATH/OpenTelemetry.AutoInstrumentation.Native.so export DOTNET_ADDITIONAL_DEPS=$current_dir/dotnet-distro/AdditionalDeps export DOTNET_SHARED_STORE=$current_dir/dotnet-distro/store export DOTNET_STARTUP_HOOKS=$current_dir/dotnet-distro/net/OpenTelemetry.AutoInstrumentation.StartupHook.dll @@ -188,7 +191,7 @@ resource "null_resource" "main_service_setup" { resource "aws_instance" "remote_service_instance" { ami = data.aws_ami.ami.id # Amazon Linux 2 (free tier) - instance_type = "t3.small" + instance_type = var.cpu_architecture == "x86_64" ? "t3.small" : "t4g.small" key_name = local.ssh_key_name iam_instance_profile = "APP_SIGNALS_EC2_TEST_ROLE" vpc_security_group_ids = [aws_default_vpc.default.default_security_group_id] @@ -249,12 +252,15 @@ resource "null_resource" "remote_service_setup" { current_dir=$(pwd) echo $current_dir + # Set architecture-specific path + ARCH_PATH="${var.cpu_architecture == "x86_64" ? "linux-x64" : "linux-arm64"}" + # Export environment variables for instrumentation cd ./asp_remote_service dotnet build export CORECLR_ENABLE_PROFILING=1 export CORECLR_PROFILER={918728DD-259F-4A6A-AC2B-B85E1B658318} - export CORECLR_PROFILER_PATH=$current_dir/dotnet-distro/linux-x64/OpenTelemetry.AutoInstrumentation.Native.so + export CORECLR_PROFILER_PATH=$current_dir/dotnet-distro/$ARCH_PATH/OpenTelemetry.AutoInstrumentation.Native.so export DOTNET_ADDITIONAL_DEPS=$current_dir/dotnet-distro/AdditionalDeps export DOTNET_SHARED_STORE=$current_dir/dotnet-distro/store export DOTNET_STARTUP_HOOKS=$current_dir/dotnet-distro/net/OpenTelemetry.AutoInstrumentation.StartupHook.dll diff --git a/terraform/dotnet/ec2/default/variables.tf b/terraform/dotnet/ec2/default/variables.tf index 15f86d058..83477bb8f 100644 --- a/terraform/dotnet/ec2/default/variables.tf +++ b/terraform/dotnet/ec2/default/variables.tf @@ -43,4 +43,8 @@ variable "canary_type" { variable "language_version" { default = "8.0" +} + +variable "cpu_architecture" { + default = "x86_64" } \ No newline at end of file