1+ # # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+ # # SPDX-License-Identifier: Apache-2.0
3+
4+ name : Python EC2 Gen AI Use Case
5+ on :
6+ workflow_dispatch : # be able to run the workflow on demand
7+
8+ workflow_call :
9+ inputs :
10+ caller-workflow-name :
11+ required : true
12+ type : string
13+ staging-wheel-name :
14+ required : false
15+ default : ' aws-opentelemetry-distro'
16+ type : string
17+
18+ permissions :
19+ id-token : write
20+ contents : read
21+
22+ env :
23+ E2E_TEST_AWS_REGION : ' us-west-2'
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+ ADOT_WHEEL_NAME : ${{ inputs.staging-wheel-name }}
27+ METRIC_NAMESPACE : genesis
28+ LOG_GROUP_NAME : test/genesis
29+ TEST_RESOURCES_FOLDER : ${GITHUB_WORKSPACE}
30+ SAMPLE_APP_ZIP : s3://aws-appsignals-sample-app-prod-us-east-1/python-genai-sample-app.zip
31+
32+ jobs :
33+ python-ec2-adot-genai :
34+ runs-on : ubuntu-latest
35+ timeout-minutes : 30
36+ steps :
37+ - uses : actions/checkout@v4
38+
39+ - name : Set Get ADOT Wheel command environment variable
40+ run : |
41+ if [ "${{ github.event.repository.name }}" = "aws-otel-python-instrumentation" ]; then
42+ # Reusing the adot-main-build-staging-jar bucket to store the python wheel file
43+ echo GET_ADOT_WHEEL_COMMAND="aws s3 cp s3://adot-main-build-staging-jar/${{ env.ADOT_WHEEL_NAME }} ./${{ env.ADOT_WHEEL_NAME }} && python3.12 -m pip install ${{ env.ADOT_WHEEL_NAME }}" >> $GITHUB_ENV
44+ elif [ "${{ env.OTEL_SOURCE }}" == "pypi" ]; then
45+ echo GET_ADOT_WHEEL_COMMAND="python3.12 -m pip install ${{ env.ADOT_WHEEL_NAME }}" >> $GITHUB_ENV
46+ else
47+ latest_release_version=$(curl -sL https://github.com/aws-observability/aws-otel-python-instrumentation/releases/latest | grep -oP '/releases/tag/v\K[0-9]+\.[0-9]+\.[0-9]+' | head -n 1)
48+ echo "The latest version is $latest_release_version"
49+ echo GET_ADOT_WHEEL_COMMAND="wget -O ${{ env.ADOT_WHEEL_NAME }} https://github.com/aws-observability/aws-otel-python-instrumentation/releases/latest/download/aws_opentelemetry_distro-$latest_release_version-py3-none-any.whl \
50+ && python3.12 -m pip install ${{ env.ADOT_WHEEL_NAME }}" >> $GITHUB_ENV
51+ fi
52+
53+ - name : Initiate Gradlew Daemon
54+ uses : ./.github/workflows/actions/execute_and_retry
55+ continue-on-error : true
56+ with :
57+ command : " ./gradlew :validator:build"
58+ cleanup : " ./gradlew clean"
59+ max_retry : 3
60+ sleep_time : 60
61+
62+ - name : Generate testing id
63+ run : echo TESTING_ID="${{ github.run_id }}-${{ github.run_number }}-${RANDOM}" >> $GITHUB_ENV
64+
65+ - name : Generate XRay and W3C trace ID
66+ run : |
67+ ID_1="$(printf '%08x' $(date +%s))"
68+ ID_2="$(openssl rand -hex 12)"
69+ W3C_TRACE_ID="${ID_1}${ID_2}"
70+ XRAY_TRACE_ID="1-${ID_1}-${ID_2}"
71+ PARENT_ID="$(openssl rand -hex 8)"
72+ TRACE_ID_HEADER="Root=${XRAY_TRACE_ID};Parent=${PARENT_ID};Sampled=1"
73+ echo "XRAY_TRACE_ID=${XRAY_TRACE_ID}" >> $GITHUB_ENV
74+ echo "W3C_TRACE_ID=${W3C_TRACE_ID}" >> $GITHUB_ENV
75+ echo "TRACE_ID_HEADER=${TRACE_ID_HEADER}" >> $GITHUB_ENV
76+ echo "Generated XRay Trace ID: ${XRAY_TRACE_ID}"
77+ echo "Generated W3C Trace ID: ${W3C_TRACE_ID}"
78+ echo "Generated Trace ID Header: ${TRACE_ID_HEADER}"
79+
80+ - name : Configure AWS Credentials
81+ uses : aws-actions/configure-aws-credentials@v4
82+ with :
83+ role-to-assume : arn:aws:iam::${{ env.E2E_TEST_ACCOUNT_ID }}:role/${{ env.E2E_TEST_ROLE_NAME }}
84+ aws-region : ${{ env.E2E_TEST_AWS_REGION }}
85+
86+ - name : Set up terraform
87+ uses : ./.github/workflows/actions/execute_and_retry
88+ with :
89+ command : " wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg"
90+ 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
91+ && sudo apt update && sudo apt install terraform'
92+
93+ - name : Initiate Terraform
94+ uses : ./.github/workflows/actions/execute_and_retry
95+ with :
96+ command : " cd ${{ env.TEST_RESOURCES_FOLDER }}/terraform/python/ec2/adot-genai && terraform init && terraform validate"
97+ cleanup : " rm -rf .terraform && rm -rf .terraform.lock.hcl"
98+ max_retry : 6
99+
100+ - name : Deploy service via terraform
101+ working-directory : terraform/python/ec2/adot-genai
102+ run : |
103+ terraform apply -auto-approve \
104+ -var="aws_region=${{ env.E2E_TEST_AWS_REGION }}" \
105+ -var="test_id=${{ env.TESTING_ID }}" \
106+ -var="service_zip_url=${{ env.SAMPLE_APP_ZIP }}" \
107+ -var="trace_id=${{ env.TRACE_ID_HEADER }}" \
108+ -var="get_adot_wheel_command=${{ env.GET_ADOT_WHEEL_COMMAND }}" \
109+
110+
111+ - name : Get deployment info
112+ working-directory : terraform/python/ec2/adot-genai
113+ run : |
114+ echo "INSTANCE_IP=$(terraform output langchain_service_public_ip)" >> $GITHUB_ENV
115+ echo "INSTANCE_ID=$(terraform output langchain_service_instance_id)" >> $GITHUB_ENV
116+
117+ - name : Waiting 5 Minutes for Gen AI service to be ready and emit logs, traces, and metrics
118+ run : sleep 300
119+
120+ - name : Validate generated logs
121+ run : ./gradlew validator:run --args='-c python/ec2/adot-genai/log-validation.yml
122+ --testing-id ${{ env.TESTING_ID }}
123+ --endpoint http://${{ env.INSTANCE_IP }}:8000
124+ --region ${{ env.E2E_TEST_AWS_REGION }}
125+ --metric-namespace ${{ env.METRIC_NAMESPACE }}
126+ --log-group ${{ env.LOG_GROUP_NAME }}
127+ --service-name langchain-traceloop-app
128+ --instance-id ${{ env.INSTANCE_ID }}
129+ --trace-id ${{ env.W3C_TRACE_ID }}'
130+
131+ - name : Validate generated traces
132+ if : (success() || failure()) && !cancelled()
133+ run : ./gradlew validator:run --args='-c python/ec2/adot-genai/trace-validation.yml
134+ --testing-id ${{ env.TESTING_ID }}
135+ --endpoint http://${{ env.INSTANCE_IP }}:8000
136+ --region ${{ env.E2E_TEST_AWS_REGION }}
137+ --metric-namespace ${{ env.METRIC_NAMESPACE }}
138+ --service-name langchain-traceloop-app
139+ --instance-id ${{ env.INSTANCE_ID }}
140+ --trace-id ${{ env.XRAY_TRACE_ID }}'
141+
142+ - name : Validate generated metrics
143+ if : (success() || failure()) && !cancelled()
144+ run : ./gradlew validator:run --args='-c python/ec2/adot-genai/metric-validation.yml
145+ --testing-id ${{ env.TESTING_ID }}
146+ --endpoint http://${{ env.INSTANCE_IP }}:8000
147+ --region ${{ env.E2E_TEST_AWS_REGION }}
148+ --metric-namespace ${{ env.METRIC_NAMESPACE }}
149+ --log-group ${{ env.LOG_GROUP_NAME }}
150+ --service-name langchain-traceloop-app
151+ --instance-id ${{ env.INSTANCE_ID }}'
152+
153+ - name : Cleanup
154+ if : always()
155+ continue-on-error : true
156+ working-directory : terraform/python/ec2/adot-genai
157+ run : |
158+ terraform destroy -auto-approve \
159+ -var="aws_region=${{ env.E2E_TEST_AWS_REGION }}" \
160+ -var="test_id=${{ env.TESTING_ID }}" \
161+ -var="service_zip_url=${{ env.SAMPLE_APP_ZIP }}" \
162+ -var="trace_id=${{ env.TRACE_ID_HEADER }}" \
163+ -var="get_adot_wheel_command=${{ env.GET_ADOT_WHEEL_COMMAND }}"
0 commit comments