From d6862fc0b8770738697dc1d36ce75fda3dc8574d Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 25 Jun 2026 04:45:22 +0000 Subject: [PATCH 1/9] chore: update OpenTelemetry dependencies to 1.43.0/0.64b0 --- aws-opentelemetry-distro/pyproject.toml | 108 +++++++++--------- .../images/mock-collector/pyproject.toml | 4 +- .../images/mock-collector/requirements.txt | 4 +- contract-tests/tests/pyproject.toml | 4 +- lambda-layer/src/tests/requirements.txt | 4 +- tox.ini | 4 +- 6 files changed, 64 insertions(+), 64 deletions(-) diff --git a/aws-opentelemetry-distro/pyproject.toml b/aws-opentelemetry-distro/pyproject.toml index 35ad8b3b9..a3af96d64 100644 --- a/aws-opentelemetry-distro/pyproject.toml +++ b/aws-opentelemetry-distro/pyproject.toml @@ -26,63 +26,63 @@ classifiers = [ ] dependencies = [ - "opentelemetry-api == 1.42.1", - "opentelemetry-sdk == 1.42.1", - "opentelemetry-exporter-otlp-proto-grpc == 1.42.1", - "opentelemetry-exporter-otlp-proto-http == 1.42.1", - "opentelemetry-propagator-b3 == 1.42.1", - "opentelemetry-propagator-jaeger == 1.42.1", - "opentelemetry-exporter-otlp-proto-common == 1.42.1", + "opentelemetry-api == 1.43.0", + "opentelemetry-sdk == 1.43.0", + "opentelemetry-exporter-otlp-proto-grpc == 1.43.0", + "opentelemetry-exporter-otlp-proto-http == 1.43.0", + "opentelemetry-propagator-b3 == 1.43.0", + "opentelemetry-propagator-jaeger == 1.43.0", + "opentelemetry-exporter-otlp-proto-common == 1.43.0", "opentelemetry-sdk-extension-aws == 2.1.0", "opentelemetry-propagator-aws-xray == 1.0.2", - "opentelemetry-distro == 0.63b1", - "opentelemetry-processor-baggage == 0.63b1", - "opentelemetry-propagator-ot-trace == 0.63b1", - "opentelemetry-instrumentation == 0.63b1", - "opentelemetry-instrumentation-aws-lambda == 0.63b1", - "opentelemetry-instrumentation-aio-pika == 0.63b1", - "opentelemetry-instrumentation-aiohttp-client == 0.63b1", - "opentelemetry-instrumentation-aiokafka == 0.63b1", - "opentelemetry-instrumentation-aiopg == 0.63b1", - "opentelemetry-instrumentation-asgi == 0.63b1", - "opentelemetry-instrumentation-asyncpg == 0.63b1", - "opentelemetry-instrumentation-boto3sqs == 0.63b1", - "opentelemetry-instrumentation-botocore == 0.63b1", - "opentelemetry-instrumentation-celery == 0.63b1", - "opentelemetry-instrumentation-confluent-kafka == 0.63b1", - "opentelemetry-instrumentation-dbapi == 0.63b1", - "opentelemetry-instrumentation-django == 0.63b1", - "opentelemetry-instrumentation-elasticsearch == 0.63b1", - "opentelemetry-instrumentation-falcon == 0.63b1", - "opentelemetry-instrumentation-fastapi == 0.63b1", - "opentelemetry-instrumentation-flask == 0.63b1", - "opentelemetry-instrumentation-grpc == 0.63b1", - "opentelemetry-instrumentation-httpx == 0.63b1", - "opentelemetry-instrumentation-jinja2 == 0.63b1", - "opentelemetry-instrumentation-kafka-python == 0.63b1", - "opentelemetry-instrumentation-logging == 0.63b1", - "opentelemetry-instrumentation-mysql == 0.63b1", - "opentelemetry-instrumentation-mysqlclient == 0.63b1", - "opentelemetry-instrumentation-pika == 0.63b1", - "opentelemetry-instrumentation-psycopg2 == 0.63b1", - "opentelemetry-instrumentation-pymemcache == 0.63b1", - "opentelemetry-instrumentation-pymongo == 0.63b1", - "opentelemetry-instrumentation-pymysql == 0.63b1", - "opentelemetry-instrumentation-pyramid == 0.63b1", - "opentelemetry-instrumentation-redis == 0.63b1", - "opentelemetry-instrumentation-remoulade == 0.63b1", - "opentelemetry-instrumentation-requests == 0.63b1", - "opentelemetry-instrumentation-sqlalchemy == 0.63b1", - "opentelemetry-instrumentation-sqlite3 == 0.63b1", - "opentelemetry-instrumentation-starlette == 0.63b1", - "opentelemetry-instrumentation-system-metrics == 0.63b1", + "opentelemetry-distro == 0.64b0", + "opentelemetry-processor-baggage == 0.64b0", + "opentelemetry-propagator-ot-trace == 0.64b0", + "opentelemetry-instrumentation == 0.64b0", + "opentelemetry-instrumentation-aws-lambda == 0.64b0", + "opentelemetry-instrumentation-aio-pika == 0.64b0", + "opentelemetry-instrumentation-aiohttp-client == 0.64b0", + "opentelemetry-instrumentation-aiokafka == 0.64b0", + "opentelemetry-instrumentation-aiopg == 0.64b0", + "opentelemetry-instrumentation-asgi == 0.64b0", + "opentelemetry-instrumentation-asyncpg == 0.64b0", + "opentelemetry-instrumentation-boto3sqs == 0.64b0", + "opentelemetry-instrumentation-botocore == 0.64b0", + "opentelemetry-instrumentation-celery == 0.64b0", + "opentelemetry-instrumentation-confluent-kafka == 0.64b0", + "opentelemetry-instrumentation-dbapi == 0.64b0", + "opentelemetry-instrumentation-django == 0.64b0", + "opentelemetry-instrumentation-elasticsearch == 0.64b0", + "opentelemetry-instrumentation-falcon == 0.64b0", + "opentelemetry-instrumentation-fastapi == 0.64b0", + "opentelemetry-instrumentation-flask == 0.64b0", + "opentelemetry-instrumentation-grpc == 0.64b0", + "opentelemetry-instrumentation-httpx == 0.64b0", + "opentelemetry-instrumentation-jinja2 == 0.64b0", + "opentelemetry-instrumentation-kafka-python == 0.64b0", + "opentelemetry-instrumentation-logging == 0.64b0", + "opentelemetry-instrumentation-mysql == 0.64b0", + "opentelemetry-instrumentation-mysqlclient == 0.64b0", + "opentelemetry-instrumentation-pika == 0.64b0", + "opentelemetry-instrumentation-psycopg2 == 0.64b0", + "opentelemetry-instrumentation-pymemcache == 0.64b0", + "opentelemetry-instrumentation-pymongo == 0.64b0", + "opentelemetry-instrumentation-pymysql == 0.64b0", + "opentelemetry-instrumentation-pyramid == 0.64b0", + "opentelemetry-instrumentation-redis == 0.64b0", + "opentelemetry-instrumentation-remoulade == 0.64b0", + "opentelemetry-instrumentation-requests == 0.64b0", + "opentelemetry-instrumentation-sqlalchemy == 0.64b0", + "opentelemetry-instrumentation-sqlite3 == 0.64b0", + "opentelemetry-instrumentation-starlette == 0.64b0", + "opentelemetry-instrumentation-system-metrics == 0.64b0", "opentelemetry-instrumentation-threading == 0.63b1", - "opentelemetry-instrumentation-tornado == 0.63b1", - "opentelemetry-instrumentation-tortoiseorm == 0.63b1", - "opentelemetry-instrumentation-urllib == 0.63b1", - "opentelemetry-instrumentation-urllib3 == 0.63b1", - "opentelemetry-instrumentation-wsgi == 0.63b1", - "opentelemetry-instrumentation-cassandra == 0.63b1", + "opentelemetry-instrumentation-tornado == 0.64b0", + "opentelemetry-instrumentation-tortoiseorm == 0.64b0", + "opentelemetry-instrumentation-urllib == 0.64b0", + "opentelemetry-instrumentation-urllib3 == 0.64b0", + "opentelemetry-instrumentation-wsgi == 0.64b0", + "opentelemetry-instrumentation-cassandra == 0.64b0", "opentelemetry-instrumentation-openai-agents-v2 == 0.1.0", "cachetools == 6.2.4", "urllib3 >= 2.7.0; python_version >= '3.10'", diff --git a/contract-tests/images/mock-collector/pyproject.toml b/contract-tests/images/mock-collector/pyproject.toml index 937fb0317..173fbec28 100644 --- a/contract-tests/images/mock-collector/pyproject.toml +++ b/contract-tests/images/mock-collector/pyproject.toml @@ -11,8 +11,8 @@ requires-python = ">=3.10" dependencies = [ "grpcio ~= 1.76.0", - "opentelemetry-proto == 1.42.1", - "opentelemetry-sdk == 1.42.1", + "opentelemetry-proto == 1.43.0", + "opentelemetry-sdk == 1.43.0", "protobuf==6.33.5", "typing-extensions==4.15.0" ] diff --git a/contract-tests/images/mock-collector/requirements.txt b/contract-tests/images/mock-collector/requirements.txt index a78fe344e..004285620 100644 --- a/contract-tests/images/mock-collector/requirements.txt +++ b/contract-tests/images/mock-collector/requirements.txt @@ -1,5 +1,5 @@ grpcio==1.76.0 -opentelemetry-proto==1.42.1 -opentelemetry-sdk==1.42.1 +opentelemetry-proto==1.43.0 +opentelemetry-sdk==1.43.0 protobuf==6.33.5 typing-extensions==4.15.0 diff --git a/contract-tests/tests/pyproject.toml b/contract-tests/tests/pyproject.toml index ca8881556..2d339f2b6 100644 --- a/contract-tests/tests/pyproject.toml +++ b/contract-tests/tests/pyproject.toml @@ -10,8 +10,8 @@ license = "Apache-2.0" requires-python = ">=3.10" dependencies = [ - "opentelemetry-proto == 1.42.1", - "opentelemetry-sdk == 1.42.1", + "opentelemetry-proto == 1.43.0", + "opentelemetry-sdk == 1.43.0", "testcontainers==3.7.1", "grpcio==1.76.0", "docker==7.1.0", diff --git a/lambda-layer/src/tests/requirements.txt b/lambda-layer/src/tests/requirements.txt index 075a8b001..dfb45378f 100644 --- a/lambda-layer/src/tests/requirements.txt +++ b/lambda-layer/src/tests/requirements.txt @@ -1,3 +1,3 @@ # Dependencies used in tests only -opentelemetry-test-utils==0.63b1 -opentelemetry-instrumentation-aws-lambda==0.63b1 +opentelemetry-test-utils==0.64b0 +opentelemetry-instrumentation-aws-lambda==0.64b0 diff --git a/tox.ini b/tox.ini index a290daea7..485c0db8c 100644 --- a/tox.ini +++ b/tox.ini @@ -32,8 +32,8 @@ passenv = ADOT_WHEEL setenv = - CORE_REPO=git+https://github.com/open-telemetry/opentelemetry-python.git@release/v1.42.x-0.63bx - CONTRIB_REPO=git+https://github.com/open-telemetry/opentelemetry-python-contrib.git@release/v1.42.x-0.63bx + CORE_REPO=git+https://github.com/open-telemetry/opentelemetry-python.git@release/v1.43.x-0.64bx + CONTRIB_REPO=git+https://github.com/open-telemetry/opentelemetry-python-contrib.git@release/v1.43.x-0.64bx COVERAGE_FILE={toxinidir}/.coverage COVERAGE_RUN=coverage run --parallel --source={envsitepackagesdir}/amazon --rcfile={toxinidir}/.coveragerc ; Enable coverage collection in subprocesses spawned during tests. From 5045f59fced501bfcf51d744c11b7c6fd3d78994 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 17 Jul 2026 04:23:27 +0000 Subject: [PATCH 2/9] chore: update OpenTelemetry dependencies to 1.44.0/0.65b0 --- aws-opentelemetry-distro/pyproject.toml | 108 +++++++++--------- .../images/mock-collector/pyproject.toml | 4 +- .../images/mock-collector/requirements.txt | 4 +- contract-tests/tests/pyproject.toml | 4 +- lambda-layer/src/tests/requirements.txt | 4 +- tox.ini | 4 +- 6 files changed, 64 insertions(+), 64 deletions(-) diff --git a/aws-opentelemetry-distro/pyproject.toml b/aws-opentelemetry-distro/pyproject.toml index a3af96d64..aa41aa75c 100644 --- a/aws-opentelemetry-distro/pyproject.toml +++ b/aws-opentelemetry-distro/pyproject.toml @@ -26,63 +26,63 @@ classifiers = [ ] dependencies = [ - "opentelemetry-api == 1.43.0", - "opentelemetry-sdk == 1.43.0", - "opentelemetry-exporter-otlp-proto-grpc == 1.43.0", - "opentelemetry-exporter-otlp-proto-http == 1.43.0", - "opentelemetry-propagator-b3 == 1.43.0", - "opentelemetry-propagator-jaeger == 1.43.0", - "opentelemetry-exporter-otlp-proto-common == 1.43.0", + "opentelemetry-api == 1.44.0", + "opentelemetry-sdk == 1.44.0", + "opentelemetry-exporter-otlp-proto-grpc == 1.44.0", + "opentelemetry-exporter-otlp-proto-http == 1.44.0", + "opentelemetry-propagator-b3 == 1.44.0", + "opentelemetry-propagator-jaeger == 1.44.0", + "opentelemetry-exporter-otlp-proto-common == 1.44.0", "opentelemetry-sdk-extension-aws == 2.1.0", "opentelemetry-propagator-aws-xray == 1.0.2", - "opentelemetry-distro == 0.64b0", - "opentelemetry-processor-baggage == 0.64b0", - "opentelemetry-propagator-ot-trace == 0.64b0", - "opentelemetry-instrumentation == 0.64b0", - "opentelemetry-instrumentation-aws-lambda == 0.64b0", - "opentelemetry-instrumentation-aio-pika == 0.64b0", - "opentelemetry-instrumentation-aiohttp-client == 0.64b0", - "opentelemetry-instrumentation-aiokafka == 0.64b0", - "opentelemetry-instrumentation-aiopg == 0.64b0", - "opentelemetry-instrumentation-asgi == 0.64b0", - "opentelemetry-instrumentation-asyncpg == 0.64b0", - "opentelemetry-instrumentation-boto3sqs == 0.64b0", - "opentelemetry-instrumentation-botocore == 0.64b0", - "opentelemetry-instrumentation-celery == 0.64b0", - "opentelemetry-instrumentation-confluent-kafka == 0.64b0", - "opentelemetry-instrumentation-dbapi == 0.64b0", - "opentelemetry-instrumentation-django == 0.64b0", - "opentelemetry-instrumentation-elasticsearch == 0.64b0", - "opentelemetry-instrumentation-falcon == 0.64b0", - "opentelemetry-instrumentation-fastapi == 0.64b0", - "opentelemetry-instrumentation-flask == 0.64b0", - "opentelemetry-instrumentation-grpc == 0.64b0", - "opentelemetry-instrumentation-httpx == 0.64b0", - "opentelemetry-instrumentation-jinja2 == 0.64b0", - "opentelemetry-instrumentation-kafka-python == 0.64b0", - "opentelemetry-instrumentation-logging == 0.64b0", - "opentelemetry-instrumentation-mysql == 0.64b0", - "opentelemetry-instrumentation-mysqlclient == 0.64b0", - "opentelemetry-instrumentation-pika == 0.64b0", - "opentelemetry-instrumentation-psycopg2 == 0.64b0", - "opentelemetry-instrumentation-pymemcache == 0.64b0", - "opentelemetry-instrumentation-pymongo == 0.64b0", - "opentelemetry-instrumentation-pymysql == 0.64b0", - "opentelemetry-instrumentation-pyramid == 0.64b0", - "opentelemetry-instrumentation-redis == 0.64b0", - "opentelemetry-instrumentation-remoulade == 0.64b0", - "opentelemetry-instrumentation-requests == 0.64b0", - "opentelemetry-instrumentation-sqlalchemy == 0.64b0", - "opentelemetry-instrumentation-sqlite3 == 0.64b0", - "opentelemetry-instrumentation-starlette == 0.64b0", - "opentelemetry-instrumentation-system-metrics == 0.64b0", + "opentelemetry-distro == 0.65b0", + "opentelemetry-processor-baggage == 0.65b0", + "opentelemetry-propagator-ot-trace == 0.65b0", + "opentelemetry-instrumentation == 0.65b0", + "opentelemetry-instrumentation-aws-lambda == 0.65b0", + "opentelemetry-instrumentation-aio-pika == 0.65b0", + "opentelemetry-instrumentation-aiohttp-client == 0.65b0", + "opentelemetry-instrumentation-aiokafka == 0.65b0", + "opentelemetry-instrumentation-aiopg == 0.65b0", + "opentelemetry-instrumentation-asgi == 0.65b0", + "opentelemetry-instrumentation-asyncpg == 0.65b0", + "opentelemetry-instrumentation-boto3sqs == 0.65b0", + "opentelemetry-instrumentation-botocore == 0.65b0", + "opentelemetry-instrumentation-celery == 0.65b0", + "opentelemetry-instrumentation-confluent-kafka == 0.65b0", + "opentelemetry-instrumentation-dbapi == 0.65b0", + "opentelemetry-instrumentation-django == 0.65b0", + "opentelemetry-instrumentation-elasticsearch == 0.65b0", + "opentelemetry-instrumentation-falcon == 0.65b0", + "opentelemetry-instrumentation-fastapi == 0.65b0", + "opentelemetry-instrumentation-flask == 0.65b0", + "opentelemetry-instrumentation-grpc == 0.65b0", + "opentelemetry-instrumentation-httpx == 0.65b0", + "opentelemetry-instrumentation-jinja2 == 0.65b0", + "opentelemetry-instrumentation-kafka-python == 0.65b0", + "opentelemetry-instrumentation-logging == 0.65b0", + "opentelemetry-instrumentation-mysql == 0.65b0", + "opentelemetry-instrumentation-mysqlclient == 0.65b0", + "opentelemetry-instrumentation-pika == 0.65b0", + "opentelemetry-instrumentation-psycopg2 == 0.65b0", + "opentelemetry-instrumentation-pymemcache == 0.65b0", + "opentelemetry-instrumentation-pymongo == 0.65b0", + "opentelemetry-instrumentation-pymysql == 0.65b0", + "opentelemetry-instrumentation-pyramid == 0.65b0", + "opentelemetry-instrumentation-redis == 0.65b0", + "opentelemetry-instrumentation-remoulade == 0.65b0", + "opentelemetry-instrumentation-requests == 0.65b0", + "opentelemetry-instrumentation-sqlalchemy == 0.65b0", + "opentelemetry-instrumentation-sqlite3 == 0.65b0", + "opentelemetry-instrumentation-starlette == 0.65b0", + "opentelemetry-instrumentation-system-metrics == 0.65b0", "opentelemetry-instrumentation-threading == 0.63b1", - "opentelemetry-instrumentation-tornado == 0.64b0", - "opentelemetry-instrumentation-tortoiseorm == 0.64b0", - "opentelemetry-instrumentation-urllib == 0.64b0", - "opentelemetry-instrumentation-urllib3 == 0.64b0", - "opentelemetry-instrumentation-wsgi == 0.64b0", - "opentelemetry-instrumentation-cassandra == 0.64b0", + "opentelemetry-instrumentation-tornado == 0.65b0", + "opentelemetry-instrumentation-tortoiseorm == 0.65b0", + "opentelemetry-instrumentation-urllib == 0.65b0", + "opentelemetry-instrumentation-urllib3 == 0.65b0", + "opentelemetry-instrumentation-wsgi == 0.65b0", + "opentelemetry-instrumentation-cassandra == 0.65b0", "opentelemetry-instrumentation-openai-agents-v2 == 0.1.0", "cachetools == 6.2.4", "urllib3 >= 2.7.0; python_version >= '3.10'", diff --git a/contract-tests/images/mock-collector/pyproject.toml b/contract-tests/images/mock-collector/pyproject.toml index 173fbec28..f10b94d77 100644 --- a/contract-tests/images/mock-collector/pyproject.toml +++ b/contract-tests/images/mock-collector/pyproject.toml @@ -11,8 +11,8 @@ requires-python = ">=3.10" dependencies = [ "grpcio ~= 1.76.0", - "opentelemetry-proto == 1.43.0", - "opentelemetry-sdk == 1.43.0", + "opentelemetry-proto == 1.44.0", + "opentelemetry-sdk == 1.44.0", "protobuf==6.33.5", "typing-extensions==4.15.0" ] diff --git a/contract-tests/images/mock-collector/requirements.txt b/contract-tests/images/mock-collector/requirements.txt index 004285620..378b95525 100644 --- a/contract-tests/images/mock-collector/requirements.txt +++ b/contract-tests/images/mock-collector/requirements.txt @@ -1,5 +1,5 @@ grpcio==1.76.0 -opentelemetry-proto==1.43.0 -opentelemetry-sdk==1.43.0 +opentelemetry-proto==1.44.0 +opentelemetry-sdk==1.44.0 protobuf==6.33.5 typing-extensions==4.15.0 diff --git a/contract-tests/tests/pyproject.toml b/contract-tests/tests/pyproject.toml index 2d339f2b6..ce699a5b2 100644 --- a/contract-tests/tests/pyproject.toml +++ b/contract-tests/tests/pyproject.toml @@ -10,8 +10,8 @@ license = "Apache-2.0" requires-python = ">=3.10" dependencies = [ - "opentelemetry-proto == 1.43.0", - "opentelemetry-sdk == 1.43.0", + "opentelemetry-proto == 1.44.0", + "opentelemetry-sdk == 1.44.0", "testcontainers==3.7.1", "grpcio==1.76.0", "docker==7.1.0", diff --git a/lambda-layer/src/tests/requirements.txt b/lambda-layer/src/tests/requirements.txt index dfb45378f..03d1f73ba 100644 --- a/lambda-layer/src/tests/requirements.txt +++ b/lambda-layer/src/tests/requirements.txt @@ -1,3 +1,3 @@ # Dependencies used in tests only -opentelemetry-test-utils==0.64b0 -opentelemetry-instrumentation-aws-lambda==0.64b0 +opentelemetry-test-utils==0.65b0 +opentelemetry-instrumentation-aws-lambda==0.65b0 diff --git a/tox.ini b/tox.ini index 485c0db8c..833b8ef1a 100644 --- a/tox.ini +++ b/tox.ini @@ -32,8 +32,8 @@ passenv = ADOT_WHEEL setenv = - CORE_REPO=git+https://github.com/open-telemetry/opentelemetry-python.git@release/v1.43.x-0.64bx - CONTRIB_REPO=git+https://github.com/open-telemetry/opentelemetry-python-contrib.git@release/v1.43.x-0.64bx + CORE_REPO=git+https://github.com/open-telemetry/opentelemetry-python.git@release/v1.44.x-0.65bx + CONTRIB_REPO=git+https://github.com/open-telemetry/opentelemetry-python-contrib.git@release/v1.44.x-0.65bx COVERAGE_FILE={toxinidir}/.coverage COVERAGE_RUN=coverage run --parallel --source={envsitepackagesdir}/amazon --rcfile={toxinidir}/.coveragerc ; Enable coverage collection in subprocesses spawned during tests. From 318c03653d90288b5d2f66c9c36d6db91808a461 Mon Sep 17 00:00:00 2001 From: Steve Liu Date: Tue, 21 Jul 2026 17:38:09 -0700 Subject: [PATCH 3/9] fix(deps): bump threading to 0.65b0 and drop elasticsearch removed upstream Two issues blocked the 1.44.0/0.65b0 nightly bump: - opentelemetry-instrumentation-threading was left at 0.63b1 while every other contrib package moved to 0.65b0. threading 0.63b1 pins opentelemetry-instrumentation==0.63b1, conflicting with the ==0.65b0 pin, so pip could not resolve the graph. - opentelemetry-instrumentation-elasticsearch == 0.65b0 does not exist on PyPI: upstream dropped the package in the 0.65b0 contrib release now that all supported elasticsearch versions ship native OTel instrumentation (max published version is 0.64b0), which failed the image build with "No matching distribution found". Bump threading to 0.65b0 and remove elasticsearch from the distro dependencies, the lite-mode instrumentor map, and the nightly bot's CONTRIB_DEPS allowlist so future bumps do not re-add a nonexistent pin. --- CHANGELOG.md | 2 ++ aws-opentelemetry-distro/pyproject.toml | 3 +-- .../src/amazon/opentelemetry/distro/opentelemetry_lite_sdk.py | 1 - scripts/update_dependencies.py | 1 - 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7b5f0d64..0d333ef92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ If your change does not need a CHANGELOG entry, add the "skip changelog" label t ## Unreleased +- Nightly dependency update: OpenTelemetry 1.44.0/0.65b0; drop `opentelemetry-instrumentation-elasticsearch` (removed upstream in 0.65b0 now that all supported `elasticsearch` versions ship native OTel instrumentation) + ([#799](https://github.com/aws-observability/aws-otel-python-instrumentation/pull/799)) - feat(genai): capture user input and agent output on llama_index invoke_agent spans ([#824](https://github.com/aws-observability/aws-otel-python-instrumentation/pull/824)) - fix(crewai): use native per-call token usage when crewai provides it diff --git a/aws-opentelemetry-distro/pyproject.toml b/aws-opentelemetry-distro/pyproject.toml index aa41aa75c..eb1ff4791 100644 --- a/aws-opentelemetry-distro/pyproject.toml +++ b/aws-opentelemetry-distro/pyproject.toml @@ -52,7 +52,6 @@ dependencies = [ "opentelemetry-instrumentation-confluent-kafka == 0.65b0", "opentelemetry-instrumentation-dbapi == 0.65b0", "opentelemetry-instrumentation-django == 0.65b0", - "opentelemetry-instrumentation-elasticsearch == 0.65b0", "opentelemetry-instrumentation-falcon == 0.65b0", "opentelemetry-instrumentation-fastapi == 0.65b0", "opentelemetry-instrumentation-flask == 0.65b0", @@ -76,7 +75,7 @@ dependencies = [ "opentelemetry-instrumentation-sqlite3 == 0.65b0", "opentelemetry-instrumentation-starlette == 0.65b0", "opentelemetry-instrumentation-system-metrics == 0.65b0", - "opentelemetry-instrumentation-threading == 0.63b1", + "opentelemetry-instrumentation-threading == 0.65b0", "opentelemetry-instrumentation-tornado == 0.65b0", "opentelemetry-instrumentation-tortoiseorm == 0.65b0", "opentelemetry-instrumentation-urllib == 0.65b0", diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/opentelemetry_lite_sdk.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/opentelemetry_lite_sdk.py index 4a7765cc4..e73c72d68 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/opentelemetry_lite_sdk.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/opentelemetry_lite_sdk.py @@ -772,7 +772,6 @@ def configure_lite_mode(): "confluent_kafka": "opentelemetry.instrumentation.confluent_kafka:ConfluentKafkaInstrumentor", "dbapi": "opentelemetry.instrumentation.dbapi:DatabaseApiIntegration", "django": "opentelemetry.instrumentation.django:DjangoInstrumentor", - "elasticsearch": "opentelemetry.instrumentation.elasticsearch:ElasticsearchInstrumentor", "falcon": "opentelemetry.instrumentation.falcon:FalconInstrumentor", "fastapi": "opentelemetry.instrumentation.fastapi:FastAPIInstrumentor", "flask": "opentelemetry.instrumentation.flask:FlaskInstrumentor", diff --git a/scripts/update_dependencies.py b/scripts/update_dependencies.py index 1c850192c..35427ae19 100644 --- a/scripts/update_dependencies.py +++ b/scripts/update_dependencies.py @@ -38,7 +38,6 @@ "opentelemetry-instrumentation-confluent-kafka", "opentelemetry-instrumentation-dbapi", "opentelemetry-instrumentation-django", - "opentelemetry-instrumentation-elasticsearch", "opentelemetry-instrumentation-falcon", "opentelemetry-instrumentation-fastapi", "opentelemetry-instrumentation-flask", From 1e1a4117600426ed0d51542160e64254b934f1d6 Mon Sep 17 00:00:00 2001 From: Steve Liu Date: Tue, 21 Jul 2026 18:06:01 -0700 Subject: [PATCH 4/9] fix(deps): adapt to OTel 1.44.0 breaking changes (Events API removal, LogExporter.force_flush) Bumping to opentelemetry 1.44.0/0.65b0 surfaced additional upstream breaking changes beyond the version pins: 1. The Events API/SDK (opentelemetry._events, opentelemetry.sdk._events) was removed. An event is now a LogRecord with event_name set, emitted through the Logs API/SDK. Migrate all three call sites: - llo_handler.py: emit the consolidated Gen AI event as a LogRecord via LoggerProvider.get_logger(...).emit(...) - debugger/_snapshot_otlp_emitter.py: same, and rename the cached _event_logger to _logger - aws_opentelemetry_configurator._init_logging: drop the now-defunct EventLoggerProvider / set_event_logger_provider setup 2. LogExporter/LogRecordExporter gained a required abstract force_flush. CompactConsoleLogRecordExporter only defined export/shutdown, so it could no longer be instantiated. Add force_flush. Update the affected unit tests to the LogRecord shape (event_name replaces the Event class's name field, which no longer injects an event.name attribute). Full distro unit suite passes (2189 passed / 51 skipped). --- CHANGELOG.md | 2 +- .../distro/aws_opentelemetry_configurator.py | 5 ---- .../distro/debugger/_snapshot_otlp_emitter.py | 27 ++++++++----------- .../logs/compact_console_log_exporter.py | 4 +++ .../opentelemetry/distro/llo_handler.py | 12 ++++----- .../debugger/test_snapshot_otlp_emitter.py | 7 ++--- .../test_snapshot_otlp_emitter_extra.py | 18 ++++++------- .../llo_handler/test_llo_handler_base.py | 10 +++---- .../llo_handler/test_llo_handler_events.py | 19 ++++++------- .../llo_handler/test_llo_handler_patterns.py | 3 +-- .../test_otlp_attribute_vs_body_types.py | 19 ++++++------- 11 files changed, 51 insertions(+), 75 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d333ef92..0bbf4a2d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ If your change does not need a CHANGELOG entry, add the "skip changelog" label t ## Unreleased -- Nightly dependency update: OpenTelemetry 1.44.0/0.65b0; drop `opentelemetry-instrumentation-elasticsearch` (removed upstream in 0.65b0 now that all supported `elasticsearch` versions ship native OTel instrumentation) +- Nightly dependency update: OpenTelemetry 1.44.0/0.65b0. Adapts to upstream breaking changes: drop `opentelemetry-instrumentation-elasticsearch` (removed in 0.65b0 now that all supported `elasticsearch` versions ship native OTel instrumentation), migrate off the removed Events API/SDK (`opentelemetry._events`) to `LogRecord` with `event_name` via the Logs API, and implement the now-required `force_flush` on `CompactConsoleLogRecordExporter` ([#799](https://github.com/aws-observability/aws-otel-python-instrumentation/pull/799)) - feat(genai): capture user input and agent output on llama_index invoke_agent spans ([#824](https://github.com/aws-observability/aws-otel-python-instrumentation/pull/824)) diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_configurator.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_configurator.py index c4f24d409..280d8e99d 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_configurator.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_configurator.py @@ -42,7 +42,6 @@ from amazon.opentelemetry.distro.sampler.aws_xray_remote_sampler import AwsXRayRemoteSampler from amazon.opentelemetry.distro.scope_based_exporter import ScopeBasedPeriodicExportingMetricReader from amazon.opentelemetry.distro.scope_based_filtering_view import ScopeBasedRetainingView -from opentelemetry._events import set_event_logger_provider from opentelemetry._logs import get_logger_provider, set_logger_provider from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter as OTLPHttpOTLPMetricExporter @@ -59,7 +58,6 @@ _OTelSDKConfigurator, _overwrite_logging_config_fns, ) -from opentelemetry.sdk._events import EventLoggerProvider from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler from opentelemetry.sdk._logs.export import BatchLogRecordProcessor, ConsoleLogRecordExporter, LogRecordExporter from opentelemetry.sdk.environment_variables import ( @@ -319,9 +317,6 @@ def _init_logging( logger_provider=provider, log_exporter=_customize_logs_exporter(exporter_class(**exporter_args)) ) - event_logger_provider = EventLoggerProvider(logger_provider=provider) - set_event_logger_provider(event_logger_provider) - if setup_logging_handler: # Add OTel handler handler = LoggingHandler(level=logging.NOTSET, logger_provider=provider) diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/debugger/_snapshot_otlp_emitter.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/debugger/_snapshot_otlp_emitter.py index 5d62b9d15..eea73903e 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/debugger/_snapshot_otlp_emitter.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/debugger/_snapshot_otlp_emitter.py @@ -17,9 +17,8 @@ import os import threading -from opentelemetry._events import Event +from opentelemetry._logs import LogRecord from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter -from opentelemetry.sdk._events import EventLoggerProvider from opentelemetry.sdk._logs import LoggerProvider from opentelemetry.sdk._logs.export import BatchLogRecordProcessor from opentelemetry.sdk.resources import Resource @@ -53,23 +52,23 @@ def __init__(self, resource=None, logs_endpoint=None): self._resource = resource endpoint = logs_endpoint or os.environ.get(_LOGS_ENDPOINT_ENV_VAR, "") self._logs_endpoint = endpoint.strip() if endpoint.strip() else _DEFAULT_LOGS_ENDPOINT - self._event_logger = None + self._logger = None self._logger_provider = None self._init_failed = False self._lock = threading.Lock() def _ensure_initialized(self): - """Lazily initialize the LoggerProvider and EventLogger on first use. + """Lazily initialize the LoggerProvider and Logger on first use. Uses double-checked locking to be thread-safe without contention on the common path (already initialized). """ - if self._event_logger is not None: + if self._logger is not None: return True if self._init_failed: return False with self._lock: - if self._event_logger is not None: + if self._logger is not None: return True if self._init_failed: return False @@ -81,10 +80,7 @@ def _ensure_initialized(self): self._logger_provider = LoggerProvider(resource=resource) self._logger_provider.add_log_record_processor(BatchLogRecordProcessor(exporter)) - event_logger_provider = EventLoggerProvider(logger_provider=self._logger_provider) - self._event_logger = event_logger_provider.get_event_logger( - _INSTRUMENTATION_SCOPE, _INSTRUMENTATION_VERSION - ) + self._logger = self._logger_provider.get_logger(_INSTRUMENTATION_SCOPE, _INSTRUMENTATION_VERSION) logger.debug("DI OTLP emitter initialized (endpoint: %s)", self._logs_endpoint) return True @@ -165,9 +161,8 @@ def _emit_snapshot_internal(self, snapshot, config): if trace_id and span_id: trace_flags = TraceFlags(0x01) # SAMPLED - # Emit as Event - event = Event( - name=_EVENT_NAME, + log_record = LogRecord( + event_name=_EVENT_NAME, timestamp=snapshot.timestamp * 1_000_000, # ms to ns body=body if body else None, attributes=attributes, @@ -176,7 +171,7 @@ def _emit_snapshot_internal(self, snapshot, config): trace_flags=trace_flags, ) - self._event_logger.emit(event) + self._logger.emit(log_record) def shutdown(self): """Flush and shutdown the owned LoggerProvider.""" @@ -188,10 +183,10 @@ def shutdown(self): except Exception: # pylint: disable=broad-exception-caught logger.warning("Error shutting down DI OTLP LoggerProvider", exc_info=True) self._logger_provider = None - self._event_logger = None + self._logger = None def reset(self): """Reset state for post-fork cleanup. Does not flush — parent's threads are dead.""" self._logger_provider = None - self._event_logger = None + self._logger = None self._init_failed = False diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/exporter/console/logs/compact_console_log_exporter.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/exporter/console/logs/compact_console_log_exporter.py index d0e7f01f5..48bb1729e 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/exporter/console/logs/compact_console_log_exporter.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/exporter/console/logs/compact_console_log_exporter.py @@ -82,6 +82,10 @@ def shutdown(self): self._out.flush() self._shutdown = True + def force_flush(self, timeout_millis: int = 10000) -> bool: + self._out.flush() + return True + @staticmethod def _to_compact_json(data) -> str: # Support both ReadableLogRecord (1.39+) and LogData (older) APIs. diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/llo_handler.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/llo_handler.py index 674724334..10c84b329 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/llo_handler.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/llo_handler.py @@ -5,9 +5,8 @@ from enum import Enum from typing import Any, Dict, List, Optional, Sequence, TypedDict -from opentelemetry._events import Event +from opentelemetry._logs import LogRecord from opentelemetry.attributes import BoundedAttributes -from opentelemetry.sdk._events import EventLoggerProvider from opentelemetry.sdk._logs import LoggerProvider from opentelemetry.sdk.trace import Event as SpanEvent from opentelemetry.sdk.trace import ReadableSpan @@ -209,7 +208,6 @@ def __init__(self, logger_provider: LoggerProvider): Global LoggerProvider instance injected from our AwsOpenTelemetryConfigurator """ self._logger_provider = logger_provider - self._event_logger_provider = EventLoggerProvider(logger_provider=self._logger_provider) self._build_pattern_matchers() @@ -537,14 +535,14 @@ def _emit_llo_attributes( return timestamp = event_timestamp if event_timestamp is not None else span.end_time - event_logger = self._event_logger_provider.get_event_logger(span.instrumentation_scope.name) + logger = self._logger_provider.get_logger(span.instrumentation_scope.name) event_attributes = {} if span.attributes and "session.id" in span.attributes: event_attributes["session.id"] = span.attributes["session.id"] - event = Event( - name=span.instrumentation_scope.name, + log_record = LogRecord( + event_name=span.instrumentation_scope.name, timestamp=timestamp, body=event_body, attributes=event_attributes if event_attributes else None, @@ -553,7 +551,7 @@ def _emit_llo_attributes( trace_flags=span.context.trace_flags, ) - event_logger.emit(event) + logger.emit(log_record) _logger.debug("Emitted Gen AI Event with input/output message format") def _filter_attributes(self, attributes: types.Attributes) -> types.Attributes: diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/debugger/test_snapshot_otlp_emitter.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/debugger/test_snapshot_otlp_emitter.py index 3164676f0..8d4abc040 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/debugger/test_snapshot_otlp_emitter.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/debugger/test_snapshot_otlp_emitter.py @@ -37,10 +37,7 @@ def setUp(self): self.emitter = SnapshotOtlpEmitter() # Directly set the internals for testing self.emitter._logger_provider = self.logger_provider - from opentelemetry.sdk._events import EventLoggerProvider - - event_logger_provider = EventLoggerProvider(logger_provider=self.logger_provider) - self.emitter._event_logger = event_logger_provider.get_event_logger("aws.dynamic_instrumentation", "1.0") + self.emitter._logger = self.logger_provider.get_logger("aws.dynamic_instrumentation", "1.0") def tearDown(self): self.logger_provider.shutdown() @@ -230,7 +227,7 @@ def test_reset_clears_state(self): self.emitter.reset() self.assertIsNone(self.emitter._logger_provider) - self.assertIsNone(self.emitter._event_logger) + self.assertIsNone(self.emitter._logger) self.assertFalse(self.emitter._init_failed) def test_emit_after_init_failure_is_silent(self): diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/debugger/test_snapshot_otlp_emitter_extra.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/debugger/test_snapshot_otlp_emitter_extra.py index a78314ee4..4d42a1bbe 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/debugger/test_snapshot_otlp_emitter_extra.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/debugger/test_snapshot_otlp_emitter_extra.py @@ -19,7 +19,6 @@ _LOGS_ENDPOINT_ENV_VAR, SnapshotOtlpEmitter, ) -from opentelemetry.sdk._events import EventLoggerProvider from opentelemetry.sdk._logs import LoggerProvider from opentelemetry.sdk._logs.export import InMemoryLogExporter, SimpleLogRecordProcessor @@ -66,7 +65,7 @@ class TestEnsureInitialized(unittest.TestCase): def test_initialization_succeeds_and_is_cached(self, mock_exporter, mock_processor): emitter = SnapshotOtlpEmitter(logs_endpoint="http://localhost:4316/v1/logs") self.assertTrue(emitter._ensure_initialized()) - self.assertIsNotNone(emitter._event_logger) + self.assertIsNotNone(emitter._logger) # Exporter created with the resolved endpoint. mock_exporter.assert_called_once_with(endpoint="http://localhost:4316/v1/logs") @@ -151,14 +150,14 @@ def test_shutdown_flushes_and_clears_provider(self): emitter = SnapshotOtlpEmitter() provider = mock.MagicMock() emitter._logger_provider = provider - emitter._event_logger = mock.MagicMock() + emitter._logger = mock.MagicMock() emitter.shutdown() provider.force_flush.assert_called_once() provider.shutdown.assert_called_once() self.assertIsNone(emitter._logger_provider) - self.assertIsNone(emitter._event_logger) + self.assertIsNone(emitter._logger) def test_shutdown_without_provider_is_noop(self): emitter = SnapshotOtlpEmitter() @@ -171,22 +170,22 @@ def test_shutdown_swallows_errors(self): provider = mock.MagicMock() provider.force_flush.side_effect = RuntimeError("boom") emitter._logger_provider = provider - emitter._event_logger = mock.MagicMock() + emitter._logger = mock.MagicMock() # Should not raise; provider/event_logger are still cleared. emitter.shutdown() self.assertIsNone(emitter._logger_provider) - self.assertIsNone(emitter._event_logger) + self.assertIsNone(emitter._logger) def test_reset_clears_state_and_failure_flag(self): emitter = SnapshotOtlpEmitter() emitter._logger_provider = mock.MagicMock() - emitter._event_logger = mock.MagicMock() + emitter._logger = mock.MagicMock() emitter._init_failed = True emitter.reset() self.assertIsNone(emitter._logger_provider) - self.assertIsNone(emitter._event_logger) + self.assertIsNone(emitter._logger) self.assertFalse(emitter._init_failed) @@ -199,8 +198,7 @@ def setUp(self): self.logger_provider.add_log_record_processor(SimpleLogRecordProcessor(self.log_exporter)) self.emitter = SnapshotOtlpEmitter() self.emitter._logger_provider = self.logger_provider - event_logger_provider = EventLoggerProvider(logger_provider=self.logger_provider) - self.emitter._event_logger = event_logger_provider.get_event_logger("aws.dynamic_instrumentation", "1.0") + self.emitter._logger = self.logger_provider.get_logger("aws.dynamic_instrumentation", "1.0") def tearDown(self): self.logger_provider.shutdown() diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_base.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_base.py index 9f45da93d..06e34f15e 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_base.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_base.py @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 """Base test utilities for LLO Handler tests.""" from unittest import TestCase -from unittest.mock import MagicMock, patch +from unittest.mock import MagicMock from amazon.opentelemetry.distro.llo_handler import LLOHandler from opentelemetry.sdk._logs import LoggerProvider @@ -16,13 +16,9 @@ class LLOHandlerTestBase(TestCase): def setUp(self): self.logger_provider_mock = MagicMock(spec=LoggerProvider) self.event_logger_mock = MagicMock() - self.event_logger_provider_mock = MagicMock() - self.event_logger_provider_mock.get_event_logger.return_value = self.event_logger_mock + self.logger_provider_mock.get_logger.return_value = self.event_logger_mock - with patch( - "amazon.opentelemetry.distro.llo_handler.EventLoggerProvider", return_value=self.event_logger_provider_mock - ): - self.llo_handler = LLOHandler(self.logger_provider_mock) + self.llo_handler = LLOHandler(self.logger_provider_mock) @staticmethod def _create_mock_span(attributes=None, kind=SpanKind.INTERNAL, preserve_none=False): diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_events.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_events.py index 7b57e7ace..242574103 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_events.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_events.py @@ -40,7 +40,7 @@ def test_emit_llo_attributes(self): self.event_logger_mock.emit.assert_called_once() emitted_event = self.event_logger_mock.emit.call_args[0][0] - self.assertEqual(emitted_event.name, "test.scope") + self.assertEqual(emitted_event.event_name, "test.scope") self.assertEqual(emitted_event.timestamp, span.end_time) self.assertEqual(emitted_event.trace_id, span.context.trace_id) self.assertEqual(emitted_event.span_id, span.context.span_id) @@ -122,7 +122,7 @@ def test_emit_llo_attributes_multiple_frameworks(self): self.event_logger_mock.emit.assert_called_once() emitted_event = self.event_logger_mock.emit.call_args[0][0] - self.assertEqual(emitted_event.name, "test.multi.framework") + self.assertEqual(emitted_event.event_name, "test.multi.framework") self.assertEqual(emitted_event.timestamp, span.end_time) event_body = emitted_event.body @@ -636,8 +636,7 @@ def test_emit_llo_attributes_with_session_id(self): # Verify session.id was copied to event attributes self.assertIsNotNone(emitted_event.attributes) self.assertEqual(emitted_event.attributes.get("session.id"), "test-session-123") - # Event class always adds event.name - self.assertIn("event.name", emitted_event.attributes) + self.assertEqual(emitted_event.event_name, "test.scope") # Verify event body still contains LLO data event_body = emitted_event.body @@ -664,10 +663,8 @@ def test_emit_llo_attributes_without_session_id(self): emitted_event = self.event_logger_mock.emit.call_args[0][0] # Verify session.id is not in event attributes - self.assertIsNotNone(emitted_event.attributes) - self.assertNotIn("session.id", emitted_event.attributes) - # Event class always adds event.name - self.assertIn("event.name", emitted_event.attributes) + self.assertNotIn("session.id", emitted_event.attributes or {}) + self.assertEqual(emitted_event.event_name, "test.scope") def test_emit_llo_attributes_with_session_id_and_other_attributes(self): """ @@ -691,10 +688,10 @@ def test_emit_llo_attributes_with_session_id_and_other_attributes(self): self.event_logger_mock.emit.assert_called_once() emitted_event = self.event_logger_mock.emit.call_args[0][0] - # Verify only session.id was copied to event attributes (plus event.name from Event class) + # Verify only session.id was copied to event attributes self.assertIsNotNone(emitted_event.attributes) self.assertEqual(emitted_event.attributes.get("session.id"), "session-456") - self.assertIn("event.name", emitted_event.attributes) + self.assertEqual(emitted_event.event_name, "test.scope") # Verify other span attributes were not copied self.assertNotIn("user.id", emitted_event.attributes) self.assertNotIn("other.attribute", emitted_event.attributes) @@ -725,7 +722,7 @@ def test_emit_llo_attributes_otel_genai_patterns(self): self.event_logger_mock.emit.assert_called_once() emitted_event = self.event_logger_mock.emit.call_args[0][0] - self.assertEqual(emitted_event.name, "strands.genai.scope") + self.assertEqual(emitted_event.event_name, "strands.genai.scope") self.assertEqual(emitted_event.timestamp, span.end_time) event_body = emitted_event.body diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_patterns.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_patterns.py index 8505f3d17..4d5fecabb 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_patterns.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_patterns.py @@ -12,10 +12,9 @@ class TestLLOHandlerPatterns(LLOHandlerTestBase): def test_init(self): """ - Verify LLOHandler initializes correctly with logger provider and creates event logger provider. + Verify LLOHandler initializes correctly with the logger provider. """ self.assertEqual(self.llo_handler._logger_provider, self.logger_provider_mock) - self.assertEqual(self.llo_handler._event_logger_provider, self.event_logger_provider_mock) def test_is_llo_attribute_match(self): """ diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/serviceevents/exporter/test_otlp_attribute_vs_body_types.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/serviceevents/exporter/test_otlp_attribute_vs_body_types.py index 8b4c133b2..e40eae827 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/serviceevents/exporter/test_otlp_attribute_vs_body_types.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/serviceevents/exporter/test_otlp_attribute_vs_body_types.py @@ -20,9 +20,7 @@ import unittest -from opentelemetry._events import Event -from opentelemetry._logs import SeverityNumber -from opentelemetry.sdk._events import EventLoggerProvider +from opentelemetry._logs import LogRecord, SeverityNumber from opentelemetry.sdk._logs import LoggerProvider from opentelemetry.sdk._logs.export import InMemoryLogExporter, SimpleLogRecordProcessor from opentelemetry.sdk.resources import Resource @@ -36,8 +34,7 @@ def setUp(self): self.exporter = InMemoryLogExporter() self.provider = LoggerProvider(resource=Resource.create({"service.name": "test-service"})) self.provider.add_log_record_processor(SimpleLogRecordProcessor(self.exporter)) - self.event_logger_provider = EventLoggerProvider(logger_provider=self.provider) - self.event_logger = self.event_logger_provider.get_event_logger("test.scope") + self.logger = self.provider.get_logger("test.scope") def tearDown(self): self.provider.shutdown() @@ -45,13 +42,13 @@ def tearDown(self): def _emit_and_get(self, body, attributes): """Emit an event and return the exported log record.""" self.exporter.clear() - event = Event( - name="test.event", + record = LogRecord( + event_name="test.event", body=body, attributes=attributes, severity_number=SeverityNumber.INFO, ) - self.event_logger.emit(event) + self.logger.emit(record) records = self.exporter.get_finished_logs() self.assertEqual(len(records), 1) return records[0] @@ -317,8 +314,8 @@ def test_hybrid_incident_snapshot_with_trace_context(self): trace_id = int("699e34c662d55e013e833341a5d9f079", 16) span_id = int("85b7839f6afbae05", 16) - event = Event( - name="serviceevents.incident", + record_to_emit = LogRecord( + event_name="serviceevents.incident", body=body, attributes=attributes, severity_number=SeverityNumber.FATAL, # critical → FATAL @@ -327,7 +324,7 @@ def test_hybrid_incident_snapshot_with_trace_context(self): trace_flags=TraceFlags.SAMPLED, ) self.exporter.clear() - self.event_logger.emit(event) + self.logger.emit(record_to_emit) records = self.exporter.get_finished_logs() self.assertEqual(len(records), 1) record = records[0].log_record From 7199413d0fa9f98be59f1aab7f6137934efb3930 Mon Sep 17 00:00:00 2001 From: Steve Liu Date: Tue, 21 Jul 2026 18:09:08 -0700 Subject: [PATCH 5/9] docs: simplify #799 changelog entry --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bbf4a2d5..b8d5127b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ If your change does not need a CHANGELOG entry, add the "skip changelog" label t ## Unreleased -- Nightly dependency update: OpenTelemetry 1.44.0/0.65b0. Adapts to upstream breaking changes: drop `opentelemetry-instrumentation-elasticsearch` (removed in 0.65b0 now that all supported `elasticsearch` versions ship native OTel instrumentation), migrate off the removed Events API/SDK (`opentelemetry._events`) to `LogRecord` with `event_name` via the Logs API, and implement the now-required `force_flush` on `CompactConsoleLogRecordExporter` +- Nightly dependency update: OpenTelemetry 1.44.0/0.65b0 ([#799](https://github.com/aws-observability/aws-otel-python-instrumentation/pull/799)) - feat(genai): capture user input and agent output on llama_index invoke_agent spans ([#824](https://github.com/aws-observability/aws-otel-python-instrumentation/pull/824)) From 5f45e5d710fa949d0c1533ea01ca18b19cca7573 Mon Sep 17 00:00:00 2001 From: Steve Liu Date: Tue, 21 Jul 2026 18:23:04 -0700 Subject: [PATCH 6/9] fix(genai): preserve event.name wire attribute in LLO LogRecord The removed Events API auto-injected the event name into LogRecord attributes as "event.name". llo_handler relied on that, so migrating to the Logs API silently dropped it from emitted Gen AI LLO events, unlike the DI snapshot and serviceevents emitters which set it explicitly. Set "event.name" in _emit_llo_attributes so the on-the-wire shape is unchanged for downstream consumers, and revert the test assertions back to the originals. --- .../src/amazon/opentelemetry/distro/llo_handler.py | 2 +- .../distro/llo_handler/test_llo_handler_events.py | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/llo_handler.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/llo_handler.py index 10c84b329..1502aa126 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/llo_handler.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/llo_handler.py @@ -537,7 +537,7 @@ def _emit_llo_attributes( timestamp = event_timestamp if event_timestamp is not None else span.end_time logger = self._logger_provider.get_logger(span.instrumentation_scope.name) - event_attributes = {} + event_attributes = {"event.name": span.instrumentation_scope.name} if span.attributes and "session.id" in span.attributes: event_attributes["session.id"] = span.attributes["session.id"] diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_events.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_events.py index 242574103..a10d6955e 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_events.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_events.py @@ -636,7 +636,8 @@ def test_emit_llo_attributes_with_session_id(self): # Verify session.id was copied to event attributes self.assertIsNotNone(emitted_event.attributes) self.assertEqual(emitted_event.attributes.get("session.id"), "test-session-123") - self.assertEqual(emitted_event.event_name, "test.scope") + # Event class always adds event.name + self.assertIn("event.name", emitted_event.attributes) # Verify event body still contains LLO data event_body = emitted_event.body @@ -663,8 +664,10 @@ def test_emit_llo_attributes_without_session_id(self): emitted_event = self.event_logger_mock.emit.call_args[0][0] # Verify session.id is not in event attributes - self.assertNotIn("session.id", emitted_event.attributes or {}) - self.assertEqual(emitted_event.event_name, "test.scope") + self.assertIsNotNone(emitted_event.attributes) + self.assertNotIn("session.id", emitted_event.attributes) + # Event class always adds event.name + self.assertIn("event.name", emitted_event.attributes) def test_emit_llo_attributes_with_session_id_and_other_attributes(self): """ @@ -688,10 +691,10 @@ def test_emit_llo_attributes_with_session_id_and_other_attributes(self): self.event_logger_mock.emit.assert_called_once() emitted_event = self.event_logger_mock.emit.call_args[0][0] - # Verify only session.id was copied to event attributes + # Verify only session.id was copied to event attributes (plus event.name from Event class) self.assertIsNotNone(emitted_event.attributes) self.assertEqual(emitted_event.attributes.get("session.id"), "session-456") - self.assertEqual(emitted_event.event_name, "test.scope") + self.assertIn("event.name", emitted_event.attributes) # Verify other span attributes were not copied self.assertNotIn("user.id", emitted_event.attributes) self.assertNotIn("other.attribute", emitted_event.attributes) From 8a9eb6297360f4a3b3f189aff3dac9f442a1fcb1 Mon Sep 17 00:00:00 2001 From: Steve Liu Date: Wed, 22 Jul 2026 00:10:25 -0700 Subject: [PATCH 7/9] fix(genai): set severity_number=INFO on LLO LogRecord to match old Event wire shape --- .../src/amazon/opentelemetry/distro/llo_handler.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/llo_handler.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/llo_handler.py index 1502aa126..df07738be 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/llo_handler.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/llo_handler.py @@ -5,7 +5,7 @@ from enum import Enum from typing import Any, Dict, List, Optional, Sequence, TypedDict -from opentelemetry._logs import LogRecord +from opentelemetry._logs import LogRecord, SeverityNumber from opentelemetry.attributes import BoundedAttributes from opentelemetry.sdk._logs import LoggerProvider from opentelemetry.sdk.trace import Event as SpanEvent @@ -544,6 +544,7 @@ def _emit_llo_attributes( log_record = LogRecord( event_name=span.instrumentation_scope.name, timestamp=timestamp, + severity_number=SeverityNumber.INFO, body=event_body, attributes=event_attributes if event_attributes else None, trace_id=span.context.trace_id, From 33ce98d11b6b2ab1b5643de61bf4a156f5173ab3 Mon Sep 17 00:00:00 2001 From: Steve Liu Date: Wed, 22 Jul 2026 00:14:40 -0700 Subject: [PATCH 8/9] fix(debugger): set severity_number=INFO on DI snapshot LogRecord to match old Event wire shape --- .../opentelemetry/distro/debugger/_snapshot_otlp_emitter.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/debugger/_snapshot_otlp_emitter.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/debugger/_snapshot_otlp_emitter.py index eea73903e..725e6b6ad 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/debugger/_snapshot_otlp_emitter.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/debugger/_snapshot_otlp_emitter.py @@ -17,7 +17,7 @@ import os import threading -from opentelemetry._logs import LogRecord +from opentelemetry._logs import LogRecord, SeverityNumber from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter from opentelemetry.sdk._logs import LoggerProvider from opentelemetry.sdk._logs.export import BatchLogRecordProcessor @@ -164,6 +164,7 @@ def _emit_snapshot_internal(self, snapshot, config): log_record = LogRecord( event_name=_EVENT_NAME, timestamp=snapshot.timestamp * 1_000_000, # ms to ns + severity_number=SeverityNumber.INFO, body=body if body else None, attributes=attributes, trace_id=trace_id, From e38161afd048a8102f3e189cf9616441aac077a0 Mon Sep 17 00:00:00 2001 From: Steve Liu Date: Wed, 22 Jul 2026 09:24:23 -0700 Subject: [PATCH 9/9] cleanup: remove dead branch, stale elasticsearch entry, and stale comments --- .../src/amazon/opentelemetry/distro/llo_handler.py | 2 +- .../distro/llo_handler/test_llo_handler_events.py | 4 ++-- lambda-layer/src/otel-instrument | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/llo_handler.py b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/llo_handler.py index df07738be..7db657fa2 100644 --- a/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/llo_handler.py +++ b/aws-opentelemetry-distro/src/amazon/opentelemetry/distro/llo_handler.py @@ -546,7 +546,7 @@ def _emit_llo_attributes( timestamp=timestamp, severity_number=SeverityNumber.INFO, body=event_body, - attributes=event_attributes if event_attributes else None, + attributes=event_attributes, trace_id=span.context.trace_id, span_id=span.context.span_id, trace_flags=span.context.trace_flags, diff --git a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_events.py b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_events.py index a10d6955e..08ce32ed2 100644 --- a/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_events.py +++ b/aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/llo_handler/test_llo_handler_events.py @@ -636,7 +636,7 @@ def test_emit_llo_attributes_with_session_id(self): # Verify session.id was copied to event attributes self.assertIsNotNone(emitted_event.attributes) self.assertEqual(emitted_event.attributes.get("session.id"), "test-session-123") - # Event class always adds event.name + # event.name is always set in attributes self.assertIn("event.name", emitted_event.attributes) # Verify event body still contains LLO data @@ -666,7 +666,7 @@ def test_emit_llo_attributes_without_session_id(self): # Verify session.id is not in event attributes self.assertIsNotNone(emitted_event.attributes) self.assertNotIn("session.id", emitted_event.attributes) - # Event class always adds event.name + # event.name is always set in attributes self.assertIn("event.name", emitted_event.attributes) def test_emit_llo_attributes_with_session_id_and_other_attributes(self): diff --git a/lambda-layer/src/otel-instrument b/lambda-layer/src/otel-instrument index f6622575d..10eca3aa7 100755 --- a/lambda-layer/src/otel-instrument +++ b/lambda-layer/src/otel-instrument @@ -137,7 +137,7 @@ fi if [ "$(echo "${OTEL_AWS_LAMBDA_FAST_START}" | tr '[:upper:]' '[:lower:]')" != "true" ]; then if [ -z ${OTEL_PYTHON_DISABLED_INSTRUMENTATIONS} ]; then - export OTEL_PYTHON_DISABLED_INSTRUMENTATIONS="aio-pika,aiohttp-client,aiohttp-server,aiopg,asgi,asyncio,asyncpg,boto,boto3,cassandra,celery,confluent_kafka,dbapi,django,elasticsearch,falcon,fastapi,flask,grpc_client,grpc_server,grpc_aio_client,grpc_aio_server,httpx,jinja2,kafka,logging,mysql,mysqlclient,pika,psycopg,psycopg2,pymemcache,pymongo,pymysql,pyramid,redis,remoulade,requests,sklearn,sqlalchemy,sqlite3,starlette,system_metrics,threading,tornado,tortoiseorm,wsgi,openai_agents,aws_openai_agents,aws_crewai,aws_langchain,aws_mcp,aws_llama-index" + export OTEL_PYTHON_DISABLED_INSTRUMENTATIONS="aio-pika,aiohttp-client,aiohttp-server,aiopg,asgi,asyncio,asyncpg,boto,boto3,cassandra,celery,confluent_kafka,dbapi,django,falcon,fastapi,flask,grpc_client,grpc_server,grpc_aio_client,grpc_aio_server,httpx,jinja2,kafka,logging,mysql,mysqlclient,pika,psycopg,psycopg2,pymemcache,pymongo,pymysql,pyramid,redis,remoulade,requests,sklearn,sqlalchemy,sqlite3,starlette,system_metrics,threading,tornado,tortoiseorm,wsgi,openai_agents,aws_openai_agents,aws_crewai,aws_langchain,aws_mcp,aws_llama-index" fi export OTEL_PYTHON_DISABLED_INSTRUMENTATIONS="$OTEL_PYTHON_DISABLED_INSTRUMENTATIONS,aws-lambda"; fi