12
12
13
13
from amazon .opentelemetry .distro ._aws_attribute_keys import AWS_LOCAL_SERVICE , AWS_SERVICE_TYPE
14
14
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
16
16
from amazon .opentelemetry .distro .always_record_sampler import AlwaysRecordSampler
17
17
from amazon .opentelemetry .distro .attribute_propagating_span_processor_builder import (
18
18
AttributePropagatingSpanProcessorBuilder ,
23
23
AwsMetricAttributesSpanExporterBuilder ,
24
24
)
25
25
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
28
26
from amazon .opentelemetry .distro .otlp_udp_exporter import OTLPUdpSpanExporter
29
27
from amazon .opentelemetry .distro .sampler .aws_xray_remote_sampler import AwsXRayRemoteSampler
30
28
from amazon .opentelemetry .distro .scope_based_exporter import ScopeBasedPeriodicExportingMetricReader
@@ -210,9 +208,9 @@ def _init_logging(
210
208
211
209
for _ , exporter_class in exporters .items ():
212
210
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
+ )
216
214
217
215
event_logger_provider = EventLoggerProvider (logger_provider = provider )
218
216
set_event_logger_provider (event_logger_provider )
@@ -299,10 +297,12 @@ def _export_unsampled_span_for_agent_observability(trace_provider: TracerProvide
299
297
return
300
298
301
299
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 ]
302
303
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 ))
306
306
307
307
308
308
def _is_defer_to_workers_enabled ():
@@ -397,11 +397,13 @@ def _customize_span_exporter(span_exporter: SpanExporter, resource: Resource) ->
397
397
traces_endpoint = os .environ .get (AWS_XRAY_DAEMON_ADDRESS_CONFIG , "127.0.0.1:2000" )
398
398
span_exporter = OTLPUdpSpanExporter (endpoint = traces_endpoint )
399
399
400
- if _is_aws_otlp_endpoint (traces_endpoint , "xray" ):
400
+ if traces_endpoint and _is_aws_otlp_endpoint (traces_endpoint , "xray" ):
401
401
_logger .info ("Detected using AWS OTLP Traces Endpoint." )
402
402
403
403
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 )
405
407
406
408
else :
407
409
_logger .warning (
@@ -415,24 +417,34 @@ def _customize_span_exporter(span_exporter: SpanExporter, resource: Resource) ->
415
417
return AwsMetricAttributesSpanExporterBuilder (span_exporter , resource ).build ()
416
418
417
419
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
421
423
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 ))
423
432
424
433
425
434
def _customize_logs_exporter (log_exporter : LogExporter ) -> LogExporter :
426
435
logs_endpoint = os .environ .get (OTEL_EXPORTER_OTLP_LOGS_ENDPOINT )
427
436
428
- if _is_aws_otlp_endpoint (logs_endpoint , "logs" ):
437
+ if logs_endpoint and _is_aws_otlp_endpoint (logs_endpoint , "logs" ):
438
+
429
439
_logger .info ("Detected using AWS OTLP Logs Endpoint." )
430
440
431
441
if isinstance (log_exporter , OTLPLogExporter ) and _validate_and_fetch_logs_header ().is_valid :
442
+ endpoint = logs_endpoint .lower ()
443
+ region = endpoint .split ("." )[1 ]
432
444
# Setting default compression mode to Gzip as this is the behavior in upstream's
433
445
# collector otlp http exporter:
434
446
# 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 )
436
448
437
449
_logger .warning (
438
450
"Improper configuration see: please export/set "
@@ -594,11 +606,11 @@ def _is_lambda_environment():
594
606
def _is_aws_otlp_endpoint (otlp_endpoint : Optional [str ] = None , service : str = "xray" ) -> bool :
595
607
"""Is the given endpoint an AWS OTLP endpoint?"""
596
608
597
- pattern = AWS_TRACES_OTLP_ENDPOINT_PATTERN if service == "xray" else AWS_LOGS_OTLP_ENDPOINT_PATTERN
598
-
599
609
if not otlp_endpoint :
600
610
return False
601
611
612
+ pattern = AWS_TRACES_OTLP_ENDPOINT_PATTERN if service == "xray" else AWS_LOGS_OTLP_ENDPOINT_PATTERN
613
+
602
614
return bool (re .match (pattern , otlp_endpoint .lower ()))
603
615
604
616
@@ -787,7 +799,7 @@ def create_emf_exporter():
787
799
return None
788
800
789
801
790
- def _create_aws_exporter (endpoint : str ):
802
+ def _create_aws_otlp_exporter (endpoint : str , service : str , region : str ):
791
803
"""Create and configure the AWS OTLP exporters."""
792
804
try :
793
805
session = get_aws_session ()
@@ -800,12 +812,7 @@ def _create_aws_exporter(endpoint: str):
800
812
from amazon .opentelemetry .distro .exporter .otlp .aws .logs .otlp_aws_logs_exporter import OTLPAwsLogExporter
801
813
from amazon .opentelemetry .distro .exporter .otlp .aws .traces .otlp_aws_span_exporter import OTLPAwsSpanExporter
802
814
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" :
809
816
if is_agent_observability_enabled ():
810
817
# Span exporter needs an instance of logger provider in ai agent
811
818
# observability case because we need to split input/output prompts
@@ -818,7 +825,7 @@ def _create_aws_exporter(endpoint: str):
818
825
819
826
return OTLPAwsSpanExporter (session = session , endpoint = endpoint , aws_region = region )
820
827
821
- if "logs" in service :
828
+ if service == "logs" :
822
829
return OTLPAwsLogExporter (session = session , aws_region = region )
823
830
824
831
# pylint: disable=broad-exception-caught
0 commit comments