This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ## Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. | |
| ## SPDX-License-Identifier: Apache-2.0 | |
| name: Python EC2 Gen AI Use Case | |
| on: | |
| workflow_dispatch: # be able to run the workflow on demand | |
| push: | |
| branches: | |
| - genesis-release-test | |
| workflow_call: | |
| inputs: | |
| caller-workflow-name: | |
| required: true | |
| type: string | |
| cpu-architecture: | |
| description: "Permitted values: x86_64 or arm64" | |
| required: false | |
| type: string | |
| default: "x86_64" | |
| staging-wheel-name: | |
| required: false | |
| default: 'aws-opentelemetry-distro' | |
| type: string | |
| permissions: | |
| id-token: write | |
| contents: read | |
| env: | |
| E2E_TEST_AWS_REGION: 'us-west-2' | |
| E2E_TEST_ACCOUNT_ID: ${{ secrets.APPLICATION_SIGNALS_E2E_TEST_ACCOUNT_ID }} | |
| E2E_TEST_ROLE_NAME: ${{ secrets.APPLICATION_SIGNALS_E2E_TEST_ROLE_NAME }} | |
| ADOT_WHEEL_NAME: ${{ inputs.staging-wheel-name }} | |
| METRIC_NAMESPACE: genesis | |
| LOG_GROUP_NAME: test/genesis | |
| TEST_RESOURCES_FOLDER: ${GITHUB_WORKSPACE} | |
| SAMPLE_APP_ZIP: s3://aws-appsignals-sample-app-prod-us-east-1/python-genai-sample-app.zip | |
| jobs: | |
| python-ec2-adot-genai: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set Get ADOT Wheel command environment variable | |
| run: echo GET_ADOT_WHEEL_COMMAND="aws s3 cp s3://adot-main-build-staging-jar/${{ env.ADOT_WHEEL_NAME }} ./${{ env.ADOT_WHEEL_NAME }} && sudo python${{ env.PYTHON_VERSION }} -m pip install ${{ env.ADOT_WHEEL_NAME }}" >> $GITHUB_ENV | |
| # if [ "${{ github.event.repository.name }}" = "aws-otel-python-instrumentation" ]; then | |
| # # Reusing the adot-main-build-staging-jar bucket to store the python wheel file | |
| # echo GET_ADOT_WHEEL_COMMAND="aws s3 cp s3://adot-main-build-staging-jar/${{ env.ADOT_WHEEL_NAME }} ./${{ env.ADOT_WHEEL_NAME }} && sudo python${{ env.PYTHON_VERSION }} -m pip install ${{ env.ADOT_WHEEL_NAME }}" >> $GITHUB_ENV | |
| # elif [ "${{ env.OTEL_SOURCE }}" == "pypi" ]; then | |
| # echo GET_ADOT_WHEEL_COMMAND="sudo python${{ env.PYTHON_VERSION }} -m pip install ${{ env.ADOT_WHEEL_NAME }}" >> $GITHUB_ENV | |
| # else | |
| # 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) | |
| # echo "The latest version is $latest_release_version" | |
| # 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 \ | |
| # && sudo python${{ env.PYTHON_VERSION }} -m pip install ${{ env.ADOT_WHEEL_NAME }}" >> $GITHUB_ENV | |
| # fi | |
| - name: Initiate Gradlew Daemon | |
| uses: ./.github/workflows/actions/execute_and_retry | |
| continue-on-error: true | |
| with: | |
| command: "./gradlew :validator:build" | |
| cleanup: "./gradlew clean" | |
| max_retry: 3 | |
| sleep_time: 60 | |
| - name: Generate testing id | |
| run: echo TESTING_ID="${{ github.run_id }}-${{ github.run_number }}-${RANDOM}" >> $GITHUB_ENV | |
| - name: Generate XRay and W3C trace ID | |
| run: | | |
| ID_1="$(printf '%08x' $(date +%s))" | |
| ID_2="$(openssl rand -hex 12)" | |
| W3C_TRACE_ID="${ID_1}${ID_2}" | |
| XRAY_TRACE_ID="1-${ID_1}-${ID_2}" | |
| echo "XRAY_TRACE_ID=${XRAY_TRACE_ID}" >> $GITHUB_ENV | |
| echo "W3C_TRACE_ID=${W3C_TRACE_ID}" >> $GITHUB_ENV | |
| echo "Generated XRay Trace ID: ${XRAY_TRACE_ID}" | |
| echo "Generated W3C Trace ID: ${W3C_TRACE_ID}" | |
| - name: Configure AWS Credentials | |
| uses: aws-actions/configure-aws-credentials@v4 | |
| with: | |
| role-to-assume: arn:aws:iam::${{ env.E2E_TEST_ACCOUNT_ID }}:role/${{ env.E2E_TEST_ROLE_NAME }} | |
| aws-region: ${{ env.E2E_TEST_AWS_REGION }} | |
| - name: Set up terraform | |
| uses: ./.github/workflows/actions/execute_and_retry | |
| with: | |
| command: "wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg" | |
| 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 | |
| && sudo apt update && sudo apt install terraform' | |
| - name: Initiate Terraform | |
| uses: ./.github/workflows/actions/execute_and_retry | |
| with: | |
| command: "cd ${{ env.TEST_RESOURCES_FOLDER }}/terraform/python/ec2/adot-genai && terraform init && terraform validate" | |
| cleanup: "rm -rf .terraform && rm -rf .terraform.lock.hcl" | |
| max_retry: 6 | |
| - name: Deploy service via terraform | |
| working-directory: terraform/python/ec2/adot-genai | |
| run: | | |
| terraform apply -auto-approve \ | |
| -var="aws_region=${{ env.E2E_TEST_AWS_REGION }}" \ | |
| -var="test_id=${{ env.TESTING_ID }}" \ | |
| -var="service_zip_url=${{ env.SAMPLE_APP_ZIP }}" | |
| - name: Get deployment info | |
| working-directory: terraform/python/ec2/adot-genai | |
| run: | | |
| echo "INSTANCE_IP=$(terraform output langchain_service_public_ip)" >> $GITHUB_ENV | |
| echo "INSTANCE_ID=$(terraform output langchain_service_instance_id)" >> $GITHUB_ENV | |
| - name: Wait for Gen AI Chatbot service to be ready | |
| run: | | |
| echo "Waiting for service to be ready at http://${{ env.INSTANCE_IP }}:8000" | |
| for i in {1..60}; do | |
| if curl -f -s "http://${{ env.INSTANCE_IP }}:8000/health" > /dev/null 2>&1; then | |
| echo "Service is ready!" | |
| break | |
| fi | |
| echo "Attempt $i: Service not ready yet, waiting 10 seconds..." | |
| sleep 10 | |
| done | |
| # Final check | |
| if ! curl -f -s "http://${{ env.INSTANCE_IP }}:8000/health" > /dev/null 2>&1; then | |
| echo "Service failed to become ready after 10 minutes" | |
| exit 1 | |
| fi | |
| - name: Generate traffic | |
| run: | | |
| cd sample-apps/traffic-generator/genai | |
| chmod +x generate_traffic.sh | |
| export SERVER_URL="http://${{ env.INSTANCE_IP }}:8000" | |
| export NUM_REQUESTS="5" | |
| export DELAY_SECONDS="5" | |
| export TIMEOUT="30" | |
| export TRACE_ID="Root=${XRAY_TRACE_ID};Parent=$(openssl rand -hex 8);Sampled=1" | |
| ./generate_traffic.sh | |
| - name: Validate generated logs | |
| run: ./gradlew validator:run --args='-c python/ec2/adot-genai/log-validation.yml | |
| --testing-id ${{ env.TESTING_ID }} | |
| --endpoint http://${{ env.INSTANCE_IP }}:8000 | |
| --region ${{ env.E2E_TEST_AWS_REGION }} | |
| --metric-namespace ${{ env.METRIC_NAMESPACE }} | |
| --log-group ${{ env.LOG_GROUP_NAME }} | |
| --service-name langchain-traceloop-app | |
| --instance-id ${{ env.INSTANCE_ID }} | |
| --trace-id ${{ env.W3C_TRACE_ID }}' | |
| - name: Validate generated traces | |
| if: (success() || failure()) && !cancelled() | |
| run: ./gradlew validator:run --args='-c python/ec2/adot-genai/trace-validation.yml | |
| --testing-id ${{ env.TESTING_ID }} | |
| --endpoint http://${{ env.INSTANCE_IP }}:8000 | |
| --region ${{ env.E2E_TEST_AWS_REGION }} | |
| --metric-namespace ${{ env.METRIC_NAMESPACE }} | |
| --service-name langchain-traceloop-app | |
| --instance-id ${{ env.INSTANCE_ID }} | |
| --trace-id ${{ env.XRAY_TRACE_ID }}' | |
| - name: Wait for metrics to be published | |
| if: (success() || failure()) && !cancelled() | |
| run: | | |
| echo "Waiting 60 seconds to ensure EMF metrics are published to CloudWatch" | |
| sleep 60 | |
| - name: Validate generated metrics | |
| if: (success() || failure()) && !cancelled() | |
| run: ./gradlew validator:run --args='-c python/ec2/adot-genai/metric-validation.yml | |
| --testing-id ${{ env.TESTING_ID }} | |
| --endpoint http://${{ env.INSTANCE_IP }}:8000 | |
| --region ${{ env.E2E_TEST_AWS_REGION }} | |
| --metric-namespace ${{ env.METRIC_NAMESPACE }} | |
| --log-group ${{ env.LOG_GROUP_NAME }} | |
| --service-name langchain-traceloop-app | |
| --instance-id ${{ env.INSTANCE_ID }}' | |
| - name: Cleanup | |
| if: always() | |
| continue-on-error: true | |
| working-directory: terraform/python/ec2/adot-genai | |
| run: | | |
| terraform destroy -auto-approve \ | |
| -var="aws_region=${{ env.E2E_TEST_AWS_REGION }}" \ | |
| -var="test_id=${{ env.TESTING_ID }}" \ | |
| -var="service_zip_url=${{ env.SAMPLE_APP_ZIP }}" |