@@ -5,6 +5,12 @@ import { CompressionAlgorithm, OTLPExporterNodeConfigBase } from '@opentelemetry
55import { IExportTraceServiceResponse , ProtobufTraceSerializer } from '@opentelemetry/otlp-transformer' ;
66import { ReadableSpan , SpanExporter } from '@opentelemetry/sdk-trace-base' ;
77import { OTLPAwsBaseExporter } from '../common/otlp-aws-base-exporter' ;
8+ import { LLOHandler } from '../../../../llo-handler' ;
9+ import { LoggerProvider as APILoggerProvider , logs } from '@opentelemetry/api-logs' ;
10+ import { ExportResult } from '@opentelemetry/core' ;
11+ import { isAgentObservabilityEnabled } from '../../../../utils' ;
12+ import { diag } from '@opentelemetry/api' ;
13+ import { LoggerProvider } from '@opentelemetry/sdk-logs' ;
814
915/**
1016 * This exporter extends the functionality of the OTLPProtoTraceExporter to allow spans to be exported
@@ -21,13 +27,52 @@ export class OTLPAwsSpanExporter
2127 extends OTLPAwsBaseExporter < ReadableSpan [ ] , IExportTraceServiceResponse >
2228 implements SpanExporter
2329{
24- constructor ( endpoint : string , config ?: OTLPExporterNodeConfigBase ) {
30+ private loggerProvider : APILoggerProvider | undefined ;
31+ private lloHandler : LLOHandler | undefined ;
32+
33+ constructor ( endpoint : string , config ?: OTLPExporterNodeConfigBase , loggerProvider ?: APILoggerProvider ) {
2534 const modifiedConfig : OTLPExporterNodeConfigBase = {
2635 ...config ,
2736 url : endpoint ,
2837 compression : CompressionAlgorithm . NONE ,
2938 } ;
3039
3140 super ( endpoint , 'xray' , new OTLPProtoTraceExporter ( modifiedConfig ) , ProtobufTraceSerializer , config ?. compression ) ;
41+
42+ this . lloHandler = undefined ;
43+ this . loggerProvider = loggerProvider ;
44+ }
45+
46+ // Lazily initialize LLO handler when needed to avoid initialization order issues
47+ private ensureLloHandler ( ) : boolean {
48+ if ( ! this . lloHandler && isAgentObservabilityEnabled ( ) ) {
49+ // If loggerProvider wasn't provided, try to get the current one
50+ if ( ! this . loggerProvider ) {
51+ try {
52+ this . loggerProvider = logs . getLoggerProvider ( ) ;
53+ } catch ( e : unknown ) {
54+ diag . debug ( 'Failed to get logger provider' , e ) ;
55+ return false ;
56+ }
57+ }
58+
59+ if ( this . loggerProvider instanceof LoggerProvider ) {
60+ this . lloHandler = new LLOHandler ( this . loggerProvider ) ;
61+ return true ;
62+ }
63+ }
64+
65+ return ! ! this . lloHandler ;
66+ }
67+
68+ public override async export ( items : ReadableSpan [ ] , resultCallback : ( result : ExportResult ) => void ) : Promise < void > {
69+ let itemsToSerialize : ReadableSpan [ ] = items ;
70+ if ( isAgentObservabilityEnabled ( ) && this . ensureLloHandler ( ) && this . lloHandler ) {
71+ // items to serialize are now the lloProcessedSpans
72+ itemsToSerialize = this . lloHandler . processSpans ( items ) ;
73+ itemsToSerialize = this . lloHandler . processSpans ( items ) ;
74+ }
75+
76+ return super . export ( itemsToSerialize , resultCallback ) ;
3277 }
3378}
0 commit comments