diff --git a/CHANGELOG.md b/CHANGELOG.md index 061690a00..2c8581ae5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ If your change does not need a CHANGELOG entry, add the "skip changelog" label t - fix(mcp-instrumentation): always inject W3C trace context into outbound HTTP request headers so MCP servers that read context only from HTTP (API Gateways, service meshes, non-Python MCP servers) can join the caller's trace, even with `OTEL_MCP_SUPPRESS_HTTP_INSTRUMENTATION` enabled ([#827](https://github.com/aws-observability/aws-otel-python-instrumentation/pull/827)) +- 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)) - 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 35ad8b3b9..eb1ff4791 100644 --- a/aws-opentelemetry-distro/pyproject.toml +++ b/aws-opentelemetry-distro/pyproject.toml @@ -26,63 +26,62 @@ 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.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.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-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-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-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.65b0", + "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/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..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,9 +17,8 @@ import os import threading -from opentelemetry._events import Event +from opentelemetry._logs import LogRecord, SeverityNumber 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,10 +161,10 @@ 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 + severity_number=SeverityNumber.INFO, body=body if body else None, attributes=attributes, trace_id=trace_id, @@ -176,7 +172,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 +184,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..7db657fa2 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, SeverityNumber 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,23 +535,24 @@ 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 = {} + 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"] - event = Event( - name=span.instrumentation_scope.name, + 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, + attributes=event_attributes, trace_id=span.context.trace_id, span_id=span.context.span_id, 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/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/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..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 @@ -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,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): @@ -725,7 +725,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 diff --git a/contract-tests/images/mock-collector/pyproject.toml b/contract-tests/images/mock-collector/pyproject.toml index 937fb0317..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.42.1", - "opentelemetry-sdk == 1.42.1", + "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 a78fe344e..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.42.1 -opentelemetry-sdk==1.42.1 +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 ca8881556..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.42.1", - "opentelemetry-sdk == 1.42.1", + "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/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 diff --git a/lambda-layer/src/tests/requirements.txt b/lambda-layer/src/tests/requirements.txt index 075a8b001..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.63b1 -opentelemetry-instrumentation-aws-lambda==0.63b1 +opentelemetry-test-utils==0.65b0 +opentelemetry-instrumentation-aws-lambda==0.65b0 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", diff --git a/tox.ini b/tox.ini index a290daea7..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.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.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.