From e74800c03831c5546da62084c866b866d36d97f0 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 17:55:20 -0700 Subject: [PATCH 01/46] add nightly build with scripts --- .github/workflows/nightly-build.yml | 115 ++++++++++++++++++++++++++++ scripts/get_upstream_versions.py | 46 +++++++++++ scripts/update_dependencies.py | 109 ++++++++++++++++++++++++++ 3 files changed, 270 insertions(+) create mode 100644 .github/workflows/nightly-build.yml create mode 100644 scripts/get_upstream_versions.py create mode 100644 scripts/update_dependencies.py diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml new file mode 100644 index 000000000..2f426cdc5 --- /dev/null +++ b/.github/workflows/nightly-build.yml @@ -0,0 +1,115 @@ +name: Nightly Upstream Snapshot Build + +on: + schedule: + - cron: "21 3 * * *" + workflow_dispatch: + push: + branches: + - zhaez/nightly-build + +jobs: + build-and-test: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Configure git and create branch + run: | + git config --local user.email "action@github.com" + git config --local user.name "GitHub Action" + BRANCH_NAME="nightly-deps-$(date +%Y%m%d)" + git checkout -b "$BRANCH_NAME" + echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Install build tools + run: | + python -m pip install --upgrade pip + pip install build pytest toml requests + + - name: Get latest upstream versions + id: get_versions + run: python scripts/get_upstream_versions.py + + - name: Update dependencies + env: + OTEL_PYTHON_VERSION: ${{ steps.get_versions.outputs.otel_python_version }} + OTEL_CONTRIB_VERSION: ${{ steps.get_versions.outputs.otel_contrib_version }} + run: python scripts/update_dependencies.py + + - name: Check for changes and run tests + id: check_changes + run: | + if git diff --quiet; then + echo "No dependency updates needed" + echo "has_changes=false" >> $GITHUB_OUTPUT + else + echo "Dependencies were updated" + echo "has_changes=true" >> $GITHUB_OUTPUT + fi + + - name: Build and test + if: steps.check_changes.outputs.has_changes == 'true' + uses: ./.github/actions/artifacts_build + with: + image_uri_with_tag: adot-python-nightly:snapshot + push_image: false + load_image: true + python_version: "3.11" + package_name: aws-opentelemetry-distro + os: ubuntu-latest + + - name: Build and Test Lambda Layer + if: steps.check_changes.outputs.has_changes == 'true' + uses: ./.github/actions/lambda_artifacts_build + with: + python_version: "3.12" + layer_directory: lambda-layer + staging_s3_bucket: "nightly-test-bucket" + os: ubuntu-latest + + - name: Run contract tests + if: steps.check_changes.outputs.has_changes == 'true' + run: | + bash scripts/set-up-contract-tests.sh + pip install pytest + pytest contract-tests/tests + + - name: Create PR if changes exist + if: steps.check_changes.outputs.has_changes == 'true' + run: | + git add aws-opentelemetry-distro/pyproject.toml + git commit -m "chore: update OpenTelemetry dependencies to ${{ steps.get_versions.outputs.otel_python_version }}/${{ steps.get_versions.outputs.otel_contrib_version }}" + git push origin "$BRANCH_NAME" + + gh pr create \ + --title "Nightly dependency update: OpenTelemetry ${{ steps.get_versions.outputs.otel_python_version }}/${{ steps.get_versions.outputs.otel_contrib_version }}" \ + --body "Automated update of OpenTelemetry dependencies. + + **Updated versions:** + - OpenTelemetry Python: ${{ steps.get_versions.outputs.otel_python_version }} + - OpenTelemetry Contrib: ${{ steps.get_versions.outputs.otel_contrib_version }} + + **Tests completed:** + - Unit tests (tox) + - Wheel building + - Docker image building + - Lambda layer building and testing + - Contract tests + + This PR will trigger additional validation via pr-build workflow including multi-version testing and linting." \ + --base main \ + --head "$BRANCH_NAME" \ + --label "dependencies" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/scripts/get_upstream_versions.py b/scripts/get_upstream_versions.py new file mode 100644 index 000000000..9249e2d54 --- /dev/null +++ b/scripts/get_upstream_versions.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 + +import requests +import os +import sys +import re + +def get_latest_otel_versions(): + """Get latest OpenTelemetry versions from GitHub releases.""" + try: + # Query GitHub API for latest release + response = requests.get('https://api.github.com/repos/open-telemetry/opentelemetry-python/releases/latest') + response.raise_for_status() + + release_data = response.json() + release_title = release_data['name'] + + # Parse "Version 1.37.0/0.58b0" format + match = re.search(r'Version\s+(\d+\.\d+\.\d+)/(\d+\.\d+b\d+)', release_title) + if not match: + print(f"Could not parse release title: {release_title}") + sys.exit(1) + + otel_python_version = match.group(1) # e.g., "1.37.0" + otel_contrib_version = match.group(2) # e.g., "0.58b0" + + return otel_python_version, otel_contrib_version + + except Exception as e: + print(f"Error getting OpenTelemetry versions: {e}") + sys.exit(1) + +def main(): + otel_python_version, otel_contrib_version = get_latest_otel_versions() + + print(f'OTEL_PYTHON_VERSION={otel_python_version}') + print(f'OTEL_CONTRIB_VERSION={otel_contrib_version}') + + # Write to GitHub output if in CI + if 'GITHUB_OUTPUT' in os.environ: + with open(os.environ['GITHUB_OUTPUT'], 'a') as f: + f.write(f'otel_python_version={otel_python_version}\n') + f.write(f'otel_contrib_version={otel_contrib_version}\n') + +if __name__ == '__main__': + main() diff --git a/scripts/update_dependencies.py b/scripts/update_dependencies.py new file mode 100644 index 000000000..4dea48546 --- /dev/null +++ b/scripts/update_dependencies.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python3 + +import toml +import sys +import os + +# Dependencies that use the first version number (opentelemetry-python) +PYTHON_CORE_DEPS = [ + 'opentelemetry-api', + 'opentelemetry-sdk', + 'opentelemetry-exporter-otlp', + 'opentelemetry-exporter-otlp-proto-grpc', + 'opentelemetry-exporter-otlp-proto-http', + 'opentelemetry-propagator-b3', + 'opentelemetry-propagator-jaeger', + 'opentelemetry-exporter-otlp-proto-common', +] + +# Dependencies that use the second version number (opentelemetry-python-contrib) +CONTRIB_DEPS = [ + 'opentelemetry-distro', + 'opentelemetry-processor-baggage', + 'opentelemetry-propagator-ot-trace', + 'opentelemetry-instrumentation', + 'opentelemetry-instrumentation-aws-lambda', + 'opentelemetry-instrumentation-aio-pika', + 'opentelemetry-instrumentation-aiohttp-client', + 'opentelemetry-instrumentation-aiopg', + 'opentelemetry-instrumentation-asgi', + 'opentelemetry-instrumentation-asyncpg', + 'opentelemetry-instrumentation-boto', + 'opentelemetry-instrumentation-boto3sqs', + 'opentelemetry-instrumentation-botocore', + 'opentelemetry-instrumentation-celery', + 'opentelemetry-instrumentation-confluent-kafka', + 'opentelemetry-instrumentation-dbapi', + 'opentelemetry-instrumentation-django', + 'opentelemetry-instrumentation-elasticsearch', + 'opentelemetry-instrumentation-falcon', + 'opentelemetry-instrumentation-fastapi', + 'opentelemetry-instrumentation-flask', + 'opentelemetry-instrumentation-grpc', + 'opentelemetry-instrumentation-httpx', + 'opentelemetry-instrumentation-jinja2', + 'opentelemetry-instrumentation-kafka-python', + 'opentelemetry-instrumentation-logging', + 'opentelemetry-instrumentation-mysql', + 'opentelemetry-instrumentation-mysqlclient', + 'opentelemetry-instrumentation-pika', + 'opentelemetry-instrumentation-psycopg2', + 'opentelemetry-instrumentation-pymemcache', + 'opentelemetry-instrumentation-pymongo', + 'opentelemetry-instrumentation-pymysql', + 'opentelemetry-instrumentation-pyramid', + 'opentelemetry-instrumentation-redis', + 'opentelemetry-instrumentation-remoulade', + 'opentelemetry-instrumentation-requests', + 'opentelemetry-instrumentation-sqlalchemy', + 'opentelemetry-instrumentation-sqlite3', + 'opentelemetry-instrumentation-starlette', + 'opentelemetry-instrumentation-system-metrics', + 'opentelemetry-instrumentation-tornado', + 'opentelemetry-instrumentation-tortoiseorm', + 'opentelemetry-instrumentation-urllib', + 'opentelemetry-instrumentation-urllib3', + 'opentelemetry-instrumentation-wsgi', + 'opentelemetry-instrumentation-cassandra', +] + +def main(): + otel_python_version = os.environ.get('OTEL_PYTHON_VERSION') + otel_contrib_version = os.environ.get('OTEL_CONTRIB_VERSION') + + if not otel_python_version or not otel_contrib_version: + print("Error: OTEL_PYTHON_VERSION and OTEL_CONTRIB_VERSION environment variables required") + sys.exit(1) + + pyproject_path = 'aws-opentelemetry-distro/pyproject.toml' + + try: + with open(pyproject_path, 'r') as f: + data = toml.load(f) + + deps = data.get('project', {}).get('dependencies', []) + updated = False + + for i, dep in enumerate(deps): + dep_name = dep.split('==')[0].strip() + + if dep_name in PYTHON_CORE_DEPS: + deps[i] = f'{dep_name} == {otel_python_version}' + updated = True + elif dep_name in CONTRIB_DEPS: + deps[i] = f'{dep_name} == {otel_contrib_version}' + updated = True + + if updated: + with open(pyproject_path, 'w') as f: + toml.dump(data, f) + print(f'Dependencies updated to Python {otel_python_version} / Contrib {otel_contrib_version}') + else: + print('No OpenTelemetry dependencies found to update') + + except Exception as e: + print(f"Error updating dependencies: {e}") + sys.exit(1) + +if __name__ == '__main__': + main() From 7252cb3bcb2fe74ae7ed46235d6b9bf9ff235dd9 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 17:55:31 -0700 Subject: [PATCH 02/46] add otlp exporter dependency --- aws-opentelemetry-distro/pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/aws-opentelemetry-distro/pyproject.toml b/aws-opentelemetry-distro/pyproject.toml index 414b09221..502b31a13 100644 --- a/aws-opentelemetry-distro/pyproject.toml +++ b/aws-opentelemetry-distro/pyproject.toml @@ -28,6 +28,7 @@ classifiers = [ dependencies = [ "opentelemetry-api == 1.33.1", "opentelemetry-sdk == 1.33.1", + "opentelemetry-exporter-otlp == 1.33.1", "opentelemetry-exporter-otlp-proto-grpc == 1.33.1", "opentelemetry-exporter-otlp-proto-http == 1.33.1", "opentelemetry-propagator-b3 == 1.33.1", From e56456bbd83626e3009cc8d328e195d81bf1306f Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 17:59:20 -0700 Subject: [PATCH 03/46] create PR earlier --- .github/workflows/nightly-build.yml | 88 ++++++++++++++++------------- 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 2f426cdc5..7e95d7f64 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -4,13 +4,14 @@ on: schedule: - cron: "21 3 * * *" workflow_dispatch: - push: - branches: - - zhaez/nightly-build jobs: - build-and-test: + update-and-create-pr: runs-on: ubuntu-latest + outputs: + has_changes: ${{ steps.check_changes.outputs.has_changes }} + otel_python_version: ${{ steps.get_versions.outputs.otel_python_version }} + otel_contrib_version: ${{ steps.get_versions.outputs.otel_contrib_version }} steps: - name: Checkout repository @@ -35,7 +36,7 @@ jobs: - name: Install build tools run: | python -m pip install --upgrade pip - pip install build pytest toml requests + pip install toml requests - name: Get latest upstream versions id: get_versions @@ -47,7 +48,7 @@ jobs: OTEL_CONTRIB_VERSION: ${{ steps.get_versions.outputs.otel_contrib_version }} run: python scripts/update_dependencies.py - - name: Check for changes and run tests + - name: Check for changes and create PR id: check_changes run: | if git diff --quiet; then @@ -56,10 +57,52 @@ jobs: else echo "Dependencies were updated" echo "has_changes=true" >> $GITHUB_OUTPUT + + # Create PR immediately + git add aws-opentelemetry-distro/pyproject.toml + git commit -m "chore: update OpenTelemetry dependencies to ${{ steps.get_versions.outputs.otel_python_version }}/${{ steps.get_versions.outputs.otel_contrib_version }}" + git push origin "$BRANCH_NAME" + + gh pr create \ + --title "Nightly dependency update: OpenTelemetry ${{ steps.get_versions.outputs.otel_python_version }}/${{ steps.get_versions.outputs.otel_contrib_version }}" \ + --body "Automated update of OpenTelemetry dependencies. + + **Updated versions:** + - OpenTelemetry Python: ${{ steps.get_versions.outputs.otel_python_version }} + - OpenTelemetry Contrib: ${{ steps.get_versions.outputs.otel_contrib_version }} + + **Status:** Tests are running in the nightly workflow. Check the workflow results for compatibility status. + + This PR will trigger additional validation via pr-build workflow including multi-version testing and linting." \ + --base main \ + --head "$BRANCH_NAME" \ + --label "dependencies" fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + build-and-test: + runs-on: ubuntu-latest + needs: update-and-create-pr + if: needs.update-and-create-pr.outputs.has_changes == 'true' + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: nightly-deps-$(date +%Y%m%d) + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Install build tools + run: | + python -m pip install --upgrade pip + pip install build pytest toml requests - name: Build and test - if: steps.check_changes.outputs.has_changes == 'true' uses: ./.github/actions/artifacts_build with: image_uri_with_tag: adot-python-nightly:snapshot @@ -70,7 +113,6 @@ jobs: os: ubuntu-latest - name: Build and Test Lambda Layer - if: steps.check_changes.outputs.has_changes == 'true' uses: ./.github/actions/lambda_artifacts_build with: python_version: "3.12" @@ -79,37 +121,7 @@ jobs: os: ubuntu-latest - name: Run contract tests - if: steps.check_changes.outputs.has_changes == 'true' run: | bash scripts/set-up-contract-tests.sh pip install pytest pytest contract-tests/tests - - - name: Create PR if changes exist - if: steps.check_changes.outputs.has_changes == 'true' - run: | - git add aws-opentelemetry-distro/pyproject.toml - git commit -m "chore: update OpenTelemetry dependencies to ${{ steps.get_versions.outputs.otel_python_version }}/${{ steps.get_versions.outputs.otel_contrib_version }}" - git push origin "$BRANCH_NAME" - - gh pr create \ - --title "Nightly dependency update: OpenTelemetry ${{ steps.get_versions.outputs.otel_python_version }}/${{ steps.get_versions.outputs.otel_contrib_version }}" \ - --body "Automated update of OpenTelemetry dependencies. - - **Updated versions:** - - OpenTelemetry Python: ${{ steps.get_versions.outputs.otel_python_version }} - - OpenTelemetry Contrib: ${{ steps.get_versions.outputs.otel_contrib_version }} - - **Tests completed:** - - Unit tests (tox) - - Wheel building - - Docker image building - - Lambda layer building and testing - - Contract tests - - This PR will trigger additional validation via pr-build workflow including multi-version testing and linting." \ - --base main \ - --head "$BRANCH_NAME" \ - --label "dependencies" - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From c2d895d0d8146ac0024c55915755aaa620cb5459 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 18:01:00 -0700 Subject: [PATCH 04/46] add test branch --- .github/workflows/nightly-build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 7e95d7f64..a5a374832 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -4,6 +4,9 @@ on: schedule: - cron: "21 3 * * *" workflow_dispatch: + push: + branches: + - zhaez/nightly-build jobs: update-and-create-pr: From 6cc475d879d9a9c290d336eb5ba1b5b9f9a7e1a3 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 18:02:29 -0700 Subject: [PATCH 05/46] remove dependencies label --- .github/workflows/nightly-build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index a5a374832..7ebaba87c 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -78,8 +78,7 @@ jobs: This PR will trigger additional validation via pr-build workflow including multi-version testing and linting." \ --base main \ - --head "$BRANCH_NAME" \ - --label "dependencies" + --head "$BRANCH_NAME" fi env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From e9c78dd84a583f173630e9e23997075c90fbb194 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 18:32:00 -0700 Subject: [PATCH 06/46] only push to one branch --- .github/workflows/nightly-build.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 7ebaba87c..9044a2a5d 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -23,13 +23,21 @@ jobs: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} + - name: Check if nightly branch already exists + run: | + BRANCH_NAME="nightly-dependency-updates" + if git ls-remote --exit-code --heads origin "$BRANCH_NAME"; then + echo "Branch $BRANCH_NAME already exists. Skipping run to avoid conflicts." + echo "Please merge or close the existing PR before the next nightly run." + exit 0 + fi + echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV + - name: Configure git and create branch run: | git config --local user.email "action@github.com" git config --local user.name "GitHub Action" - BRANCH_NAME="nightly-deps-$(date +%Y%m%d)" git checkout -b "$BRANCH_NAME" - echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV - name: Set up Python uses: actions/setup-python@v4 From 73497389bfaae7f5a94810bb8607e15112420b87 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 18:38:51 -0700 Subject: [PATCH 07/46] add BRANCH_NAME var --- .github/workflows/nightly-build.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 9044a2a5d..31b821604 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -8,6 +8,9 @@ on: branches: - zhaez/nightly-build +env: + BRANCH_NAME: nightly-dependency-updates + jobs: update-and-create-pr: runs-on: ubuntu-latest @@ -25,13 +28,11 @@ jobs: - name: Check if nightly branch already exists run: | - BRANCH_NAME="nightly-dependency-updates" if git ls-remote --exit-code --heads origin "$BRANCH_NAME"; then echo "Branch $BRANCH_NAME already exists. Skipping run to avoid conflicts." echo "Please merge or close the existing PR before the next nightly run." exit 0 fi - echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV - name: Configure git and create branch run: | From ca80bbb9206d68e6a7cd36ea203fdc9240974d39 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 18:43:41 -0700 Subject: [PATCH 08/46] update dependency update script --- scripts/update_dependencies.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/scripts/update_dependencies.py b/scripts/update_dependencies.py index 4dea48546..83a9e8324 100644 --- a/scripts/update_dependencies.py +++ b/scripts/update_dependencies.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 -import toml import sys import os +import re # Dependencies that use the first version number (opentelemetry-python) PYTHON_CORE_DEPS = [ @@ -79,24 +79,29 @@ def main(): try: with open(pyproject_path, 'r') as f: - data = toml.load(f) + content = f.read() - deps = data.get('project', {}).get('dependencies', []) updated = False - for i, dep in enumerate(deps): - dep_name = dep.split('==')[0].strip() - - if dep_name in PYTHON_CORE_DEPS: - deps[i] = f'{dep_name} == {otel_python_version}' + # Update Python core dependencies + for dep in PYTHON_CORE_DEPS: + pattern = rf'"{re.escape(dep)} == [^"]*"' + replacement = f'"{dep} == {otel_python_version}"' + if re.search(pattern, content): + content = re.sub(pattern, replacement, content) updated = True - elif dep_name in CONTRIB_DEPS: - deps[i] = f'{dep_name} == {otel_contrib_version}' + + # Update contrib dependencies + for dep in CONTRIB_DEPS: + pattern = rf'"{re.escape(dep)} == [^"]*"' + replacement = f'"{dep} == {otel_contrib_version}"' + if re.search(pattern, content): + content = re.sub(pattern, replacement, content) updated = True if updated: with open(pyproject_path, 'w') as f: - toml.dump(data, f) + f.write(content) print(f'Dependencies updated to Python {otel_python_version} / Contrib {otel_contrib_version}') else: print('No OpenTelemetry dependencies found to update') From cdbfea2cc26de0fd763cb795ee2a71f80d4ba6be Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 18:46:27 -0700 Subject: [PATCH 09/46] fix checkout --- .github/workflows/nightly-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 31b821604..3c25badcd 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -101,7 +101,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 with: - ref: nightly-deps-$(date +%Y%m%d) + ref: nightly-dependency-updates - name: Set up Python uses: actions/setup-python@v4 From feb2005001f9b510e837830627ba0566880a9e12 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 18:48:44 -0700 Subject: [PATCH 10/46] exit workflow early --- .github/workflows/nightly-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 3c25badcd..e3a565f03 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -31,7 +31,7 @@ jobs: if git ls-remote --exit-code --heads origin "$BRANCH_NAME"; then echo "Branch $BRANCH_NAME already exists. Skipping run to avoid conflicts." echo "Please merge or close the existing PR before the next nightly run." - exit 0 + exit 1 fi - name: Configure git and create branch From d9d2dfed81e742c2dafde922c8673397711be743 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 18:53:25 -0700 Subject: [PATCH 11/46] update independent dependency versions --- scripts/update_dependencies.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/scripts/update_dependencies.py b/scripts/update_dependencies.py index 83a9e8324..d4801a883 100644 --- a/scripts/update_dependencies.py +++ b/scripts/update_dependencies.py @@ -3,6 +3,7 @@ import sys import os import re +import requests # Dependencies that use the first version number (opentelemetry-python) PYTHON_CORE_DEPS = [ @@ -67,6 +68,23 @@ 'opentelemetry-instrumentation-cassandra', ] +# AWS-specific packages with independent versioning +AWS_DEPS = [ + 'opentelemetry-sdk-extension-aws', + 'opentelemetry-propagator-aws-xray', +] + +def get_latest_version(package_name): + """Get the latest version of a package from PyPI.""" + try: + response = requests.get(f'https://pypi.org/pypi/{package_name}/json') + response.raise_for_status() + data = response.json() + return data['info']['version'] + except Exception as e: + print(f"Warning: Could not get latest version for {package_name}: {e}") + return None + def main(): otel_python_version = os.environ.get('OTEL_PYTHON_VERSION') otel_contrib_version = os.environ.get('OTEL_CONTRIB_VERSION') @@ -99,6 +117,17 @@ def main(): content = re.sub(pattern, replacement, content) updated = True + # Update AWS dependencies with their latest versions + for dep in AWS_DEPS: + latest_version = get_latest_version(dep) + if latest_version: + pattern = rf'"{re.escape(dep)} == [^"]*"' + replacement = f'"{dep} == {latest_version}"' + if re.search(pattern, content): + content = re.sub(pattern, replacement, content) + updated = True + print(f"Updated {dep} to {latest_version}") + if updated: with open(pyproject_path, 'w') as f: f.write(content) From e2a6c4cbe2d196a7c9bb421979830cc9700f255c Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 19:06:27 -0700 Subject: [PATCH 12/46] update comments --- .github/workflows/nightly-build.yml | 8 ++------ scripts/get_upstream_versions.py | 4 ++-- scripts/update_dependencies.py | 12 ++++++------ 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index e3a565f03..dea1b7022 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -70,7 +70,7 @@ jobs: echo "Dependencies were updated" echo "has_changes=true" >> $GITHUB_OUTPUT - # Create PR immediately + # Create PR git add aws-opentelemetry-distro/pyproject.toml git commit -m "chore: update OpenTelemetry dependencies to ${{ steps.get_versions.outputs.otel_python_version }}/${{ steps.get_versions.outputs.otel_contrib_version }}" git push origin "$BRANCH_NAME" @@ -81,11 +81,7 @@ jobs: **Updated versions:** - OpenTelemetry Python: ${{ steps.get_versions.outputs.otel_python_version }} - - OpenTelemetry Contrib: ${{ steps.get_versions.outputs.otel_contrib_version }} - - **Status:** Tests are running in the nightly workflow. Check the workflow results for compatibility status. - - This PR will trigger additional validation via pr-build workflow including multi-version testing and linting." \ + - OpenTelemetry Contrib: ${{ steps.get_versions.outputs.otel_contrib_version }}" \ --base main \ --head "$BRANCH_NAME" fi diff --git a/scripts/get_upstream_versions.py b/scripts/get_upstream_versions.py index 9249e2d54..05cd78e94 100644 --- a/scripts/get_upstream_versions.py +++ b/scripts/get_upstream_versions.py @@ -21,8 +21,8 @@ def get_latest_otel_versions(): print(f"Could not parse release title: {release_title}") sys.exit(1) - otel_python_version = match.group(1) # e.g., "1.37.0" - otel_contrib_version = match.group(2) # e.g., "0.58b0" + otel_python_version = match.group(1) + otel_contrib_version = match.group(2) return otel_python_version, otel_contrib_version diff --git a/scripts/update_dependencies.py b/scripts/update_dependencies.py index d4801a883..60172e652 100644 --- a/scripts/update_dependencies.py +++ b/scripts/update_dependencies.py @@ -5,7 +5,7 @@ import re import requests -# Dependencies that use the first version number (opentelemetry-python) +# Dependencies that use the opentelemetry-python version number PYTHON_CORE_DEPS = [ 'opentelemetry-api', 'opentelemetry-sdk', @@ -17,7 +17,7 @@ 'opentelemetry-exporter-otlp-proto-common', ] -# Dependencies that use the second version number (opentelemetry-python-contrib) +# Dependencies that use the opentelemetry-python-contrib version number CONTRIB_DEPS = [ 'opentelemetry-distro', 'opentelemetry-processor-baggage', @@ -68,7 +68,7 @@ 'opentelemetry-instrumentation-cassandra', ] -# AWS-specific packages with independent versioning +packages with independent versioning AWS_DEPS = [ 'opentelemetry-sdk-extension-aws', 'opentelemetry-propagator-aws-xray', @@ -101,7 +101,7 @@ def main(): updated = False - # Update Python core dependencies + # Update opentelemetry-python dependencies for dep in PYTHON_CORE_DEPS: pattern = rf'"{re.escape(dep)} == [^"]*"' replacement = f'"{dep} == {otel_python_version}"' @@ -109,7 +109,7 @@ def main(): content = re.sub(pattern, replacement, content) updated = True - # Update contrib dependencies + # Update opentelemetry-python-contrib dependencies for dep in CONTRIB_DEPS: pattern = rf'"{re.escape(dep)} == [^"]*"' replacement = f'"{dep} == {otel_contrib_version}"' @@ -117,7 +117,7 @@ def main(): content = re.sub(pattern, replacement, content) updated = True - # Update AWS dependencies with their latest versions + # Update dependencies with independent versioning for dep in AWS_DEPS: latest_version = get_latest_version(dep) if latest_version: From b074e69cb99cacb028051d4ca26ad5904121ee3a Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 19:21:21 -0700 Subject: [PATCH 13/46] call main build directly from nightly build --- .github/workflows/main-build.yml | 8 +++++ .github/workflows/nightly-build.yml | 48 +++++------------------------ 2 files changed, 15 insertions(+), 41 deletions(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index 7e1df8fef..4e3feb237 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -7,6 +7,12 @@ on: - "release/v*" - ci-workflow workflow_dispatch: # be able to run the workflow on demand + workflow_call: + inputs: + ref: + description: 'Git ref to checkout' + required: false + type: string env: AWS_DEFAULT_REGION: us-east-1 STAGING_ECR_REGISTRY: 637423224110.dkr.ecr.us-east-1.amazonaws.com @@ -34,6 +40,8 @@ jobs: steps: - name: Checkout Repo @ SHA - ${{ github.sha }} uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 #5.0.0 + with: + ref: ${{ inputs.ref || github.sha }} - name: Get Python Distro Output id: python_output diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index dea1b7022..46369977d 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -89,46 +89,12 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} build-and-test: - runs-on: ubuntu-latest needs: update-and-create-pr if: needs.update-and-create-pr.outputs.has_changes == 'true' - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - ref: nightly-dependency-updates - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.11' - - - name: Install build tools - run: | - python -m pip install --upgrade pip - pip install build pytest toml requests - - - name: Build and test - uses: ./.github/actions/artifacts_build - with: - image_uri_with_tag: adot-python-nightly:snapshot - push_image: false - load_image: true - python_version: "3.11" - package_name: aws-opentelemetry-distro - os: ubuntu-latest - - - name: Build and Test Lambda Layer - uses: ./.github/actions/lambda_artifacts_build - with: - python_version: "3.12" - layer_directory: lambda-layer - staging_s3_bucket: "nightly-test-bucket" - os: ubuntu-latest - - - name: Run contract tests - run: | - bash scripts/set-up-contract-tests.sh - pip install pytest - pytest contract-tests/tests + uses: ./.github/workflows/main-build.yml + secrets: inherit + permissions: + id-token: write + contents: read + with: + ref: nightly-dependency-updates \ No newline at end of file From 3fb046f9c6b7c325e0eb99e98869c8cff31201ec Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 19:22:44 -0700 Subject: [PATCH 14/46] comment fix --- scripts/update_dependencies.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/update_dependencies.py b/scripts/update_dependencies.py index 60172e652..7daf2c389 100644 --- a/scripts/update_dependencies.py +++ b/scripts/update_dependencies.py @@ -68,7 +68,7 @@ 'opentelemetry-instrumentation-cassandra', ] -packages with independent versioning +# packages with independent versioning AWS_DEPS = [ 'opentelemetry-sdk-extension-aws', 'opentelemetry-propagator-aws-xray', From 351813e5a6fadcc63e65eff54236be5c20dd2d1a Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 19:29:12 -0700 Subject: [PATCH 15/46] lint fixes --- scripts/get_upstream_versions.py | 37 ++++---- scripts/update_dependencies.py | 157 ++++++++++++++++--------------- 2 files changed, 100 insertions(+), 94 deletions(-) diff --git a/scripts/get_upstream_versions.py b/scripts/get_upstream_versions.py index 05cd78e94..7354bd2d3 100644 --- a/scripts/get_upstream_versions.py +++ b/scripts/get_upstream_versions.py @@ -5,42 +5,45 @@ import sys import re + def get_latest_otel_versions(): """Get latest OpenTelemetry versions from GitHub releases.""" try: # Query GitHub API for latest release - response = requests.get('https://api.github.com/repos/open-telemetry/opentelemetry-python/releases/latest') + response = requests.get("https://api.github.com/repos/open-telemetry/opentelemetry-python/releases/latest") response.raise_for_status() - + release_data = response.json() - release_title = release_data['name'] - + release_title = release_data["name"] + # Parse "Version 1.37.0/0.58b0" format - match = re.search(r'Version\s+(\d+\.\d+\.\d+)/(\d+\.\d+b\d+)', release_title) + match = re.search(r"Version\s+(\d+\.\d+\.\d+)/(\d+\.\d+b\d+)", release_title) if not match: print(f"Could not parse release title: {release_title}") sys.exit(1) - + otel_python_version = match.group(1) otel_contrib_version = match.group(2) - + return otel_python_version, otel_contrib_version - + except Exception as e: print(f"Error getting OpenTelemetry versions: {e}") sys.exit(1) + def main(): otel_python_version, otel_contrib_version = get_latest_otel_versions() - - print(f'OTEL_PYTHON_VERSION={otel_python_version}') - print(f'OTEL_CONTRIB_VERSION={otel_contrib_version}') - + + print(f"OTEL_PYTHON_VERSION={otel_python_version}") + print(f"OTEL_CONTRIB_VERSION={otel_contrib_version}") + # Write to GitHub output if in CI - if 'GITHUB_OUTPUT' in os.environ: - with open(os.environ['GITHUB_OUTPUT'], 'a') as f: - f.write(f'otel_python_version={otel_python_version}\n') - f.write(f'otel_contrib_version={otel_contrib_version}\n') + if "GITHUB_OUTPUT" in os.environ: + with open(os.environ["GITHUB_OUTPUT"], "a") as f: + f.write(f"otel_python_version={otel_python_version}\n") + f.write(f"otel_contrib_version={otel_contrib_version}\n") + -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/scripts/update_dependencies.py b/scripts/update_dependencies.py index 7daf2c389..1f6e3989e 100644 --- a/scripts/update_dependencies.py +++ b/scripts/update_dependencies.py @@ -7,100 +7,102 @@ # Dependencies that use the opentelemetry-python version number PYTHON_CORE_DEPS = [ - 'opentelemetry-api', - 'opentelemetry-sdk', - 'opentelemetry-exporter-otlp', - 'opentelemetry-exporter-otlp-proto-grpc', - 'opentelemetry-exporter-otlp-proto-http', - 'opentelemetry-propagator-b3', - 'opentelemetry-propagator-jaeger', - 'opentelemetry-exporter-otlp-proto-common', + "opentelemetry-api", + "opentelemetry-sdk", + "opentelemetry-exporter-otlp", + "opentelemetry-exporter-otlp-proto-grpc", + "opentelemetry-exporter-otlp-proto-http", + "opentelemetry-propagator-b3", + "opentelemetry-propagator-jaeger", + "opentelemetry-exporter-otlp-proto-common", ] # Dependencies that use the opentelemetry-python-contrib version number CONTRIB_DEPS = [ - 'opentelemetry-distro', - 'opentelemetry-processor-baggage', - 'opentelemetry-propagator-ot-trace', - 'opentelemetry-instrumentation', - 'opentelemetry-instrumentation-aws-lambda', - 'opentelemetry-instrumentation-aio-pika', - 'opentelemetry-instrumentation-aiohttp-client', - 'opentelemetry-instrumentation-aiopg', - 'opentelemetry-instrumentation-asgi', - 'opentelemetry-instrumentation-asyncpg', - 'opentelemetry-instrumentation-boto', - 'opentelemetry-instrumentation-boto3sqs', - 'opentelemetry-instrumentation-botocore', - 'opentelemetry-instrumentation-celery', - 'opentelemetry-instrumentation-confluent-kafka', - 'opentelemetry-instrumentation-dbapi', - 'opentelemetry-instrumentation-django', - 'opentelemetry-instrumentation-elasticsearch', - 'opentelemetry-instrumentation-falcon', - 'opentelemetry-instrumentation-fastapi', - 'opentelemetry-instrumentation-flask', - 'opentelemetry-instrumentation-grpc', - 'opentelemetry-instrumentation-httpx', - 'opentelemetry-instrumentation-jinja2', - 'opentelemetry-instrumentation-kafka-python', - 'opentelemetry-instrumentation-logging', - 'opentelemetry-instrumentation-mysql', - 'opentelemetry-instrumentation-mysqlclient', - 'opentelemetry-instrumentation-pika', - 'opentelemetry-instrumentation-psycopg2', - 'opentelemetry-instrumentation-pymemcache', - 'opentelemetry-instrumentation-pymongo', - 'opentelemetry-instrumentation-pymysql', - 'opentelemetry-instrumentation-pyramid', - 'opentelemetry-instrumentation-redis', - 'opentelemetry-instrumentation-remoulade', - 'opentelemetry-instrumentation-requests', - 'opentelemetry-instrumentation-sqlalchemy', - 'opentelemetry-instrumentation-sqlite3', - 'opentelemetry-instrumentation-starlette', - 'opentelemetry-instrumentation-system-metrics', - 'opentelemetry-instrumentation-tornado', - 'opentelemetry-instrumentation-tortoiseorm', - 'opentelemetry-instrumentation-urllib', - 'opentelemetry-instrumentation-urllib3', - 'opentelemetry-instrumentation-wsgi', - 'opentelemetry-instrumentation-cassandra', + "opentelemetry-distro", + "opentelemetry-processor-baggage", + "opentelemetry-propagator-ot-trace", + "opentelemetry-instrumentation", + "opentelemetry-instrumentation-aws-lambda", + "opentelemetry-instrumentation-aio-pika", + "opentelemetry-instrumentation-aiohttp-client", + "opentelemetry-instrumentation-aiopg", + "opentelemetry-instrumentation-asgi", + "opentelemetry-instrumentation-asyncpg", + "opentelemetry-instrumentation-boto", + "opentelemetry-instrumentation-boto3sqs", + "opentelemetry-instrumentation-botocore", + "opentelemetry-instrumentation-celery", + "opentelemetry-instrumentation-confluent-kafka", + "opentelemetry-instrumentation-dbapi", + "opentelemetry-instrumentation-django", + "opentelemetry-instrumentation-elasticsearch", + "opentelemetry-instrumentation-falcon", + "opentelemetry-instrumentation-fastapi", + "opentelemetry-instrumentation-flask", + "opentelemetry-instrumentation-grpc", + "opentelemetry-instrumentation-httpx", + "opentelemetry-instrumentation-jinja2", + "opentelemetry-instrumentation-kafka-python", + "opentelemetry-instrumentation-logging", + "opentelemetry-instrumentation-mysql", + "opentelemetry-instrumentation-mysqlclient", + "opentelemetry-instrumentation-pika", + "opentelemetry-instrumentation-psycopg2", + "opentelemetry-instrumentation-pymemcache", + "opentelemetry-instrumentation-pymongo", + "opentelemetry-instrumentation-pymysql", + "opentelemetry-instrumentation-pyramid", + "opentelemetry-instrumentation-redis", + "opentelemetry-instrumentation-remoulade", + "opentelemetry-instrumentation-requests", + "opentelemetry-instrumentation-sqlalchemy", + "opentelemetry-instrumentation-sqlite3", + "opentelemetry-instrumentation-starlette", + "opentelemetry-instrumentation-system-metrics", + "opentelemetry-instrumentation-tornado", + "opentelemetry-instrumentation-tortoiseorm", + "opentelemetry-instrumentation-urllib", + "opentelemetry-instrumentation-urllib3", + "opentelemetry-instrumentation-wsgi", + "opentelemetry-instrumentation-cassandra", ] # packages with independent versioning AWS_DEPS = [ - 'opentelemetry-sdk-extension-aws', - 'opentelemetry-propagator-aws-xray', + "opentelemetry-sdk-extension-aws", + "opentelemetry-propagator-aws-xray", ] + def get_latest_version(package_name): """Get the latest version of a package from PyPI.""" try: - response = requests.get(f'https://pypi.org/pypi/{package_name}/json') + response = requests.get(f"https://pypi.org/pypi/{package_name}/json") response.raise_for_status() data = response.json() - return data['info']['version'] + return data["info"]["version"] except Exception as e: print(f"Warning: Could not get latest version for {package_name}: {e}") return None + def main(): - otel_python_version = os.environ.get('OTEL_PYTHON_VERSION') - otel_contrib_version = os.environ.get('OTEL_CONTRIB_VERSION') - + otel_python_version = os.environ.get("OTEL_PYTHON_VERSION") + otel_contrib_version = os.environ.get("OTEL_CONTRIB_VERSION") + if not otel_python_version or not otel_contrib_version: print("Error: OTEL_PYTHON_VERSION and OTEL_CONTRIB_VERSION environment variables required") sys.exit(1) - - pyproject_path = 'aws-opentelemetry-distro/pyproject.toml' - + + pyproject_path = "aws-opentelemetry-distro/pyproject.toml" + try: - with open(pyproject_path, 'r') as f: + with open(pyproject_path, "r") as f: content = f.read() - + updated = False - + # Update opentelemetry-python dependencies for dep in PYTHON_CORE_DEPS: pattern = rf'"{re.escape(dep)} == [^"]*"' @@ -108,15 +110,15 @@ def main(): if re.search(pattern, content): content = re.sub(pattern, replacement, content) updated = True - - # Update opentelemetry-python-contrib dependencies + + # Update opentelemetry-python-contrib dependencies for dep in CONTRIB_DEPS: pattern = rf'"{re.escape(dep)} == [^"]*"' replacement = f'"{dep} == {otel_contrib_version}"' if re.search(pattern, content): content = re.sub(pattern, replacement, content) updated = True - + # Update dependencies with independent versioning for dep in AWS_DEPS: latest_version = get_latest_version(dep) @@ -127,17 +129,18 @@ def main(): content = re.sub(pattern, replacement, content) updated = True print(f"Updated {dep} to {latest_version}") - + if updated: - with open(pyproject_path, 'w') as f: + with open(pyproject_path, "w") as f: f.write(content) - print(f'Dependencies updated to Python {otel_python_version} / Contrib {otel_contrib_version}') + print(f"Dependencies updated to Python {otel_python_version} / Contrib {otel_contrib_version}") else: - print('No OpenTelemetry dependencies found to update') - + print("No OpenTelemetry dependencies found to update") + except Exception as e: print(f"Error updating dependencies: {e}") sys.exit(1) -if __name__ == '__main__': + +if __name__ == "__main__": main() From 9d571716a714e3771dab14e2a01179d01b37cb36 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 19:30:51 -0700 Subject: [PATCH 16/46] use SHAs instead of versions for actions --- .github/workflows/nightly-build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 46369977d..22dd5b1f3 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -21,7 +21,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 #5.0.0 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} @@ -41,7 +41,7 @@ jobs: git checkout -b "$BRANCH_NAME" - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c #v6.0.0 with: python-version: '3.11' From 9f0ebbb59a528a1521a5da3997150286b29edd8d Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 19:33:44 -0700 Subject: [PATCH 17/46] lint --- scripts/get_upstream_versions.py | 5 +++-- scripts/update_dependencies.py | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/scripts/get_upstream_versions.py b/scripts/get_upstream_versions.py index 7354bd2d3..23633ad1d 100644 --- a/scripts/get_upstream_versions.py +++ b/scripts/get_upstream_versions.py @@ -1,9 +1,10 @@ #!/usr/bin/env python3 -import requests import os -import sys import re +import sys + +import requests def get_latest_otel_versions(): diff --git a/scripts/update_dependencies.py b/scripts/update_dependencies.py index 1f6e3989e..4e6047196 100644 --- a/scripts/update_dependencies.py +++ b/scripts/update_dependencies.py @@ -1,8 +1,9 @@ #!/usr/bin/env python3 -import sys import os import re +import sys + import requests # Dependencies that use the opentelemetry-python version number From 60b627a74201c24cdc96f2a1f1196e15ed49ae95 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 19:37:44 -0700 Subject: [PATCH 18/46] lint fixes --- scripts/get_upstream_versions.py | 3 ++- scripts/update_dependencies.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/get_upstream_versions.py b/scripts/get_upstream_versions.py index 23633ad1d..6480fb4bf 100644 --- a/scripts/get_upstream_versions.py +++ b/scripts/get_upstream_versions.py @@ -1,4 +1,5 @@ -#!/usr/bin/env python3 +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 import os import re diff --git a/scripts/update_dependencies.py b/scripts/update_dependencies.py index 4e6047196..04e22b0ea 100644 --- a/scripts/update_dependencies.py +++ b/scripts/update_dependencies.py @@ -1,4 +1,5 @@ -#!/usr/bin/env python3 +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 import os import re From 1544468a0ce474aeaaf486c749775a3b4f33b534 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 19:42:10 -0700 Subject: [PATCH 19/46] more lint --- scripts/get_upstream_versions.py | 52 +++++---- scripts/update_dependencies.py | 181 +++++++++++++++---------------- 2 files changed, 113 insertions(+), 120 deletions(-) diff --git a/scripts/get_upstream_versions.py b/scripts/get_upstream_versions.py index 6480fb4bf..2bd839bbc 100644 --- a/scripts/get_upstream_versions.py +++ b/scripts/get_upstream_versions.py @@ -1,51 +1,49 @@ -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 +#!/usr/bin/env python3 +import requests import os -import re import sys - -import requests - +import re def get_latest_otel_versions(): """Get latest OpenTelemetry versions from GitHub releases.""" try: # Query GitHub API for latest release - response = requests.get("https://api.github.com/repos/open-telemetry/opentelemetry-python/releases/latest") + response = requests.get( + 'https://api.github.com/repos/open-telemetry/opentelemetry-python/releases/latest', + timeout=30 + ) response.raise_for_status() - + release_data = response.json() - release_title = release_data["name"] - + release_title = release_data['name'] + # Parse "Version 1.37.0/0.58b0" format - match = re.search(r"Version\s+(\d+\.\d+\.\d+)/(\d+\.\d+b\d+)", release_title) + match = re.search(r'Version\s+(\d+\.\d+\.\d+)/(\d+\.\d+b\d+)', release_title) if not match: print(f"Could not parse release title: {release_title}") sys.exit(1) - + otel_python_version = match.group(1) otel_contrib_version = match.group(2) - + return otel_python_version, otel_contrib_version - - except Exception as e: - print(f"Error getting OpenTelemetry versions: {e}") + + except requests.RequestException as request_error: + print(f"Error getting OpenTelemetry versions: {request_error}") sys.exit(1) - def main(): otel_python_version, otel_contrib_version = get_latest_otel_versions() - - print(f"OTEL_PYTHON_VERSION={otel_python_version}") - print(f"OTEL_CONTRIB_VERSION={otel_contrib_version}") - + + print(f'OTEL_PYTHON_VERSION={otel_python_version}') + print(f'OTEL_CONTRIB_VERSION={otel_contrib_version}') + # Write to GitHub output if in CI - if "GITHUB_OUTPUT" in os.environ: - with open(os.environ["GITHUB_OUTPUT"], "a") as f: - f.write(f"otel_python_version={otel_python_version}\n") - f.write(f"otel_contrib_version={otel_contrib_version}\n") - + if 'GITHUB_OUTPUT' in os.environ: + with open(os.environ['GITHUB_OUTPUT'], 'a', encoding='utf-8') as output_file: + output_file.write(f'otel_python_version={otel_python_version}\n') + output_file.write(f'otel_contrib_version={otel_contrib_version}\n') -if __name__ == "__main__": +if __name__ == '__main__': main() diff --git a/scripts/update_dependencies.py b/scripts/update_dependencies.py index 04e22b0ea..180045a9b 100644 --- a/scripts/update_dependencies.py +++ b/scripts/update_dependencies.py @@ -1,110 +1,106 @@ -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 +#!/usr/bin/env python3 +import sys import os import re -import sys - import requests -# Dependencies that use the opentelemetry-python version number +# Dependencies that use the first version number (opentelemetry-python) PYTHON_CORE_DEPS = [ - "opentelemetry-api", - "opentelemetry-sdk", - "opentelemetry-exporter-otlp", - "opentelemetry-exporter-otlp-proto-grpc", - "opentelemetry-exporter-otlp-proto-http", - "opentelemetry-propagator-b3", - "opentelemetry-propagator-jaeger", - "opentelemetry-exporter-otlp-proto-common", + 'opentelemetry-api', + 'opentelemetry-sdk', + 'opentelemetry-exporter-otlp', + 'opentelemetry-exporter-otlp-proto-grpc', + 'opentelemetry-exporter-otlp-proto-http', + 'opentelemetry-propagator-b3', + 'opentelemetry-propagator-jaeger', + 'opentelemetry-exporter-otlp-proto-common', ] -# Dependencies that use the opentelemetry-python-contrib version number +# Dependencies that use the second version number (opentelemetry-python-contrib) CONTRIB_DEPS = [ - "opentelemetry-distro", - "opentelemetry-processor-baggage", - "opentelemetry-propagator-ot-trace", - "opentelemetry-instrumentation", - "opentelemetry-instrumentation-aws-lambda", - "opentelemetry-instrumentation-aio-pika", - "opentelemetry-instrumentation-aiohttp-client", - "opentelemetry-instrumentation-aiopg", - "opentelemetry-instrumentation-asgi", - "opentelemetry-instrumentation-asyncpg", - "opentelemetry-instrumentation-boto", - "opentelemetry-instrumentation-boto3sqs", - "opentelemetry-instrumentation-botocore", - "opentelemetry-instrumentation-celery", - "opentelemetry-instrumentation-confluent-kafka", - "opentelemetry-instrumentation-dbapi", - "opentelemetry-instrumentation-django", - "opentelemetry-instrumentation-elasticsearch", - "opentelemetry-instrumentation-falcon", - "opentelemetry-instrumentation-fastapi", - "opentelemetry-instrumentation-flask", - "opentelemetry-instrumentation-grpc", - "opentelemetry-instrumentation-httpx", - "opentelemetry-instrumentation-jinja2", - "opentelemetry-instrumentation-kafka-python", - "opentelemetry-instrumentation-logging", - "opentelemetry-instrumentation-mysql", - "opentelemetry-instrumentation-mysqlclient", - "opentelemetry-instrumentation-pika", - "opentelemetry-instrumentation-psycopg2", - "opentelemetry-instrumentation-pymemcache", - "opentelemetry-instrumentation-pymongo", - "opentelemetry-instrumentation-pymysql", - "opentelemetry-instrumentation-pyramid", - "opentelemetry-instrumentation-redis", - "opentelemetry-instrumentation-remoulade", - "opentelemetry-instrumentation-requests", - "opentelemetry-instrumentation-sqlalchemy", - "opentelemetry-instrumentation-sqlite3", - "opentelemetry-instrumentation-starlette", - "opentelemetry-instrumentation-system-metrics", - "opentelemetry-instrumentation-tornado", - "opentelemetry-instrumentation-tortoiseorm", - "opentelemetry-instrumentation-urllib", - "opentelemetry-instrumentation-urllib3", - "opentelemetry-instrumentation-wsgi", - "opentelemetry-instrumentation-cassandra", + 'opentelemetry-distro', + 'opentelemetry-processor-baggage', + 'opentelemetry-propagator-ot-trace', + 'opentelemetry-instrumentation', + 'opentelemetry-instrumentation-aws-lambda', + 'opentelemetry-instrumentation-aio-pika', + 'opentelemetry-instrumentation-aiohttp-client', + 'opentelemetry-instrumentation-aiopg', + 'opentelemetry-instrumentation-asgi', + 'opentelemetry-instrumentation-asyncpg', + 'opentelemetry-instrumentation-boto', + 'opentelemetry-instrumentation-boto3sqs', + 'opentelemetry-instrumentation-botocore', + 'opentelemetry-instrumentation-celery', + 'opentelemetry-instrumentation-confluent-kafka', + 'opentelemetry-instrumentation-dbapi', + 'opentelemetry-instrumentation-django', + 'opentelemetry-instrumentation-elasticsearch', + 'opentelemetry-instrumentation-falcon', + 'opentelemetry-instrumentation-fastapi', + 'opentelemetry-instrumentation-flask', + 'opentelemetry-instrumentation-grpc', + 'opentelemetry-instrumentation-httpx', + 'opentelemetry-instrumentation-jinja2', + 'opentelemetry-instrumentation-kafka-python', + 'opentelemetry-instrumentation-logging', + 'opentelemetry-instrumentation-mysql', + 'opentelemetry-instrumentation-mysqlclient', + 'opentelemetry-instrumentation-pika', + 'opentelemetry-instrumentation-psycopg2', + 'opentelemetry-instrumentation-pymemcache', + 'opentelemetry-instrumentation-pymongo', + 'opentelemetry-instrumentation-pymysql', + 'opentelemetry-instrumentation-pyramid', + 'opentelemetry-instrumentation-redis', + 'opentelemetry-instrumentation-remoulade', + 'opentelemetry-instrumentation-requests', + 'opentelemetry-instrumentation-sqlalchemy', + 'opentelemetry-instrumentation-sqlite3', + 'opentelemetry-instrumentation-starlette', + 'opentelemetry-instrumentation-system-metrics', + 'opentelemetry-instrumentation-tornado', + 'opentelemetry-instrumentation-tortoiseorm', + 'opentelemetry-instrumentation-urllib', + 'opentelemetry-instrumentation-urllib3', + 'opentelemetry-instrumentation-wsgi', + 'opentelemetry-instrumentation-cassandra', ] -# packages with independent versioning +# AWS-specific packages with independent versioning AWS_DEPS = [ - "opentelemetry-sdk-extension-aws", - "opentelemetry-propagator-aws-xray", + 'opentelemetry-sdk-extension-aws', + 'opentelemetry-propagator-aws-xray', ] - def get_latest_version(package_name): """Get the latest version of a package from PyPI.""" try: - response = requests.get(f"https://pypi.org/pypi/{package_name}/json") + response = requests.get(f'https://pypi.org/pypi/{package_name}/json', timeout=30) response.raise_for_status() data = response.json() - return data["info"]["version"] - except Exception as e: - print(f"Warning: Could not get latest version for {package_name}: {e}") + return data['info']['version'] + except requests.RequestException as request_error: + print(f"Warning: Could not get latest version for {package_name}: {request_error}") return None - def main(): - otel_python_version = os.environ.get("OTEL_PYTHON_VERSION") - otel_contrib_version = os.environ.get("OTEL_CONTRIB_VERSION") - + otel_python_version = os.environ.get('OTEL_PYTHON_VERSION') + otel_contrib_version = os.environ.get('OTEL_CONTRIB_VERSION') + if not otel_python_version or not otel_contrib_version: print("Error: OTEL_PYTHON_VERSION and OTEL_CONTRIB_VERSION environment variables required") sys.exit(1) - - pyproject_path = "aws-opentelemetry-distro/pyproject.toml" - + + pyproject_path = 'aws-opentelemetry-distro/pyproject.toml' + try: - with open(pyproject_path, "r") as f: - content = f.read() - + with open(pyproject_path, 'r', encoding='utf-8') as input_file: + content = input_file.read() + updated = False - + # Update opentelemetry-python dependencies for dep in PYTHON_CORE_DEPS: pattern = rf'"{re.escape(dep)} == [^"]*"' @@ -112,15 +108,15 @@ def main(): if re.search(pattern, content): content = re.sub(pattern, replacement, content) updated = True - - # Update opentelemetry-python-contrib dependencies + + # Update opentelemetry-python-contrib dependencies for dep in CONTRIB_DEPS: pattern = rf'"{re.escape(dep)} == [^"]*"' replacement = f'"{dep} == {otel_contrib_version}"' if re.search(pattern, content): content = re.sub(pattern, replacement, content) updated = True - + # Update dependencies with independent versioning for dep in AWS_DEPS: latest_version = get_latest_version(dep) @@ -131,18 +127,17 @@ def main(): content = re.sub(pattern, replacement, content) updated = True print(f"Updated {dep} to {latest_version}") - + if updated: - with open(pyproject_path, "w") as f: - f.write(content) - print(f"Dependencies updated to Python {otel_python_version} / Contrib {otel_contrib_version}") + with open(pyproject_path, 'w', encoding='utf-8') as output_file: + output_file.write(content) + print(f'Dependencies updated to Python {otel_python_version} / Contrib {otel_contrib_version}') else: - print("No OpenTelemetry dependencies found to update") - - except Exception as e: - print(f"Error updating dependencies: {e}") + print('No OpenTelemetry dependencies found to update') + + except (OSError, IOError) as file_error: + print(f"Error updating dependencies: {file_error}") sys.exit(1) - -if __name__ == "__main__": +if __name__ == '__main__': main() From a6d58c1452ca08d53ab82417f451b416db3c02ba Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 19:44:37 -0700 Subject: [PATCH 20/46] more lint --- scripts/get_upstream_versions.py | 43 +++++---- scripts/update_dependencies.py | 160 ++++++++++++++++--------------- 2 files changed, 105 insertions(+), 98 deletions(-) diff --git a/scripts/get_upstream_versions.py b/scripts/get_upstream_versions.py index 2bd839bbc..3feab8fcb 100644 --- a/scripts/get_upstream_versions.py +++ b/scripts/get_upstream_versions.py @@ -1,49 +1,52 @@ #!/usr/bin/env python3 -import requests import os -import sys import re +import sys + +import requests + def get_latest_otel_versions(): """Get latest OpenTelemetry versions from GitHub releases.""" try: # Query GitHub API for latest release response = requests.get( - 'https://api.github.com/repos/open-telemetry/opentelemetry-python/releases/latest', - timeout=30 + "https://api.github.com/repos/open-telemetry/opentelemetry-python/releases/latest", timeout=30 ) response.raise_for_status() - + release_data = response.json() - release_title = release_data['name'] - + release_title = release_data["name"] + # Parse "Version 1.37.0/0.58b0" format - match = re.search(r'Version\s+(\d+\.\d+\.\d+)/(\d+\.\d+b\d+)', release_title) + match = re.search(r"Version\s+(\d+\.\d+\.\d+)/(\d+\.\d+b\d+)", release_title) if not match: print(f"Could not parse release title: {release_title}") sys.exit(1) - + otel_python_version = match.group(1) otel_contrib_version = match.group(2) - + return otel_python_version, otel_contrib_version - + except requests.RequestException as request_error: print(f"Error getting OpenTelemetry versions: {request_error}") sys.exit(1) + def main(): otel_python_version, otel_contrib_version = get_latest_otel_versions() - - print(f'OTEL_PYTHON_VERSION={otel_python_version}') - print(f'OTEL_CONTRIB_VERSION={otel_contrib_version}') - + + print(f"OTEL_PYTHON_VERSION={otel_python_version}") + print(f"OTEL_CONTRIB_VERSION={otel_contrib_version}") + # Write to GitHub output if in CI - if 'GITHUB_OUTPUT' in os.environ: - with open(os.environ['GITHUB_OUTPUT'], 'a', encoding='utf-8') as output_file: - output_file.write(f'otel_python_version={otel_python_version}\n') - output_file.write(f'otel_contrib_version={otel_contrib_version}\n') + if "GITHUB_OUTPUT" in os.environ: + with open(os.environ["GITHUB_OUTPUT"], "a", encoding="utf-8") as output_file: + output_file.write(f"otel_python_version={otel_python_version}\n") + output_file.write(f"otel_contrib_version={otel_contrib_version}\n") + -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/scripts/update_dependencies.py b/scripts/update_dependencies.py index 180045a9b..193338591 100644 --- a/scripts/update_dependencies.py +++ b/scripts/update_dependencies.py @@ -1,106 +1,109 @@ #!/usr/bin/env python3 -import sys import os import re +import sys + import requests # Dependencies that use the first version number (opentelemetry-python) PYTHON_CORE_DEPS = [ - 'opentelemetry-api', - 'opentelemetry-sdk', - 'opentelemetry-exporter-otlp', - 'opentelemetry-exporter-otlp-proto-grpc', - 'opentelemetry-exporter-otlp-proto-http', - 'opentelemetry-propagator-b3', - 'opentelemetry-propagator-jaeger', - 'opentelemetry-exporter-otlp-proto-common', + "opentelemetry-api", + "opentelemetry-sdk", + "opentelemetry-exporter-otlp", + "opentelemetry-exporter-otlp-proto-grpc", + "opentelemetry-exporter-otlp-proto-http", + "opentelemetry-propagator-b3", + "opentelemetry-propagator-jaeger", + "opentelemetry-exporter-otlp-proto-common", ] # Dependencies that use the second version number (opentelemetry-python-contrib) CONTRIB_DEPS = [ - 'opentelemetry-distro', - 'opentelemetry-processor-baggage', - 'opentelemetry-propagator-ot-trace', - 'opentelemetry-instrumentation', - 'opentelemetry-instrumentation-aws-lambda', - 'opentelemetry-instrumentation-aio-pika', - 'opentelemetry-instrumentation-aiohttp-client', - 'opentelemetry-instrumentation-aiopg', - 'opentelemetry-instrumentation-asgi', - 'opentelemetry-instrumentation-asyncpg', - 'opentelemetry-instrumentation-boto', - 'opentelemetry-instrumentation-boto3sqs', - 'opentelemetry-instrumentation-botocore', - 'opentelemetry-instrumentation-celery', - 'opentelemetry-instrumentation-confluent-kafka', - 'opentelemetry-instrumentation-dbapi', - 'opentelemetry-instrumentation-django', - 'opentelemetry-instrumentation-elasticsearch', - 'opentelemetry-instrumentation-falcon', - 'opentelemetry-instrumentation-fastapi', - 'opentelemetry-instrumentation-flask', - 'opentelemetry-instrumentation-grpc', - 'opentelemetry-instrumentation-httpx', - 'opentelemetry-instrumentation-jinja2', - 'opentelemetry-instrumentation-kafka-python', - 'opentelemetry-instrumentation-logging', - 'opentelemetry-instrumentation-mysql', - 'opentelemetry-instrumentation-mysqlclient', - 'opentelemetry-instrumentation-pika', - 'opentelemetry-instrumentation-psycopg2', - 'opentelemetry-instrumentation-pymemcache', - 'opentelemetry-instrumentation-pymongo', - 'opentelemetry-instrumentation-pymysql', - 'opentelemetry-instrumentation-pyramid', - 'opentelemetry-instrumentation-redis', - 'opentelemetry-instrumentation-remoulade', - 'opentelemetry-instrumentation-requests', - 'opentelemetry-instrumentation-sqlalchemy', - 'opentelemetry-instrumentation-sqlite3', - 'opentelemetry-instrumentation-starlette', - 'opentelemetry-instrumentation-system-metrics', - 'opentelemetry-instrumentation-tornado', - 'opentelemetry-instrumentation-tortoiseorm', - 'opentelemetry-instrumentation-urllib', - 'opentelemetry-instrumentation-urllib3', - 'opentelemetry-instrumentation-wsgi', - 'opentelemetry-instrumentation-cassandra', + "opentelemetry-distro", + "opentelemetry-processor-baggage", + "opentelemetry-propagator-ot-trace", + "opentelemetry-instrumentation", + "opentelemetry-instrumentation-aws-lambda", + "opentelemetry-instrumentation-aio-pika", + "opentelemetry-instrumentation-aiohttp-client", + "opentelemetry-instrumentation-aiopg", + "opentelemetry-instrumentation-asgi", + "opentelemetry-instrumentation-asyncpg", + "opentelemetry-instrumentation-boto", + "opentelemetry-instrumentation-boto3sqs", + "opentelemetry-instrumentation-botocore", + "opentelemetry-instrumentation-celery", + "opentelemetry-instrumentation-confluent-kafka", + "opentelemetry-instrumentation-dbapi", + "opentelemetry-instrumentation-django", + "opentelemetry-instrumentation-elasticsearch", + "opentelemetry-instrumentation-falcon", + "opentelemetry-instrumentation-fastapi", + "opentelemetry-instrumentation-flask", + "opentelemetry-instrumentation-grpc", + "opentelemetry-instrumentation-httpx", + "opentelemetry-instrumentation-jinja2", + "opentelemetry-instrumentation-kafka-python", + "opentelemetry-instrumentation-logging", + "opentelemetry-instrumentation-mysql", + "opentelemetry-instrumentation-mysqlclient", + "opentelemetry-instrumentation-pika", + "opentelemetry-instrumentation-psycopg2", + "opentelemetry-instrumentation-pymemcache", + "opentelemetry-instrumentation-pymongo", + "opentelemetry-instrumentation-pymysql", + "opentelemetry-instrumentation-pyramid", + "opentelemetry-instrumentation-redis", + "opentelemetry-instrumentation-remoulade", + "opentelemetry-instrumentation-requests", + "opentelemetry-instrumentation-sqlalchemy", + "opentelemetry-instrumentation-sqlite3", + "opentelemetry-instrumentation-starlette", + "opentelemetry-instrumentation-system-metrics", + "opentelemetry-instrumentation-tornado", + "opentelemetry-instrumentation-tortoiseorm", + "opentelemetry-instrumentation-urllib", + "opentelemetry-instrumentation-urllib3", + "opentelemetry-instrumentation-wsgi", + "opentelemetry-instrumentation-cassandra", ] # AWS-specific packages with independent versioning AWS_DEPS = [ - 'opentelemetry-sdk-extension-aws', - 'opentelemetry-propagator-aws-xray', + "opentelemetry-sdk-extension-aws", + "opentelemetry-propagator-aws-xray", ] + def get_latest_version(package_name): """Get the latest version of a package from PyPI.""" try: - response = requests.get(f'https://pypi.org/pypi/{package_name}/json', timeout=30) + response = requests.get(f"https://pypi.org/pypi/{package_name}/json", timeout=30) response.raise_for_status() data = response.json() - return data['info']['version'] + return data["info"]["version"] except requests.RequestException as request_error: print(f"Warning: Could not get latest version for {package_name}: {request_error}") return None + def main(): - otel_python_version = os.environ.get('OTEL_PYTHON_VERSION') - otel_contrib_version = os.environ.get('OTEL_CONTRIB_VERSION') - + otel_python_version = os.environ.get("OTEL_PYTHON_VERSION") + otel_contrib_version = os.environ.get("OTEL_CONTRIB_VERSION") + if not otel_python_version or not otel_contrib_version: print("Error: OTEL_PYTHON_VERSION and OTEL_CONTRIB_VERSION environment variables required") sys.exit(1) - - pyproject_path = 'aws-opentelemetry-distro/pyproject.toml' - + + pyproject_path = "aws-opentelemetry-distro/pyproject.toml" + try: - with open(pyproject_path, 'r', encoding='utf-8') as input_file: + with open(pyproject_path, "r", encoding="utf-8") as input_file: content = input_file.read() - + updated = False - + # Update opentelemetry-python dependencies for dep in PYTHON_CORE_DEPS: pattern = rf'"{re.escape(dep)} == [^"]*"' @@ -108,15 +111,15 @@ def main(): if re.search(pattern, content): content = re.sub(pattern, replacement, content) updated = True - - # Update opentelemetry-python-contrib dependencies + + # Update opentelemetry-python-contrib dependencies for dep in CONTRIB_DEPS: pattern = rf'"{re.escape(dep)} == [^"]*"' replacement = f'"{dep} == {otel_contrib_version}"' if re.search(pattern, content): content = re.sub(pattern, replacement, content) updated = True - + # Update dependencies with independent versioning for dep in AWS_DEPS: latest_version = get_latest_version(dep) @@ -127,17 +130,18 @@ def main(): content = re.sub(pattern, replacement, content) updated = True print(f"Updated {dep} to {latest_version}") - + if updated: - with open(pyproject_path, 'w', encoding='utf-8') as output_file: + with open(pyproject_path, "w", encoding="utf-8") as output_file: output_file.write(content) - print(f'Dependencies updated to Python {otel_python_version} / Contrib {otel_contrib_version}') + print(f"Dependencies updated to Python {otel_python_version} / Contrib {otel_contrib_version}") else: - print('No OpenTelemetry dependencies found to update') - + print("No OpenTelemetry dependencies found to update") + except (OSError, IOError) as file_error: print(f"Error updating dependencies: {file_error}") sys.exit(1) -if __name__ == '__main__': + +if __name__ == "__main__": main() From e84deb612832996f4e747d8b4a688c190b2a257d Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Mon, 22 Sep 2025 19:46:21 -0700 Subject: [PATCH 21/46] add headers to python scripts --- scripts/get_upstream_versions.py | 2 ++ scripts/update_dependencies.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/scripts/get_upstream_versions.py b/scripts/get_upstream_versions.py index 3feab8fcb..c0e95ed6c 100644 --- a/scripts/get_upstream_versions.py +++ b/scripts/get_upstream_versions.py @@ -1,4 +1,6 @@ #!/usr/bin/env python3 +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 import os import re diff --git a/scripts/update_dependencies.py b/scripts/update_dependencies.py index 193338591..adf771493 100644 --- a/scripts/update_dependencies.py +++ b/scripts/update_dependencies.py @@ -1,4 +1,6 @@ #!/usr/bin/env python3 +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 import os import re From 51a9ee03c1884e48bca500e04fc3d48b430a02a9 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Tue, 23 Sep 2025 12:11:04 -0700 Subject: [PATCH 22/46] remove push trigger --- .github/workflows/nightly-build.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 22dd5b1f3..169e40dd8 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -4,9 +4,6 @@ on: schedule: - cron: "21 3 * * *" workflow_dispatch: - push: - branches: - - zhaez/nightly-build env: BRANCH_NAME: nightly-dependency-updates From 957024b84a6f00e1f23fdcb48a173a1af353c52c Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Tue, 23 Sep 2025 12:43:55 -0700 Subject: [PATCH 23/46] call main build on nightly build branch --- .github/workflows/main-build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index 4e3feb237..b336af415 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -6,6 +6,7 @@ on: - main - "release/v*" - ci-workflow + - nightly-dependency-updates workflow_dispatch: # be able to run the workflow on demand workflow_call: inputs: @@ -122,7 +123,7 @@ jobs: name: "Publish Main Build Status" needs: [ build, application-signals-e2e-test ] runs-on: ubuntu-latest - if: always() + if: always() && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')) steps: - name: Configure AWS Credentials for emitting metrics uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 #5.0.0 From 076e5291298a514dce0195250feafa60e5499147 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Tue, 23 Sep 2025 12:48:46 -0700 Subject: [PATCH 24/46] add test branch to push to --- .github/workflows/nightly-build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 169e40dd8..22dd5b1f3 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -4,6 +4,9 @@ on: schedule: - cron: "21 3 * * *" workflow_dispatch: + push: + branches: + - zhaez/nightly-build env: BRANCH_NAME: nightly-dependency-updates From 30d7d0a1088fa1e148f0fe3e11a073545d919470 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Tue, 23 Sep 2025 14:23:17 -0700 Subject: [PATCH 25/46] Revert "add test branch to push to" This reverts commit 076e5291298a514dce0195250feafa60e5499147. --- .github/workflows/nightly-build.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 22dd5b1f3..169e40dd8 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -4,9 +4,6 @@ on: schedule: - cron: "21 3 * * *" workflow_dispatch: - push: - branches: - - zhaez/nightly-build env: BRANCH_NAME: nightly-dependency-updates From f3b7a09a9650d533462a8e9bf7a6ff82a3ec89f5 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Wed, 24 Sep 2025 10:22:10 -0700 Subject: [PATCH 26/46] remove extra dependency --- aws-opentelemetry-distro/pyproject.toml | 1 - scripts/update_dependencies.py | 1 - 2 files changed, 2 deletions(-) diff --git a/aws-opentelemetry-distro/pyproject.toml b/aws-opentelemetry-distro/pyproject.toml index 502b31a13..414b09221 100644 --- a/aws-opentelemetry-distro/pyproject.toml +++ b/aws-opentelemetry-distro/pyproject.toml @@ -28,7 +28,6 @@ classifiers = [ dependencies = [ "opentelemetry-api == 1.33.1", "opentelemetry-sdk == 1.33.1", - "opentelemetry-exporter-otlp == 1.33.1", "opentelemetry-exporter-otlp-proto-grpc == 1.33.1", "opentelemetry-exporter-otlp-proto-http == 1.33.1", "opentelemetry-propagator-b3 == 1.33.1", diff --git a/scripts/update_dependencies.py b/scripts/update_dependencies.py index adf771493..7c2da71be 100644 --- a/scripts/update_dependencies.py +++ b/scripts/update_dependencies.py @@ -12,7 +12,6 @@ PYTHON_CORE_DEPS = [ "opentelemetry-api", "opentelemetry-sdk", - "opentelemetry-exporter-otlp", "opentelemetry-exporter-otlp-proto-grpc", "opentelemetry-exporter-otlp-proto-http", "opentelemetry-propagator-b3", From 518287747885ac721be1b059b9361b006be43c01 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Wed, 24 Sep 2025 10:35:52 -0700 Subject: [PATCH 27/46] always checkout branch and update --- .github/workflows/nightly-build.yml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 169e40dd8..79a777255 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -23,19 +23,20 @@ jobs: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} - - name: Check if nightly branch already exists - run: | - if git ls-remote --exit-code --heads origin "$BRANCH_NAME"; then - echo "Branch $BRANCH_NAME already exists. Skipping run to avoid conflicts." - echo "Please merge or close the existing PR before the next nightly run." - exit 1 - fi - - name: Configure git and create branch run: | git config --local user.email "action@github.com" git config --local user.name "GitHub Action" - git checkout -b "$BRANCH_NAME" + + - name: Check out dependency update branch + run: | + if git ls-remote --exit-code --heads origin "$BRANCH_NAME"; then + echo "Branch $BRANCH_NAME already exists, checking out..." + git checkout "$BRANCH_NAME" + else + echo "Branch $BRANCH_NAME does not exist, creating new branch..." + git checkout -b "$BRANCH_NAME" + fi - name: Set up Python uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c #v6.0.0 From 9efd150f3f73db63488ed8592063705c7a8f6a2b Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Thu, 25 Sep 2025 12:19:38 -0700 Subject: [PATCH 28/46] Revert "call main build on nightly build branch" This reverts commit 957024b84a6f00e1f23fdcb48a173a1af353c52c. --- .github/workflows/main-build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index b336af415..4e3feb237 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -6,7 +6,6 @@ on: - main - "release/v*" - ci-workflow - - nightly-dependency-updates workflow_dispatch: # be able to run the workflow on demand workflow_call: inputs: @@ -123,7 +122,7 @@ jobs: name: "Publish Main Build Status" needs: [ build, application-signals-e2e-test ] runs-on: ubuntu-latest - if: always() && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')) + if: always() steps: - name: Configure AWS Credentials for emitting metrics uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 #5.0.0 From 5ebbe3432bad243a978a6f1ca57cb9426aed2aef Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Thu, 25 Sep 2025 12:40:25 -0700 Subject: [PATCH 29/46] add links to breaking changes in PR --- .github/workflows/nightly-build.yml | 14 +++- scripts/find_breaking_changes.py | 109 ++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 scripts/find_breaking_changes.py diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 79a777255..7a372605e 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -46,7 +46,7 @@ jobs: - name: Install build tools run: | python -m pip install --upgrade pip - pip install toml requests + pip install toml requests packaging - name: Get latest upstream versions id: get_versions @@ -58,6 +58,13 @@ jobs: OTEL_CONTRIB_VERSION: ${{ steps.get_versions.outputs.otel_contrib_version }} run: python scripts/update_dependencies.py + - name: Check for breaking changes + id: breaking_changes + env: + OTEL_PYTHON_VERSION: ${{ steps.get_versions.outputs.otel_python_version }} + OTEL_CONTRIB_VERSION: ${{ steps.get_versions.outputs.otel_contrib_version }} + run: python scripts/find_breaking_changes.py + - name: Check for changes and create PR id: check_changes run: | @@ -79,7 +86,10 @@ jobs: **Updated versions:** - OpenTelemetry Python: ${{ steps.get_versions.outputs.otel_python_version }} - - OpenTelemetry Contrib: ${{ steps.get_versions.outputs.otel_contrib_version }}" \ + - OpenTelemetry Contrib: ${{ steps.get_versions.outputs.otel_contrib_version }} + + **Upstream releases with breaking changes:** + ${{ steps.breaking_changes.outputs.breaking_changes_info }}" \ --base main \ --head "$BRANCH_NAME" fi diff --git a/scripts/find_breaking_changes.py b/scripts/find_breaking_changes.py new file mode 100644 index 000000000..ca0028264 --- /dev/null +++ b/scripts/find_breaking_changes.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python3 + +import requests +import sys +import os +import re +from packaging import version + +def get_current_version_from_pyproject(): + """Extract current OpenTelemetry versions from pyproject.toml.""" + try: + with open('aws-opentelemetry-distro/pyproject.toml', 'r', encoding='utf-8') as file: + content = file.read() + + # Find first opentelemetry-api version (core version) + api_match = re.search(r'"opentelemetry-api == ([^"]*)"', content) + current_core_version = api_match.group(1) if api_match else None + + # Find first opentelemetry-distro version (contrib version) + distro_match = re.search(r'"opentelemetry-distro == ([^"]*)"', content) + current_contrib_version = distro_match.group(1) if distro_match else None + + return current_core_version, current_contrib_version + + except Exception as error: + print(f"Error reading current versions: {error}") + return None, None + +def get_releases_with_breaking_changes(repo, current_version, new_version): + """Get releases between current and new version that mention breaking changes.""" + try: + response = requests.get( + f'https://api.github.com/repos/open-telemetry/{repo}/releases', + timeout=30 + ) + response.raise_for_status() + + releases = response.json() + breaking_releases = [] + + for release in releases: + release_version = release['tag_name'].lstrip('v') + + # Check if this release is between current and new version + try: + if (version.parse(release_version) > version.parse(current_version) and + version.parse(release_version) <= version.parse(new_version)): + + # Check if release notes mention breaking changes + body = release.get('body', '').lower() + if any(keyword in body for keyword in ['breaking change', 'breaking changes', 'breaking:', 'breaking']): + breaking_releases.append({ + 'version': release_version, + 'name': release['name'], + 'url': release['html_url'], + 'body': release.get('body', '') + }) + except Exception: + # Skip releases with invalid version formats + continue + + return breaking_releases + + except requests.RequestException as request_error: + print(f"Warning: Could not get releases for {repo}: {request_error}") + return [] + +def main(): + new_core_version = os.environ.get('OTEL_PYTHON_VERSION') + new_contrib_version = os.environ.get('OTEL_CONTRIB_VERSION') + + if not new_core_version or not new_contrib_version: + print("Error: OTEL_PYTHON_VERSION and OTEL_CONTRIB_VERSION environment variables required") + sys.exit(1) + + current_core_version, current_contrib_version = get_current_version_from_pyproject() + + if not current_core_version or not current_contrib_version: + print("Could not determine current versions") + sys.exit(1) + + print(f"Checking for breaking changes:") + print(f"Core: {current_core_version} → {new_core_version}") + print(f"Contrib: {current_contrib_version} → {new_contrib_version}") + + # Check both repos for breaking changes + core_breaking = get_releases_with_breaking_changes('opentelemetry-python', current_core_version, new_core_version) + contrib_breaking = get_releases_with_breaking_changes('opentelemetry-python-contrib', current_contrib_version, new_contrib_version) + + # Output for GitHub Actions + breaking_info = "" + + if core_breaking: + breaking_info += "**opentelemetry-python:**\\n" + for release in core_breaking: + breaking_info += f"- [{release['name']}]({release['url']})\\n" + + if contrib_breaking: + breaking_info += "**opentelemetry-python-contrib:**\\n" + for release in contrib_breaking: + breaking_info += f"- [{release['name']}]({release['url']})\\n" + + # Set GitHub output + if os.environ.get('GITHUB_OUTPUT'): + with open(os.environ['GITHUB_OUTPUT'], 'a', encoding='utf-8') as output_file: + output_file.write(f'breaking_changes_info={breaking_info}\n') + +if __name__ == '__main__': + main() From 1b56b7507965ea4e2ed877e79d8324f8f81330ee Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Thu, 25 Sep 2025 12:41:13 -0700 Subject: [PATCH 30/46] add push trigger for testing --- .github/workflows/nightly-build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 7a372605e..c50345f00 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -4,6 +4,9 @@ on: schedule: - cron: "21 3 * * *" workflow_dispatch: + push: + branches: + - zhaez/nightly-build env: BRANCH_NAME: nightly-dependency-updates From 2f26b9cf7d3dbd90f03d5e5466d4df977886dc01 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Thu, 25 Sep 2025 12:45:52 -0700 Subject: [PATCH 31/46] check breaking changes before updating --- .github/workflows/nightly-build.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index c50345f00..bf37bd9f3 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -55,18 +55,18 @@ jobs: id: get_versions run: python scripts/get_upstream_versions.py - - name: Update dependencies + - name: Check for breaking changes + id: breaking_changes env: OTEL_PYTHON_VERSION: ${{ steps.get_versions.outputs.otel_python_version }} OTEL_CONTRIB_VERSION: ${{ steps.get_versions.outputs.otel_contrib_version }} - run: python scripts/update_dependencies.py + run: python scripts/find_breaking_changes.py - - name: Check for breaking changes - id: breaking_changes + - name: Update dependencies env: OTEL_PYTHON_VERSION: ${{ steps.get_versions.outputs.otel_python_version }} OTEL_CONTRIB_VERSION: ${{ steps.get_versions.outputs.otel_contrib_version }} - run: python scripts/find_breaking_changes.py + run: python scripts/update_dependencies.py - name: Check for changes and create PR id: check_changes From 0329b092971de4a46010d43d9193c0f628dc6552 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Thu, 25 Sep 2025 12:51:56 -0700 Subject: [PATCH 32/46] update PR for existing branch --- .github/workflows/nightly-build.yml | 31 +++++++++++++++++++---------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index bf37bd9f3..43df9facf 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -68,7 +68,7 @@ jobs: OTEL_CONTRIB_VERSION: ${{ steps.get_versions.outputs.otel_contrib_version }} run: python scripts/update_dependencies.py - - name: Check for changes and create PR + - name: Check for changes and commit id: check_changes run: | if git diff --quiet; then @@ -78,21 +78,30 @@ jobs: echo "Dependencies were updated" echo "has_changes=true" >> $GITHUB_OUTPUT - # Create PR git add aws-opentelemetry-distro/pyproject.toml git commit -m "chore: update OpenTelemetry dependencies to ${{ steps.get_versions.outputs.otel_python_version }}/${{ steps.get_versions.outputs.otel_contrib_version }}" git push origin "$BRANCH_NAME" - - gh pr create \ - --title "Nightly dependency update: OpenTelemetry ${{ steps.get_versions.outputs.otel_python_version }}/${{ steps.get_versions.outputs.otel_contrib_version }}" \ - --body "Automated update of OpenTelemetry dependencies. + fi + + - name: Create or update PR + run: | + PR_BODY="Automated update of OpenTelemetry dependencies. - **Updated versions:** - - OpenTelemetry Python: ${{ steps.get_versions.outputs.otel_python_version }} - - OpenTelemetry Contrib: ${{ steps.get_versions.outputs.otel_contrib_version }} + **Updated versions:** + - OpenTelemetry Python: ${{ steps.get_versions.outputs.otel_python_version }} + - OpenTelemetry Contrib: ${{ steps.get_versions.outputs.otel_contrib_version }} - **Upstream releases with breaking changes:** - ${{ steps.breaking_changes.outputs.breaking_changes_info }}" \ + **Upstream releases with breaking changes:** + ${{ steps.breaking_changes.outputs.breaking_changes_info }}" + + if gh pr view "$BRANCH_NAME" > /dev/null 2>&1; then + echo "PR already exists, updating description..." + gh pr edit "$BRANCH_NAME" --body "$PR_BODY" + else + echo "Creating new PR..." + gh pr create \ + --title "Nightly dependency update: OpenTelemetry ${{ steps.get_versions.outputs.otel_python_version }}/${{ steps.get_versions.outputs.otel_contrib_version }}" \ + --body "$PR_BODY" \ --base main \ --head "$BRANCH_NAME" fi From 4db8d3e82034fcd0af71745c2118649769413ac5 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Thu, 25 Sep 2025 13:08:20 -0700 Subject: [PATCH 33/46] update PR correctly if new breaking changes are found --- .github/workflows/nightly-build.yml | 31 +++++++++++++++-------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 43df9facf..551ee8d42 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -26,21 +26,6 @@ jobs: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} - - name: Configure git and create branch - run: | - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - - - name: Check out dependency update branch - run: | - if git ls-remote --exit-code --heads origin "$BRANCH_NAME"; then - echo "Branch $BRANCH_NAME already exists, checking out..." - git checkout "$BRANCH_NAME" - else - echo "Branch $BRANCH_NAME does not exist, creating new branch..." - git checkout -b "$BRANCH_NAME" - fi - - name: Set up Python uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c #v6.0.0 with: @@ -62,6 +47,21 @@ jobs: OTEL_CONTRIB_VERSION: ${{ steps.get_versions.outputs.otel_contrib_version }} run: python scripts/find_breaking_changes.py + - name: Configure git and create branch + run: | + git config --local user.email "action@github.com" + git config --local user.name "GitHub Action" + + - name: Check out dependency update branch + run: | + if git ls-remote --exit-code --heads origin "$BRANCH_NAME"; then + echo "Branch $BRANCH_NAME already exists, checking out..." + git checkout "$BRANCH_NAME" + else + echo "Branch $BRANCH_NAME does not exist, creating new branch..." + git checkout -b "$BRANCH_NAME" + fi + - name: Update dependencies env: OTEL_PYTHON_VERSION: ${{ steps.get_versions.outputs.otel_python_version }} @@ -84,6 +84,7 @@ jobs: fi - name: Create or update PR + if: steps.check_changes.outputs.has_changes == 'true' run: | PR_BODY="Automated update of OpenTelemetry dependencies. From 84706be44b46c5b83b68d3f20af5365db1b8f589 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Thu, 25 Sep 2025 13:18:16 -0700 Subject: [PATCH 34/46] fix PR formatting --- scripts/find_breaking_changes.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/find_breaking_changes.py b/scripts/find_breaking_changes.py index ca0028264..2845c914a 100644 --- a/scripts/find_breaking_changes.py +++ b/scripts/find_breaking_changes.py @@ -91,19 +91,19 @@ def main(): breaking_info = "" if core_breaking: - breaking_info += "**opentelemetry-python:**\\n" + breaking_info += "**opentelemetry-python:**\n" for release in core_breaking: - breaking_info += f"- [{release['name']}]({release['url']})\\n" + breaking_info += f"- [{release['name']}]({release['url']})\n" if contrib_breaking: - breaking_info += "**opentelemetry-python-contrib:**\\n" + breaking_info += "**opentelemetry-python-contrib:**\n" for release in contrib_breaking: - breaking_info += f"- [{release['name']}]({release['url']})\\n" + breaking_info += f"- [{release['name']}]({release['url']})\n" # Set GitHub output if os.environ.get('GITHUB_OUTPUT'): with open(os.environ['GITHUB_OUTPUT'], 'a', encoding='utf-8') as output_file: - output_file.write(f'breaking_changes_info={breaking_info}\n') + output_file.write(f'breaking_changes_info< Date: Thu, 25 Sep 2025 13:18:33 -0700 Subject: [PATCH 35/46] search for open PR in branch --- .github/workflows/nightly-build.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 551ee8d42..28d403b65 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -84,7 +84,6 @@ jobs: fi - name: Create or update PR - if: steps.check_changes.outputs.has_changes == 'true' run: | PR_BODY="Automated update of OpenTelemetry dependencies. @@ -95,8 +94,8 @@ jobs: **Upstream releases with breaking changes:** ${{ steps.breaking_changes.outputs.breaking_changes_info }}" - if gh pr view "$BRANCH_NAME" > /dev/null 2>&1; then - echo "PR already exists, updating description..." + if gh pr view "$BRANCH_NAME" --json state --jq '.state' 2>/dev/null | grep -q "OPEN"; then + echo "Open PR already exists, updating description..." gh pr edit "$BRANCH_NAME" --body "$PR_BODY" else echo "Creating new PR..." From 1357fc8919eb22fab51eb430939e816f02157ae5 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Thu, 25 Sep 2025 13:20:59 -0700 Subject: [PATCH 36/46] PR format fix --- scripts/find_breaking_changes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/find_breaking_changes.py b/scripts/find_breaking_changes.py index 2845c914a..3612ff8f1 100644 --- a/scripts/find_breaking_changes.py +++ b/scripts/find_breaking_changes.py @@ -96,7 +96,7 @@ def main(): breaking_info += f"- [{release['name']}]({release['url']})\n" if contrib_breaking: - breaking_info += "**opentelemetry-python-contrib:**\n" + breaking_info += "\n**opentelemetry-python-contrib:**\n" for release in contrib_breaking: breaking_info += f"- [{release['name']}]({release['url']})\n" From 74c6fb4ffd94f4eba0404180c652d854ecdf3cf3 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Thu, 25 Sep 2025 14:00:06 -0700 Subject: [PATCH 37/46] publish metric for nightly build failures --- .github/workflows/nightly-build.yml | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 28d403b65..976757d0b 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -9,6 +9,7 @@ on: - zhaez/nightly-build env: + AWS_DEFAULT_REGION: us-east-1 BRANCH_NAME: nightly-dependency-updates jobs: @@ -117,4 +118,28 @@ jobs: id-token: write contents: read with: - ref: nightly-dependency-updates \ No newline at end of file + ref: nightly-dependency-updates + + publish-nightly-build-status: + name: "Publish Nightly Build Status" + needs: [ update-and-create-pr, build-and-test ] + runs-on: ubuntu-latest + if: always() + steps: + - name: Configure AWS Credentials for emitting metrics + uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 #5.0.0 + with: + role-to-assume: ${{ secrets.MONITORING_ROLE_ARN }} + aws-region: ${{ env.AWS_DEFAULT_REGION }} + + - name: Publish nightly build status + run: | + if [[ "${{ needs.build-and-test.result }}" == "skipped" ]]; then + echo "Build was skipped (no changes), not publishing metric" + else + value="${{ needs.build-and-test.result == 'success' && '0.0' || '1.0'}}" + aws cloudwatch put-metric-data --namespace 'ADOT/GitHubActions' \ + --metric-name Failure \ + --dimensions repository=${{ github.repository }},branch=${{ github.ref_name }},workflow=nightly_build \ + --value $value + fi \ No newline at end of file From f5ba0360b285a9e1c40f7977398eb0d5519d996a Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Thu, 25 Sep 2025 14:04:16 -0700 Subject: [PATCH 38/46] add permission to configure AWS credentials --- .github/workflows/main-build.yml | 2 +- .github/workflows/nightly-build.yml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml index 4e3feb237..39e0caa79 100644 --- a/.github/workflows/main-build.yml +++ b/.github/workflows/main-build.yml @@ -122,7 +122,7 @@ jobs: name: "Publish Main Build Status" needs: [ build, application-signals-e2e-test ] runs-on: ubuntu-latest - if: always() + if: always() && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')) steps: - name: Configure AWS Credentials for emitting metrics uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 #5.0.0 diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 976757d0b..2d38a430e 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -12,6 +12,9 @@ env: AWS_DEFAULT_REGION: us-east-1 BRANCH_NAME: nightly-dependency-updates +permissions: + id-token: write + jobs: update-and-create-pr: runs-on: ubuntu-latest From 8b0526539c4033710558039dde9b6c6eeb7b4b95 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Thu, 25 Sep 2025 14:12:04 -0700 Subject: [PATCH 39/46] add write and pr permissions --- .github/workflows/nightly-build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 2d38a430e..dc95383b1 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -14,6 +14,8 @@ env: permissions: id-token: write + contents: write + pull-requests: write jobs: update-and-create-pr: From dda3ac055d1483245b93714d6937cbd60754b4f7 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Thu, 25 Sep 2025 14:38:37 -0700 Subject: [PATCH 40/46] Revert "add test branch to push to" This reverts commit 076e5291298a514dce0195250feafa60e5499147. --- .github/workflows/nightly-build.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index dc95383b1..8eec923bc 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -4,9 +4,6 @@ on: schedule: - cron: "21 3 * * *" workflow_dispatch: - push: - branches: - - zhaez/nightly-build env: AWS_DEFAULT_REGION: us-east-1 From 63b72f3dba0cf0c23640cfaf066f193dcb51789a Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Thu, 25 Sep 2025 15:24:05 -0700 Subject: [PATCH 41/46] lint fixes for breaking changes script --- scripts/find_breaking_changes.py | 103 +++++++++++++++++-------------- 1 file changed, 57 insertions(+), 46 deletions(-) diff --git a/scripts/find_breaking_changes.py b/scripts/find_breaking_changes.py index 3612ff8f1..35bc47ac3 100644 --- a/scripts/find_breaking_changes.py +++ b/scripts/find_breaking_changes.py @@ -1,109 +1,120 @@ #!/usr/bin/env python3 +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 -import requests -import sys import os import re +import sys + +import requests from packaging import version + def get_current_version_from_pyproject(): """Extract current OpenTelemetry versions from pyproject.toml.""" try: - with open('aws-opentelemetry-distro/pyproject.toml', 'r', encoding='utf-8') as file: + with open("aws-opentelemetry-distro/pyproject.toml", "r", encoding="utf-8") as file: content = file.read() - + # Find first opentelemetry-api version (core version) api_match = re.search(r'"opentelemetry-api == ([^"]*)"', content) current_core_version = api_match.group(1) if api_match else None - - # Find first opentelemetry-distro version (contrib version) + + # Find first opentelemetry-distro version (contrib version) distro_match = re.search(r'"opentelemetry-distro == ([^"]*)"', content) current_contrib_version = distro_match.group(1) if distro_match else None - + return current_core_version, current_contrib_version - + except Exception as error: print(f"Error reading current versions: {error}") return None, None + def get_releases_with_breaking_changes(repo, current_version, new_version): """Get releases between current and new version that mention breaking changes.""" try: - response = requests.get( - f'https://api.github.com/repos/open-telemetry/{repo}/releases', - timeout=30 - ) + response = requests.get(f"https://api.github.com/repos/open-telemetry/{repo}/releases", timeout=30) response.raise_for_status() - + releases = response.json() breaking_releases = [] - + for release in releases: - release_version = release['tag_name'].lstrip('v') - + release_version = release["tag_name"].lstrip("v") + # Check if this release is between current and new version try: - if (version.parse(release_version) > version.parse(current_version) and - version.parse(release_version) <= version.parse(new_version)): - + if version.parse(release_version) > version.parse(current_version) and version.parse( + release_version + ) <= version.parse(new_version): + # Check if release notes mention breaking changes - body = release.get('body', '').lower() - if any(keyword in body for keyword in ['breaking change', 'breaking changes', 'breaking:', 'breaking']): - breaking_releases.append({ - 'version': release_version, - 'name': release['name'], - 'url': release['html_url'], - 'body': release.get('body', '') - }) + body = release.get("body", "").lower() + if any( + keyword in body for keyword in ["breaking change", "breaking changes", "breaking:", "breaking"] + ): + breaking_releases.append( + { + "version": release_version, + "name": release["name"], + "url": release["html_url"], + "body": release.get("body", ""), + } + ) except Exception: # Skip releases with invalid version formats continue - + return breaking_releases - + except requests.RequestException as request_error: print(f"Warning: Could not get releases for {repo}: {request_error}") return [] + def main(): - new_core_version = os.environ.get('OTEL_PYTHON_VERSION') - new_contrib_version = os.environ.get('OTEL_CONTRIB_VERSION') - + new_core_version = os.environ.get("OTEL_PYTHON_VERSION") + new_contrib_version = os.environ.get("OTEL_CONTRIB_VERSION") + if not new_core_version or not new_contrib_version: print("Error: OTEL_PYTHON_VERSION and OTEL_CONTRIB_VERSION environment variables required") sys.exit(1) - + current_core_version, current_contrib_version = get_current_version_from_pyproject() - + if not current_core_version or not current_contrib_version: print("Could not determine current versions") sys.exit(1) - + print(f"Checking for breaking changes:") print(f"Core: {current_core_version} → {new_core_version}") print(f"Contrib: {current_contrib_version} → {new_contrib_version}") - + # Check both repos for breaking changes - core_breaking = get_releases_with_breaking_changes('opentelemetry-python', current_core_version, new_core_version) - contrib_breaking = get_releases_with_breaking_changes('opentelemetry-python-contrib', current_contrib_version, new_contrib_version) - + core_breaking = get_releases_with_breaking_changes("opentelemetry-python", current_core_version, new_core_version) + contrib_breaking = get_releases_with_breaking_changes( + "opentelemetry-python-contrib", current_contrib_version, new_contrib_version + ) + # Output for GitHub Actions breaking_info = "" - + if core_breaking: breaking_info += "**opentelemetry-python:**\n" for release in core_breaking: breaking_info += f"- [{release['name']}]({release['url']})\n" - + if contrib_breaking: breaking_info += "\n**opentelemetry-python-contrib:**\n" for release in contrib_breaking: breaking_info += f"- [{release['name']}]({release['url']})\n" - + # Set GitHub output - if os.environ.get('GITHUB_OUTPUT'): - with open(os.environ['GITHUB_OUTPUT'], 'a', encoding='utf-8') as output_file: - output_file.write(f'breaking_changes_info< Date: Fri, 26 Sep 2025 18:52:54 -0700 Subject: [PATCH 42/46] lint fix --- scripts/find_breaking_changes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/find_breaking_changes.py b/scripts/find_breaking_changes.py index 35bc47ac3..9f8622620 100644 --- a/scripts/find_breaking_changes.py +++ b/scripts/find_breaking_changes.py @@ -87,7 +87,7 @@ def main(): print("Could not determine current versions") sys.exit(1) - print(f"Checking for breaking changes:") + print("Checking for breaking changes:") print(f"Core: {current_core_version} → {new_core_version}") print(f"Contrib: {current_contrib_version} → {new_contrib_version}") From bb66be454b0e0d32741a799273d8c68706ceefd0 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Fri, 26 Sep 2025 18:57:10 -0700 Subject: [PATCH 43/46] check for breaking changes as headers --- scripts/find_breaking_changes.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/scripts/find_breaking_changes.py b/scripts/find_breaking_changes.py index 9f8622620..1d2f98047 100644 --- a/scripts/find_breaking_changes.py +++ b/scripts/find_breaking_changes.py @@ -49,11 +49,10 @@ def get_releases_with_breaking_changes(repo, current_version, new_version): release_version ) <= version.parse(new_version): - # Check if release notes mention breaking changes - body = release.get("body", "").lower() - if any( - keyword in body for keyword in ["breaking change", "breaking changes", "breaking:", "breaking"] - ): + # Check if release notes have breaking changes as headers + body = release.get("body", "") + breaking_header_pattern = r'^#+.*breaking changes' + if re.search(breaking_header_pattern, body, re.IGNORECASE | re.MULTILINE): breaking_releases.append( { "version": release_version, From 692abde7a04d3e6b987684d7a6eb0dee26575ea7 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Fri, 26 Sep 2025 19:03:32 -0700 Subject: [PATCH 44/46] test trigger --- .github/workflows/nightly-build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 8eec923bc..dc75b6311 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -4,6 +4,9 @@ on: schedule: - cron: "21 3 * * *" workflow_dispatch: + push: + branches: + - zhaez/nightly-build env: AWS_DEFAULT_REGION: us-east-1 From 12cc0e52a13ac5361449f54ebaf6fa1ed7444dd6 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Fri, 26 Sep 2025 19:28:12 -0700 Subject: [PATCH 45/46] Revert "check for breaking changes as headers" This reverts commit bb66be454b0e0d32741a799273d8c68706ceefd0. --- scripts/find_breaking_changes.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/scripts/find_breaking_changes.py b/scripts/find_breaking_changes.py index 1d2f98047..9f8622620 100644 --- a/scripts/find_breaking_changes.py +++ b/scripts/find_breaking_changes.py @@ -49,10 +49,11 @@ def get_releases_with_breaking_changes(repo, current_version, new_version): release_version ) <= version.parse(new_version): - # Check if release notes have breaking changes as headers - body = release.get("body", "") - breaking_header_pattern = r'^#+.*breaking changes' - if re.search(breaking_header_pattern, body, re.IGNORECASE | re.MULTILINE): + # Check if release notes mention breaking changes + body = release.get("body", "").lower() + if any( + keyword in body for keyword in ["breaking change", "breaking changes", "breaking:", "breaking"] + ): breaking_releases.append( { "version": release_version, From 959702ba4d1249f018722f52bf0fc2092d6db876 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Sat, 27 Sep 2025 02:32:06 +0000 Subject: [PATCH 46/46] chore: update OpenTelemetry dependencies to 1.37.0/0.58b0 --- aws-opentelemetry-distro/pyproject.toml | 112 ++++++++++++------------ 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/aws-opentelemetry-distro/pyproject.toml b/aws-opentelemetry-distro/pyproject.toml index 414b09221..f18f96ebb 100644 --- a/aws-opentelemetry-distro/pyproject.toml +++ b/aws-opentelemetry-distro/pyproject.toml @@ -26,62 +26,62 @@ classifiers = [ ] dependencies = [ - "opentelemetry-api == 1.33.1", - "opentelemetry-sdk == 1.33.1", - "opentelemetry-exporter-otlp-proto-grpc == 1.33.1", - "opentelemetry-exporter-otlp-proto-http == 1.33.1", - "opentelemetry-propagator-b3 == 1.33.1", - "opentelemetry-propagator-jaeger == 1.33.1", - "opentelemetry-exporter-otlp-proto-common == 1.33.1", - "opentelemetry-sdk-extension-aws == 2.0.2", - "opentelemetry-propagator-aws-xray == 1.0.1", - "opentelemetry-distro == 0.54b1", - "opentelemetry-processor-baggage == 0.54b1", - "opentelemetry-propagator-ot-trace == 0.54b1", - "opentelemetry-instrumentation == 0.54b1", - "opentelemetry-instrumentation-aws-lambda == 0.54b1", - "opentelemetry-instrumentation-aio-pika == 0.54b1", - "opentelemetry-instrumentation-aiohttp-client == 0.54b1", - "opentelemetry-instrumentation-aiopg == 0.54b1", - "opentelemetry-instrumentation-asgi == 0.54b1", - "opentelemetry-instrumentation-asyncpg == 0.54b1", - "opentelemetry-instrumentation-boto == 0.54b1", - "opentelemetry-instrumentation-boto3sqs == 0.54b1", - "opentelemetry-instrumentation-botocore == 0.54b1", - "opentelemetry-instrumentation-celery == 0.54b1", - "opentelemetry-instrumentation-confluent-kafka == 0.54b1", - "opentelemetry-instrumentation-dbapi == 0.54b1", - "opentelemetry-instrumentation-django == 0.54b1", - "opentelemetry-instrumentation-elasticsearch == 0.54b1", - "opentelemetry-instrumentation-falcon == 0.54b1", - "opentelemetry-instrumentation-fastapi == 0.54b1", - "opentelemetry-instrumentation-flask == 0.54b1", - "opentelemetry-instrumentation-grpc == 0.54b1", - "opentelemetry-instrumentation-httpx == 0.54b1", - "opentelemetry-instrumentation-jinja2 == 0.54b1", - "opentelemetry-instrumentation-kafka-python == 0.54b1", - "opentelemetry-instrumentation-logging == 0.54b1", - "opentelemetry-instrumentation-mysql == 0.54b1", - "opentelemetry-instrumentation-mysqlclient == 0.54b1", - "opentelemetry-instrumentation-pika == 0.54b1", - "opentelemetry-instrumentation-psycopg2 == 0.54b1", - "opentelemetry-instrumentation-pymemcache == 0.54b1", - "opentelemetry-instrumentation-pymongo == 0.54b1", - "opentelemetry-instrumentation-pymysql == 0.54b1", - "opentelemetry-instrumentation-pyramid == 0.54b1", - "opentelemetry-instrumentation-redis == 0.54b1", - "opentelemetry-instrumentation-remoulade == 0.54b1", - "opentelemetry-instrumentation-requests == 0.54b1", - "opentelemetry-instrumentation-sqlalchemy == 0.54b1", - "opentelemetry-instrumentation-sqlite3 == 0.54b1", - "opentelemetry-instrumentation-starlette == 0.54b1", - "opentelemetry-instrumentation-system-metrics == 0.54b1", - "opentelemetry-instrumentation-tornado == 0.54b1", - "opentelemetry-instrumentation-tortoiseorm == 0.54b1", - "opentelemetry-instrumentation-urllib == 0.54b1", - "opentelemetry-instrumentation-urllib3 == 0.54b1", - "opentelemetry-instrumentation-wsgi == 0.54b1", - "opentelemetry-instrumentation-cassandra == 0.54b1", + "opentelemetry-api == 1.37.0", + "opentelemetry-sdk == 1.37.0", + "opentelemetry-exporter-otlp-proto-grpc == 1.37.0", + "opentelemetry-exporter-otlp-proto-http == 1.37.0", + "opentelemetry-propagator-b3 == 1.37.0", + "opentelemetry-propagator-jaeger == 1.37.0", + "opentelemetry-exporter-otlp-proto-common == 1.37.0", + "opentelemetry-sdk-extension-aws == 2.1.0", + "opentelemetry-propagator-aws-xray == 1.0.2", + "opentelemetry-distro == 0.58b0", + "opentelemetry-processor-baggage == 0.58b0", + "opentelemetry-propagator-ot-trace == 0.58b0", + "opentelemetry-instrumentation == 0.58b0", + "opentelemetry-instrumentation-aws-lambda == 0.58b0", + "opentelemetry-instrumentation-aio-pika == 0.58b0", + "opentelemetry-instrumentation-aiohttp-client == 0.58b0", + "opentelemetry-instrumentation-aiopg == 0.58b0", + "opentelemetry-instrumentation-asgi == 0.58b0", + "opentelemetry-instrumentation-asyncpg == 0.58b0", + "opentelemetry-instrumentation-boto == 0.58b0", + "opentelemetry-instrumentation-boto3sqs == 0.58b0", + "opentelemetry-instrumentation-botocore == 0.58b0", + "opentelemetry-instrumentation-celery == 0.58b0", + "opentelemetry-instrumentation-confluent-kafka == 0.58b0", + "opentelemetry-instrumentation-dbapi == 0.58b0", + "opentelemetry-instrumentation-django == 0.58b0", + "opentelemetry-instrumentation-elasticsearch == 0.58b0", + "opentelemetry-instrumentation-falcon == 0.58b0", + "opentelemetry-instrumentation-fastapi == 0.58b0", + "opentelemetry-instrumentation-flask == 0.58b0", + "opentelemetry-instrumentation-grpc == 0.58b0", + "opentelemetry-instrumentation-httpx == 0.58b0", + "opentelemetry-instrumentation-jinja2 == 0.58b0", + "opentelemetry-instrumentation-kafka-python == 0.58b0", + "opentelemetry-instrumentation-logging == 0.58b0", + "opentelemetry-instrumentation-mysql == 0.58b0", + "opentelemetry-instrumentation-mysqlclient == 0.58b0", + "opentelemetry-instrumentation-pika == 0.58b0", + "opentelemetry-instrumentation-psycopg2 == 0.58b0", + "opentelemetry-instrumentation-pymemcache == 0.58b0", + "opentelemetry-instrumentation-pymongo == 0.58b0", + "opentelemetry-instrumentation-pymysql == 0.58b0", + "opentelemetry-instrumentation-pyramid == 0.58b0", + "opentelemetry-instrumentation-redis == 0.58b0", + "opentelemetry-instrumentation-remoulade == 0.58b0", + "opentelemetry-instrumentation-requests == 0.58b0", + "opentelemetry-instrumentation-sqlalchemy == 0.58b0", + "opentelemetry-instrumentation-sqlite3 == 0.58b0", + "opentelemetry-instrumentation-starlette == 0.58b0", + "opentelemetry-instrumentation-system-metrics == 0.58b0", + "opentelemetry-instrumentation-tornado == 0.58b0", + "opentelemetry-instrumentation-tortoiseorm == 0.58b0", + "opentelemetry-instrumentation-urllib == 0.58b0", + "opentelemetry-instrumentation-urllib3 == 0.58b0", + "opentelemetry-instrumentation-wsgi == 0.58b0", + "opentelemetry-instrumentation-cassandra == 0.58b0", ] [project.optional-dependencies]