Skip to content

test

test #5

## 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: sleep 120
- 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 }}"