11import { diag , type DiagLogger } from '@opentelemetry/api'
22import { BindOnceFuture , ExportResult , ExportResultCode } from '@opentelemetry/core'
3- import { JsonTraceSerializer } from '@opentelemetry/otlp-transformer'
43import type { SpanExporter , ReadableSpan } from '@opentelemetry/sdk-trace-node'
54import { TRACE_PREFIX } from '../constants.ts'
65
76export class NetlifySpanExporter implements SpanExporter {
87 #shutdownOnce: BindOnceFuture < void >
98 #logger: DiagLogger
10- static #decoder = new TextDecoder ( )
119
1210 constructor ( ) {
1311 this . #shutdownOnce = new BindOnceFuture ( this . #shutdown, this )
@@ -27,7 +25,7 @@ export class NetlifySpanExporter implements SpanExporter {
2725 return
2826 }
2927
30- console . log ( TRACE_PREFIX , NetlifySpanExporter . #decoder . decode ( JsonTraceSerializer . serializeRequest ( spans ) ) )
28+ console . log ( TRACE_PREFIX , spanToJSONString ( spans ) )
3129 resultCallback ( { code : ExportResultCode . SUCCESS } )
3230 }
3331
@@ -46,3 +44,57 @@ export class NetlifySpanExporter implements SpanExporter {
4644 return Promise . resolve ( )
4745 }
4846}
47+
48+ // Replaces JsonTraceSerializer.serializeRequest(spans)
49+ const spanToJSONString = ( spans : ReadableSpan [ ] ) : string => {
50+ const serializedSpan = {
51+ resourceSpans : spans . map ( ( span ) => {
52+ const spanContext = span . spanContext ( )
53+
54+ return {
55+ resource : {
56+ attributes : Object . entries ( span . resource . attributes ) . map ( ( [ key , value ] ) => {
57+ return {
58+ key : key ,
59+ value : {
60+ stringValue : value ?. toString ( ) ?? '' ,
61+ } ,
62+ }
63+ } ) ,
64+ droppedAttributesCount : span . droppedAttributesCount ,
65+ } ,
66+ scopeSpans : [
67+ {
68+ scope : {
69+ name : span . instrumentationLibrary . name ,
70+ version : span . instrumentationLibrary . version ,
71+ } ,
72+ spans : [
73+ {
74+ traceId : spanContext . traceId ,
75+ spanId : spanContext . spanId ,
76+ name : span . name ,
77+ kind : span . kind ,
78+ startTimeUnixNano : span . startTime . join ( '' ) ,
79+ endTimeUnixNano : span . endTime . join ( '' ) ,
80+ droppedAttributesCount : span . droppedAttributesCount ,
81+ droppedEventsCount : span . droppedEventsCount ,
82+ droppedLinksCount : span . droppedLinksCount ,
83+ status : {
84+ code : span . status . code ,
85+ message : span . status . message ,
86+ } ,
87+ // TODO
88+ // "attributes": span.attributes,
89+ // "events": span.events,
90+ // "links": span.links,
91+ } ,
92+ ] ,
93+ } ,
94+ ] ,
95+ }
96+ } ) ,
97+ }
98+
99+ return JSON . stringify ( serializedSpan )
100+ }
0 commit comments