1
+ # # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ # # SPDX-License-Identifier: Apache-2.0
3
+
4
+ # This is a reusable workflow for running adaptive sampling validation test for App Signals.
5
+ # It is meant to be called from another workflow.
6
+ # Read more about reusable workflows: https://docs.github.com/en/actions/using-workflows/reusing-workflows#overview
7
+ name : Java EC2 Adaptive Sampling Use Case
8
+ on :
9
+ workflow_call :
10
+ inputs :
11
+ caller-workflow-name :
12
+ required : true
13
+ type : string
14
+
15
+ permissions :
16
+ id-token : write
17
+ contents : read
18
+
19
+ env :
20
+ E2E_TEST_AWS_REGION : us-west-2
21
+ CALLER_WORKFLOW_NAME : ${{ inputs.caller-workflow-name }}
22
+ SAMPLE_APP_FRONTEND_SERVICE_JAR : s3://aws-appsignals-sample-app-prod-us-west-2-adap/java-main-service-v11.jar
23
+ SAMPLE_APP_REMOTE_SERVICE_JAR : s3://aws-appsignals-sample-app-prod-us-west-2-adap/java-remote-service-v11.jar
24
+ E2E_TEST_ACCOUNT_ID : ${{ secrets.APPLICATION_SIGNALS_E2E_TEST_ACCOUNT_ID }}
25
+ E2E_TEST_ROLE_NAME : ${{ secrets.APPLICATION_SIGNALS_E2E_TEST_ROLE_NAME }}
26
+ TEST_RESOURCES_FOLDER : ${GITHUB_WORKSPACE}
27
+
28
+ jobs :
29
+ java-ec2-adaptive-sampling :
30
+ runs-on : ubuntu-latest
31
+ timeout-minutes : 30
32
+ steps :
33
+ - name : Generate testing id
34
+ run : echo TESTING_ID="${{ github.run_id }}-${{ github.run_number }}-${RANDOM}" >> $GITHUB_ENV
35
+
36
+ - uses : actions/checkout@v4
37
+ with :
38
+ repository : ' aws-observability/aws-application-signals-test-framework'
39
+ ref : ${{ env.CALLER_WORKFLOW_NAME == 'main-build' && 'main' || github.ref }}
40
+ fetch-depth : 0
41
+
42
+ - name : Initiate Gradlew Daemon
43
+ id : initiate-gradlew
44
+ uses : ./.github/workflows/actions/execute_and_retry
45
+ continue-on-error : true
46
+ with :
47
+ command : " ./gradlew :validator:build"
48
+ cleanup : " ./gradlew clean"
49
+ max_retry : 3
50
+ sleep_time : 60
51
+
52
+ - name : Configure AWS Credentials
53
+ uses : aws-actions/configure-aws-credentials@v4
54
+ with :
55
+ role-to-assume : arn:aws:iam::${{ env.E2E_TEST_ACCOUNT_ID }}:role/${{ env.E2E_TEST_ROLE_NAME }}
56
+ aws-region : us-east-1
57
+
58
+ - name : Retrieve account
59
+ uses : aws-actions/aws-secretsmanager-get-secrets@v1
60
+ with :
61
+ secret-ids : |
62
+ ACCOUNT_ID, adaptive-sampling-region-account/prod-${{ env.E2E_TEST_AWS_REGION }}
63
+
64
+ - name : Configure AWS Credentials
65
+ if : ${{ github.event.repository.name == 'aws-application-signals-test-framework' }}
66
+ uses : aws-actions/configure-aws-credentials@v4
67
+ with :
68
+ role-to-assume : arn:aws:iam::${{ env.ACCOUNT_ID }}:role/${{ env.E2E_TEST_ROLE_NAME }}
69
+ aws-region : ${{ env.E2E_TEST_AWS_REGION }}
70
+
71
+ - name : Set Get ADOT JAR command environment variable
72
+ run : |
73
+ if [ "${{ github.event.repository.name }}" = "aws-otel-java-instrumentation" ]; then
74
+ echo GET_ADOT_JAR_COMMAND="aws s3 cp s3://adot-main-build-staging-jar/aws-opentelemetry-agent.jar ./adot.jar" >> $GITHUB_ENV
75
+ else
76
+ echo GET_ADOT_JAR_COMMAND="wget -O adot.jar https://github.com/aws-observability/aws-otel-java-instrumentation/releases/latest/download/aws-opentelemetry-agent.jar" >> $GITHUB_ENV
77
+ fi
78
+
79
+ - name : Set Get CW Agent command environment variable
80
+ run : |
81
+ echo GET_CW_AGENT_RPM_COMMAND="wget -O cw-agent.rpm https://amazoncloudwatch-agent-${{ env.E2E_TEST_AWS_REGION }}.s3.${{ env.E2E_TEST_AWS_REGION }}.amazonaws.com/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm" >> $GITHUB_ENV
82
+
83
+ - name : Set up terraform
84
+ uses : ./.github/workflows/actions/execute_and_retry
85
+ with :
86
+ command : " wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg"
87
+ post-command : ' echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
88
+ && sudo apt update && sudo apt install terraform'
89
+ sleep_time : 60
90
+
91
+ - name : Initiate Terraform
92
+ uses : ./.github/workflows/actions/execute_and_retry
93
+ with :
94
+ command : " cd ${{ env.TEST_RESOURCES_FOLDER }}/terraform/java/ec2/adaptive-sampling && terraform init && terraform validate"
95
+ cleanup : " rm -rf .terraform && rm -rf .terraform.lock.hcl"
96
+ max_retry : 6
97
+ sleep_time : 60
98
+
99
+ - name : Deploy sample app via terraform and wait for endpoint to come online
100
+ working-directory : terraform/java/ec2/adaptive-sampling
101
+ run : |
102
+ retry_counter=0
103
+ max_retry=2
104
+ while [ $retry_counter -lt $max_retry ]; do
105
+ echo "Attempt $retry_counter"
106
+ deployment_failed=0
107
+ terraform apply -auto-approve \
108
+ -var="aws_region=${{ env.E2E_TEST_AWS_REGION }}" \
109
+ -var="test_id=${{ env.TESTING_ID }}" \
110
+ -var="sample_app_jar=${{ env.SAMPLE_APP_FRONTEND_SERVICE_JAR }}" \
111
+ -var="sample_remote_app_jar=${{ env.SAMPLE_APP_REMOTE_SERVICE_JAR }}" \
112
+ -var="get_cw_agent_rpm_command=${{ env.GET_CW_AGENT_RPM_COMMAND }}" \
113
+ -var="get_adot_jar_command=${{ env.GET_ADOT_JAR_COMMAND }}" \
114
+ || deployment_failed=$?
115
+
116
+ if [ $deployment_failed -eq 1 ]; then
117
+ echo "Terraform deployment was unsuccessful. Will attempt to retry deployment."
118
+ echo "Destroying terraform"
119
+ terraform destroy -auto-approve \
120
+ -var="test_id=${{ env.TESTING_ID }}"
121
+ retry_counter=$(($retry_counter+1))
122
+ else
123
+ break
124
+ fi
125
+
126
+ if [ $retry_counter -eq $max_retry ]; then
127
+ echo "Max retry reached, failed to deploy terraform and connect to the endpoint. Exiting code"
128
+ exit 1
129
+ fi
130
+ done
131
+
132
+ - name : Get the sample app and EC2 instance information
133
+ working-directory : terraform/java/ec2/adaptive-sampling
134
+ run : |
135
+ echo "MAIN_SERVICE_ENDPOINT=localhost:8080" >> $GITHUB_ENV
136
+ echo "REMOTE_SERVICE_IP=$(terraform output sample_app_remote_service_private_ip)" >> $GITHUB_ENV
137
+ echo "MAIN_SERVICE_INSTANCE_ID=$(terraform output main_service_instance_id)" >> $GITHUB_ENV
138
+ echo "EC2_INSTANCE_AMI=$(terraform output ec2_instance_ami)" >> $GITHUB_ENV
139
+
140
+ - name : Initiate Gradlew Daemon
141
+ if : steps.initiate-gradlew == 'failure'
142
+ uses : ./.github/workflows/actions/execute_and_retry
143
+ continue-on-error : true
144
+ with :
145
+ command : " ./gradlew :validator:build"
146
+ cleanup : " ./gradlew clean"
147
+ max_retry : 3
148
+ sleep_time : 60
149
+
150
+ - name : Validate traces generated through adaptive sampling
151
+ run : ./gradlew validator:run --args='-c java/ec2/adaptive-sampling/trace-validation.yml
152
+ --testing-id ${{ env.TESTING_ID }}
153
+ --endpoint http://${{ env.MAIN_SERVICE_ENDPOINT }}
154
+ --remote-service-deployment-name ${{ env.REMOTE_SERVICE_IP }}:8080
155
+ --region ${{ env.E2E_TEST_AWS_REGION }}
156
+ --account-id ${{ env.ACCOUNT_ID }}
157
+ --service-name main-${{ env.TESTING_ID }}
158
+ --remote-service-name remote-${{ env.TESTING_ID }}
159
+ --query-string ip=${{ env.REMOTE_SERVICE_IP }}
160
+ --instance-ami ${{ env.EC2_INSTANCE_AMI }}
161
+ --instance-id ${{ env.MAIN_SERVICE_INSTANCE_ID }}
162
+ --rollup'
163
+
164
+ - name : Refresh AWS Credentials
165
+ if : ${{ github.event.repository.name == 'aws-application-signals-test-framework' }}
166
+ uses : aws-actions/configure-aws-credentials@v4
167
+ with :
168
+ role-to-assume : arn:aws:iam::${{ env.ACCOUNT_ID }}:role/${{ env.E2E_TEST_ROLE_NAME }}
169
+ aws-region : ${{ env.E2E_TEST_AWS_REGION }}
170
+
171
+ # Ensures gap between terraform apply and destroy
172
+ - name : Sleep 10 seconds
173
+ if : always()
174
+ run : sleep 10
175
+
176
+ - name : Terraform destroy
177
+ if : always()
178
+ continue-on-error : true
179
+ working-directory : terraform/java/ec2/adaptive-sampling
180
+ run : |
181
+ terraform destroy -auto-approve \
182
+ -var="test_id=${{ env.TESTING_ID }}"
0 commit comments