Skip to content

Commit d7575b8

Browse files
committed
fixing consolidation changes
1 parent c7aeac7 commit d7575b8

File tree

8 files changed

+172
-47
lines changed

8 files changed

+172
-47
lines changed

aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_opentelemetry_configurator.py

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
from amazon.opentelemetry.distro._aws_attribute_keys import AWS_LOCAL_SERVICE, AWS_SERVICE_TYPE
1414
from amazon.opentelemetry.distro._aws_resource_attribute_configurator import get_service_attribute
15-
from amazon.opentelemetry.distro._utils import IS_BOTOCORE_INSTALLED, get_aws_session, is_agent_observability_enabled
15+
from amazon.opentelemetry.distro._utils import get_aws_session, is_agent_observability_enabled
1616
from amazon.opentelemetry.distro.always_record_sampler import AlwaysRecordSampler
1717
from amazon.opentelemetry.distro.attribute_propagating_span_processor_builder import (
1818
AttributePropagatingSpanProcessorBuilder,
@@ -23,8 +23,6 @@
2323
AwsMetricAttributesSpanExporterBuilder,
2424
)
2525
from amazon.opentelemetry.distro.aws_span_metrics_processor_builder import AwsSpanMetricsProcessorBuilder
26-
from amazon.opentelemetry.distro.exporter.otlp.aws.logs.otlp_aws_logs_exporter import OTLPAwsLogExporter
27-
from amazon.opentelemetry.distro.exporter.otlp.aws.traces.otlp_aws_span_exporter import OTLPAwsSpanExporter
2826
from amazon.opentelemetry.distro.otlp_udp_exporter import OTLPUdpSpanExporter
2927
from amazon.opentelemetry.distro.sampler.aws_xray_remote_sampler import AwsXRayRemoteSampler
3028
from amazon.opentelemetry.distro.scope_based_exporter import ScopeBasedPeriodicExportingMetricReader
@@ -210,9 +208,9 @@ def _init_logging(
210208

211209
for _, exporter_class in exporters.items():
212210
exporter_args = {}
213-
log_exporter: LogExporter = _customize_logs_exporter(exporter_class(**exporter_args))
214-
log_processor = _customize_log_record_processor(log_exporter)
215-
provider.add_log_record_processor(log_processor)
211+
_customize_log_record_processor(
212+
logger_provider=provider, log_exporter=_customize_logs_exporter(exporter_class(**exporter_args))
213+
)
216214

217215
event_logger_provider = EventLoggerProvider(logger_provider=provider)
218216
set_event_logger_provider(event_logger_provider)
@@ -299,10 +297,12 @@ def _export_unsampled_span_for_agent_observability(trace_provider: TracerProvide
299297
return
300298

301299
traces_endpoint = os.environ.get(OTEL_EXPORTER_OTLP_TRACES_ENDPOINT)
300+
if traces_endpoint and _is_aws_otlp_endpoint(traces_endpoint):
301+
endpoint = traces_endpoint.lower()
302+
region = endpoint.split(".")[1]
302303

303-
span_exporter = _create_aws_exporter(endpoint=traces_endpoint)
304-
305-
trace_provider.add_span_processor(BatchUnsampledSpanProcessor(span_exporter=span_exporter))
304+
span_exporter = _create_aws_otlp_exporter(endpoint=endpoint, service="xray", region=region)
305+
trace_provider.add_span_processor(BatchUnsampledSpanProcessor(span_exporter=span_exporter))
306306

307307

308308
def _is_defer_to_workers_enabled():
@@ -397,11 +397,13 @@ def _customize_span_exporter(span_exporter: SpanExporter, resource: Resource) ->
397397
traces_endpoint = os.environ.get(AWS_XRAY_DAEMON_ADDRESS_CONFIG, "127.0.0.1:2000")
398398
span_exporter = OTLPUdpSpanExporter(endpoint=traces_endpoint)
399399

400-
if _is_aws_otlp_endpoint(traces_endpoint, "xray"):
400+
if traces_endpoint and _is_aws_otlp_endpoint(traces_endpoint, "xray"):
401401
_logger.info("Detected using AWS OTLP Traces Endpoint.")
402402

403403
if isinstance(span_exporter, OTLPSpanExporter):
404-
return _create_aws_exporter(endpoint=traces_endpoint)
404+
endpoint = traces_endpoint.lower()
405+
region = endpoint.split(".")[1]
406+
return _create_aws_otlp_exporter(endpoint=traces_endpoint, service="xray", region=region)
405407

406408
else:
407409
_logger.warning(
@@ -415,24 +417,34 @@ def _customize_span_exporter(span_exporter: SpanExporter, resource: Resource) ->
415417
return AwsMetricAttributesSpanExporterBuilder(span_exporter, resource).build()
416418

417419

418-
def _customize_log_record_processor(log_exporter: LogExporter):
419-
if isinstance(log_exporter, OTLPAwsLogExporter) and is_agent_observability_enabled():
420-
return AwsCloudWatchOtlpBatchLogRecordProcessor(exporter=log_exporter)
420+
def _customize_log_record_processor(logger_provider: LoggerProvider, log_exporter: Optional[LogExporter]) -> None:
421+
if not log_exporter:
422+
return
421423

422-
return BatchLogRecordProcessor(exporter=log_exporter)
424+
if is_agent_observability_enabled():
425+
from amazon.opentelemetry.distro.exporter.otlp.aws.logs._aws_cw_otlp_batch_log_record_processor import (
426+
AwsCloudWatchOtlpBatchLogRecordProcessor,
427+
)
428+
429+
logger_provider.add_log_record_processor(AwsCloudWatchOtlpBatchLogRecordProcessor(exporter=log_exporter))
430+
else:
431+
logger_provider.add_log_record_processor(BatchLogRecordProcessor(exporter=log_exporter))
423432

424433

425434
def _customize_logs_exporter(log_exporter: LogExporter) -> LogExporter:
426435
logs_endpoint = os.environ.get(OTEL_EXPORTER_OTLP_LOGS_ENDPOINT)
427436

428-
if _is_aws_otlp_endpoint(logs_endpoint, "logs"):
437+
if logs_endpoint and _is_aws_otlp_endpoint(logs_endpoint, "logs"):
438+
429439
_logger.info("Detected using AWS OTLP Logs Endpoint.")
430440

431441
if isinstance(log_exporter, OTLPLogExporter) and _validate_and_fetch_logs_header().is_valid:
442+
endpoint = logs_endpoint.lower()
443+
region = endpoint.split(".")[1]
432444
# Setting default compression mode to Gzip as this is the behavior in upstream's
433445
# collector otlp http exporter:
434446
# https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter/otlphttpexporter
435-
return _create_aws_exporter(endpoint=logs_endpoint)
447+
return _create_aws_otlp_exporter(endpoint=logs_endpoint, service="logs", region=region)
436448

437449
_logger.warning(
438450
"Improper configuration see: please export/set "
@@ -594,11 +606,11 @@ def _is_lambda_environment():
594606
def _is_aws_otlp_endpoint(otlp_endpoint: Optional[str] = None, service: str = "xray") -> bool:
595607
"""Is the given endpoint an AWS OTLP endpoint?"""
596608

597-
pattern = AWS_TRACES_OTLP_ENDPOINT_PATTERN if service == "xray" else AWS_LOGS_OTLP_ENDPOINT_PATTERN
598-
599609
if not otlp_endpoint:
600610
return False
601611

612+
pattern = AWS_TRACES_OTLP_ENDPOINT_PATTERN if service == "xray" else AWS_LOGS_OTLP_ENDPOINT_PATTERN
613+
602614
return bool(re.match(pattern, otlp_endpoint.lower()))
603615

604616

@@ -787,7 +799,7 @@ def create_emf_exporter():
787799
return None
788800

789801

790-
def _create_aws_exporter(endpoint: str):
802+
def _create_aws_otlp_exporter(endpoint: str, service: str, region: str):
791803
"""Create and configure the AWS OTLP exporters."""
792804
try:
793805
session = get_aws_session()
@@ -800,12 +812,7 @@ def _create_aws_exporter(endpoint: str):
800812
from amazon.opentelemetry.distro.exporter.otlp.aws.logs.otlp_aws_logs_exporter import OTLPAwsLogExporter
801813
from amazon.opentelemetry.distro.exporter.otlp.aws.traces.otlp_aws_span_exporter import OTLPAwsSpanExporter
802814

803-
endpoint = endpoint.lower()
804-
split = endpoint.split(".")
805-
service = split[0]
806-
region = split[1]
807-
808-
if "xray" in service:
815+
if service == "xray":
809816
if is_agent_observability_enabled():
810817
# Span exporter needs an instance of logger provider in ai agent
811818
# observability case because we need to split input/output prompts
@@ -818,7 +825,7 @@ def _create_aws_exporter(endpoint: str):
818825

819826
return OTLPAwsSpanExporter(session=session, endpoint=endpoint, aws_region=region)
820827

821-
if "logs" in service:
828+
if service == "logs":
822829
return OTLPAwsLogExporter(session=session, aws_region=region)
823830

824831
# pylint: disable=broad-exception-caught

aws-opentelemetry-distro/src/amazon/opentelemetry/distro/exporter/aws/metrics/_cloudwatch_log_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class CloudWatchLogClient:
9090
def __init__(
9191
self,
9292
log_group_name: str,
93-
session: Session = Session(),
93+
session: Session,
9494
log_stream_name: Optional[str] = None,
9595
aws_region: Optional[str] = None,
9696
**kwargs,

aws-opentelemetry-distro/src/amazon/opentelemetry/distro/exporter/otlp/aws/logs/otlp_aws_logs_exporter.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from time import time
1111
from typing import Dict, Optional, Sequence
1212

13+
from botocore.session import Session
1314
from requests import Response
1415
from requests.exceptions import ConnectionError as RequestsConnectionError
1516
from requests.structures import CaseInsensitiveDict
@@ -39,7 +40,7 @@ class OTLPAwsLogExporter(OTLPLogExporter):
3940
def __init__(
4041
self,
4142
aws_region: str,
42-
session: Session = Session(),
43+
session: Session,
4344
log_group: Optional[str] = None,
4445
log_stream: Optional[str] = None,
4546
endpoint: Optional[str] = None,

aws-opentelemetry-distro/src/amazon/opentelemetry/distro/exporter/otlp/aws/traces/otlp_aws_span_exporter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class OTLPAwsSpanExporter(OTLPSpanExporter):
3131
def __init__(
3232
self,
3333
aws_region: str,
34-
session: Session = Session(),
34+
session: Session,
3535
endpoint: Optional[str] = None,
3636
certificate_file: Optional[str] = None,
3737
client_key_file: Optional[str] = None,

aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/exporter/otlp/aws/logs/test_otlp_aws_logs_exporter.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import requests
88
from requests.structures import CaseInsensitiveDict
99

10+
from amazon.opentelemetry.distro._utils import get_aws_session
1011
from amazon.opentelemetry.distro.exporter.otlp.aws.logs.otlp_aws_logs_exporter import _MAX_RETRYS, OTLPAwsLogExporter
1112
from opentelemetry._logs.severity import SeverityNumber
1213
from opentelemetry.sdk._logs import LogData, LogRecord
@@ -36,7 +37,7 @@ class TestOTLPAwsLogsExporter(TestCase):
3637

3738
def setUp(self):
3839
self.logs = self.generate_test_log_data()
39-
self.exporter = OTLPAwsLogExporter(aws_region="us-east-1", endpoint=self._ENDPOINT)
40+
self.exporter = OTLPAwsLogExporter(session=get_aws_session(), aws_region="us-east-1", endpoint=self._ENDPOINT)
4041

4142
@patch("requests.Session.post", return_value=good_response)
4243
def test_export_success(self, mock_request):

aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/exporter/otlp/aws/traces/test_otlp_aws_span_exporter.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from unittest import TestCase
55
from unittest.mock import MagicMock, patch
66

7+
from amazon.opentelemetry.distro._utils import get_aws_session
78
from amazon.opentelemetry.distro.exporter.otlp.aws.traces.otlp_aws_span_exporter import OTLPAwsSpanExporter
89
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
910
from opentelemetry.sdk._logs import LoggerProvider
@@ -17,7 +18,9 @@ def test_init_with_logger_provider(self):
1718
mock_logger_provider = MagicMock(spec=LoggerProvider)
1819
endpoint = "https://xray.us-east-1.amazonaws.com/v1/traces"
1920

20-
exporter = OTLPAwsSpanExporter(aws_region="us-east-1", endpoint=endpoint, logger_provider=mock_logger_provider)
21+
exporter = OTLPAwsSpanExporter(
22+
session=get_aws_session(), aws_region="us-east-1", endpoint=endpoint, logger_provider=mock_logger_provider
23+
)
2124

2225
self.assertEqual(exporter._logger_provider, mock_logger_provider)
2326
self.assertEqual(exporter._aws_region, "us-east-1")
@@ -26,7 +29,7 @@ def test_init_without_logger_provider(self):
2629
# Test initialization without logger_provider (default behavior)
2730
endpoint = "https://xray.us-west-2.amazonaws.com/v1/traces"
2831

29-
exporter = OTLPAwsSpanExporter(aws_region="us-west-2", endpoint=endpoint)
32+
exporter = OTLPAwsSpanExporter(session=get_aws_session(), aws_region="us-west-2", endpoint=endpoint)
3033

3134
self.assertIsNone(exporter._logger_provider)
3235
self.assertEqual(exporter._aws_region, "us-west-2")
@@ -38,7 +41,7 @@ def test_ensure_llo_handler_when_disabled(self, mock_is_enabled):
3841
mock_is_enabled.return_value = False
3942
endpoint = "https://xray.us-east-1.amazonaws.com/v1/traces"
4043

41-
exporter = OTLPAwsSpanExporter(aws_region="us-east-1", endpoint=endpoint)
44+
exporter = OTLPAwsSpanExporter(session=get_aws_session(), aws_region="us-east-1", endpoint=endpoint)
4245
result = exporter._ensure_llo_handler()
4346

4447
self.assertFalse(result)
@@ -59,7 +62,7 @@ def test_ensure_llo_handler_lazy_initialization(
5962
mock_llo_handler_class.return_value = mock_llo_handler
6063

6164
endpoint = "https://xray.us-east-1.amazonaws.com/v1/traces"
62-
exporter = OTLPAwsSpanExporter(aws_region="us-east-1", endpoint=endpoint)
65+
exporter = OTLPAwsSpanExporter(session=get_aws_session(), aws_region="us-east-1", endpoint=endpoint)
6366

6467
# First call should initialize
6568
result = exporter._ensure_llo_handler()
@@ -87,7 +90,9 @@ def test_ensure_llo_handler_with_existing_logger_provider(self, mock_is_enabled,
8790
mock_logger_provider = MagicMock(spec=LoggerProvider)
8891

8992
endpoint = "https://xray.us-east-1.amazonaws.com/v1/traces"
90-
exporter = OTLPAwsSpanExporter(aws_region="us-east-1", endpoint=endpoint, logger_provider=mock_logger_provider)
93+
exporter = OTLPAwsSpanExporter(
94+
session=get_aws_session(), aws_region="us-east-1", endpoint=endpoint, logger_provider=mock_logger_provider
95+
)
9196

9297
with patch(
9398
"amazon.opentelemetry.distro.exporter.otlp.aws.traces.otlp_aws_span_exporter.LLOHandler"
@@ -110,7 +115,7 @@ def test_ensure_llo_handler_get_logger_provider_fails(self, mock_is_enabled, moc
110115
mock_get_logger_provider.side_effect = Exception("Failed to get logger provider")
111116

112117
endpoint = "https://xray.us-east-1.amazonaws.com/v1/traces"
113-
exporter = OTLPAwsSpanExporter(aws_region="us-east-1", endpoint=endpoint)
118+
exporter = OTLPAwsSpanExporter(session=get_aws_session(), aws_region="us-east-1", endpoint=endpoint)
114119

115120
result = exporter._ensure_llo_handler()
116121

@@ -123,7 +128,7 @@ def test_export_with_llo_disabled(self, mock_is_enabled):
123128
mock_is_enabled.return_value = False
124129
endpoint = "https://xray.us-east-1.amazonaws.com/v1/traces"
125130

126-
exporter = OTLPAwsSpanExporter(aws_region="us-east-1", endpoint=endpoint)
131+
exporter = OTLPAwsSpanExporter(session=get_aws_session(), aws_region="us-east-1", endpoint=endpoint)
127132

128133
# Mock the parent class export method
129134
with patch.object(OTLPSpanExporter, "export") as mock_parent_export:
@@ -149,7 +154,7 @@ def test_export_with_llo_enabled(self, mock_llo_handler_class, mock_get_logger_p
149154
mock_llo_handler_class.return_value = mock_llo_handler
150155

151156
endpoint = "https://xray.us-east-1.amazonaws.com/v1/traces"
152-
exporter = OTLPAwsSpanExporter(aws_region="us-east-1", endpoint=endpoint)
157+
exporter = OTLPAwsSpanExporter(session=get_aws_session(), aws_region="us-east-1", endpoint=endpoint)
153158

154159
# Mock spans and processed spans
155160
original_spans = [MagicMock(spec=ReadableSpan), MagicMock(spec=ReadableSpan)]
@@ -182,7 +187,7 @@ def test_export_with_llo_processing_failure(
182187
mock_llo_handler.process_spans.side_effect = Exception("LLO processing failed")
183188

184189
endpoint = "https://xray.us-east-1.amazonaws.com/v1/traces"
185-
exporter = OTLPAwsSpanExporter(aws_region="us-east-1", endpoint=endpoint)
190+
exporter = OTLPAwsSpanExporter(session=get_aws_session(), aws_region="us-east-1", endpoint=endpoint)
186191

187192
spans = [MagicMock(spec=ReadableSpan), MagicMock(spec=ReadableSpan)]
188193

0 commit comments

Comments
 (0)