@@ -91,6 +91,41 @@ export async function startTelemetryServer(params: {
9191 }
9292 } ) ;
9393
94+ api . post (
95+ '/api/otlp/:parentTraceId/:parentSpanId' ,
96+ async ( request , response ) => {
97+ try {
98+ const { parentTraceId, parentSpanId } = request . params ;
99+
100+ if ( ! request . body . resourceSpans ?. length ) {
101+ // Acknowledge and ignore empty payloads.
102+ response . status ( 200 ) . json ( { } ) ;
103+ return ;
104+ }
105+ const traces = traceDataFromOtlp ( request . body ) ;
106+ for ( const traceData of traces ) {
107+ traceData . traceId = parentTraceId ;
108+ for ( const span of Object . values ( traceData . spans ) ) {
109+ span . attributes [ 'genkit:otlp-traceId' ] = span . traceId ;
110+ span . traceId = parentTraceId ;
111+ if ( ! span . parentSpanId ) {
112+ span . parentSpanId = parentSpanId ;
113+ }
114+ }
115+ await params . traceStore . save ( parentTraceId , traceData ) ;
116+ }
117+ response . status ( 200 ) . json ( { } ) ;
118+ } catch ( err ) {
119+ logger . error ( `Error processing OTLP payload: ${ err } ` ) ;
120+ response . status ( 500 ) . json ( {
121+ code : 13 , // INTERNAL
122+ message :
123+ 'An internal error occurred while processing the OTLP payload.' ,
124+ } ) ;
125+ }
126+ }
127+ ) ;
128+
94129 api . post ( '/api/otlp' , async ( request , response ) => {
95130 try {
96131 if ( ! request . body . resourceSpans ?. length ) {
@@ -99,8 +134,7 @@ export async function startTelemetryServer(params: {
99134 return ;
100135 }
101136 const traces = traceDataFromOtlp ( request . body ) ;
102- for ( const trace of traces ) {
103- const traceData = TraceDataSchema . parse ( trace ) ;
137+ for ( const traceData of traces ) {
104138 await params . traceStore . save ( traceData . traceId , traceData ) ;
105139 }
106140 response . status ( 200 ) . json ( { } ) ;
0 commit comments