2828from amazon .opentelemetry .distro .scope_based_exporter import ScopeBasedPeriodicExportingMetricReader
2929from amazon .opentelemetry .distro .scope_based_filtering_view import ScopeBasedRetainingView
3030from opentelemetry ._logs import set_logger_provider
31+ from opentelemetry .exporter .otlp .proto .http ._log_exporter import OTLPLogExporter
3132from opentelemetry .exporter .otlp .proto .http .metric_exporter import OTLPMetricExporter as OTLPHttpOTLPMetricExporter
3233from opentelemetry .exporter .otlp .proto .http .trace_exporter import OTLPSpanExporter
3334from opentelemetry .metrics import set_meter_provider
8990OTEL_EXPORTER_OTLP_TRACES_ENDPOINT = "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"
9091OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = "OTEL_EXPORTER_OTLP_LOGS_ENDPOINT"
9192
92- XRAY_OTLP_ENDPOINT_PATTERN = r"https://xray\.([a-z0-9-]+)\.amazonaws\.com/v1/traces$"
93+ AWS_TRACES_OTLP_ENDPOINT_PATTERN = r"https://xray\.([a-z0-9-]+)\.amazonaws\.com/v1/traces$"
94+ AWS_LOGS_OTLP_ENDPOINT_PATTERN = r"https://logs\.([a-z0-9-]+)\.amazonaws\.com/v1/logs$"
95+
9396# UDP package size is not larger than 64KB
9497LAMBDA_SPAN_EXPORT_BATCH_SIZE = 10
9598
@@ -174,7 +177,7 @@ def _init_logging(
174177 set_logger_provider (provider )
175178
176179 for _ , exporter_class in exporters .items ():
177- exporter_args = {}
180+ exporter_args : Dict [ str , any ] = {}
178181 log_exporter = _customize_logs_exporter (exporter_class (** exporter_args ), resource )
179182 provider .add_log_record_processor (BatchLogRecordProcessor (exporter = log_exporter ))
180183
@@ -200,7 +203,7 @@ def _init_tracing(
200203 for _ , exporter_class in exporters .items ():
201204 exporter_args : Dict [str , any ] = {}
202205 span_exporter : SpanExporter = exporter_class (** exporter_args )
203- span_exporter = _customize_exporter (span_exporter , resource )
206+ span_exporter = _customize_span_exporter (span_exporter , resource )
204207 trace_provider .add_span_processor (
205208 BatchSpanProcessor (span_exporter = span_exporter , max_export_batch_size = _span_export_batch_size ())
206209 )
@@ -335,15 +338,14 @@ def _customize_sampler(sampler: Sampler) -> Sampler:
335338 return AlwaysRecordSampler (sampler )
336339
337340
338- def _customize_exporter (span_exporter : SpanExporter , resource : Resource ) -> SpanExporter :
341+ def _customize_span_exporter (span_exporter : SpanExporter , resource : Resource ) -> SpanExporter :
339342 if _is_lambda_environment ():
340343 # Override OTLP http default endpoint to UDP
341344 if isinstance (span_exporter , OTLPSpanExporter ) and os .getenv (OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ) is None :
342345 traces_endpoint = os .environ .get (AWS_XRAY_DAEMON_ADDRESS_CONFIG , "127.0.0.1:2000" )
343346 span_exporter = OTLPUdpSpanExporter (endpoint = traces_endpoint )
344347
345- if is_xray_otlp_endpoint (os .environ .get (OTEL_EXPORTER_OTLP_TRACES_ENDPOINT )):
346- # TODO: Change this url once doc writer has added a section for using SigV4 without collector
348+ if is_aws_otlp_endpoint (os .environ .get (OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ), "xray" ):
347349 _logger .info ("Detected using AWS OTLP XRay Endpoint." )
348350
349351 if isinstance (span_exporter , OTLPSpanExporter ):
@@ -362,7 +364,13 @@ def _customize_exporter(span_exporter: SpanExporter, resource: Resource) -> Span
362364
363365
364366def _customize_logs_exporter (log_exporter : LogExporter , resource : Resource ) -> LogExporter :
365- return OTLPAwsLogExporter (endpoint = os .getenv (OTEL_EXPORTER_OTLP_LOGS_ENDPOINT ))
367+ if is_aws_otlp_endpoint (os .environ .get (OTEL_EXPORTER_OTLP_LOGS_ENDPOINT ), "logs" ):
368+ _logger .info ("Detected using AWS OTLP Logs Endpoint." )
369+
370+ if isinstance (log_exporter , OTLPLogExporter ):
371+ return OTLPAwsLogExporter (endpoint = os .getenv (OTEL_EXPORTER_OTLP_LOGS_ENDPOINT ))
372+
373+ return log_exporter
366374
367375
368376def _customize_span_processors (provider : TracerProvider , resource : Resource ) -> None :
@@ -485,12 +493,15 @@ def _is_lambda_environment():
485493 return AWS_LAMBDA_FUNCTION_NAME_CONFIG in os .environ
486494
487495
488- def is_xray_otlp_endpoint (otlp_endpoint : str = None ) -> bool :
489- """Is the given endpoint the XRay OTLP endpoint?"""
496+ def is_aws_otlp_endpoint (otlp_endpoint : str = None , service : str = "xray" ) -> bool :
497+ """Is the given endpoint an AWS OTLP endpoint?"""
498+
499+ pattern = AWS_TRACES_OTLP_ENDPOINT_PATTERN if service == "xray" else AWS_LOGS_OTLP_ENDPOINT_PATTERN
500+
490501 if not otlp_endpoint :
491502 return False
492503
493- return bool (re .match (XRAY_OTLP_ENDPOINT_PATTERN , otlp_endpoint .lower ()))
504+ return bool (re .match (pattern , otlp_endpoint .lower ()))
494505
495506
496507def _get_metric_export_interval ():
0 commit comments