@multiplayer-app/otlp-core
Version:
Multiplayer otlp core
55 lines (50 loc) • 1.5 kB
text/typescript
import { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base'
/**
* Trace Exporters for Web
*/
export class MultiplayerPostMessageExporter implements SpanExporter {
private readonly targetWindow: Window
private readonly targetOrigin: string
private readonly type: string
constructor({
targetWindow = window,
targetOrigin = '*',
type = 'MULTIPLAYER_SPANS',
}: { targetWindow?: Window; targetOrigin?: string; type?: string } = {}) {
this.targetWindow = targetWindow
this.targetOrigin = targetOrigin
this.type = type
}
export(spans: ReadableSpan[], resultCallback: (result: { code: number }) => void): void {
try {
this.targetWindow.postMessage(
{
type: this.type,
payload: spans.map(span => this._serializeSpan(span)),
},
this.targetOrigin,
)
resultCallback({ code: 0 })
} catch (e) {
console.error('[PostMessageExporter] export failed:', e)
resultCallback({ code: 1 })
}
}
shutdown(): Promise<void> {
return Promise.resolve()
}
private _serializeSpan(span: ReadableSpan): any {
return {
traceId: span.spanContext().traceId,
spanId: span.spanContext().spanId,
parentSpanId: span.parentSpanId,
name: span.name,
startTime: span.startTime,
endTime: span.endTime,
attributes: span.attributes,
events: span.events,
status: span.status,
resource: span.resource.attributes,
}
}
}