1- import type { Context , Span , SpanOptions , Tracer , TracerProvider } from '@opentelemetry/api' ;
2- import { ProxyTracerProvider , trace } from '@opentelemetry/api' ;
1+ import type { Context , ProxyTracerProvider , Span , SpanOptions , Tracer , TracerProvider } from '@opentelemetry/api' ;
2+ import { trace } from '@opentelemetry/api' ;
33import { startInactiveSpan , startSpanManual } from '@sentry/core' ;
44
55/**
66 * Set up a mock OTEL tracer to allow inter-op with OpenTelemetry emitted spans.
77 * This is not perfect but handles easy/common use cases.
88 */
99export function setupOpenTelemetryTracer ( ) : void {
10- const current = trace . getTracerProvider ( ) ;
11- const delegate = current instanceof ProxyTracerProvider ? current . getDelegate ( ) : current ;
12- trace . setGlobalTracerProvider ( new SentryCloudflareTraceProvider ( delegate ) ) ;
10+ const result = trace . setGlobalTracerProvider ( new SentryCloudflareTraceProvider ( ) ) ;
11+ if ( result ) {
12+ return ;
13+ }
14+ const current = trace . getTracerProvider ( ) as ProxyTracerProvider ;
15+ current . setDelegate ( new SentryCloudflareTraceProvider ( current . getDelegate ( ) ) ) ;
1316}
1417
1518class SentryCloudflareTraceProvider implements TracerProvider {
1619 private readonly _tracers : Map < string , Tracer > = new Map ( ) ;
1720
18- public constructor ( private readonly _provider : TracerProvider ) { }
21+ public constructor ( private readonly _provider ? : TracerProvider ) { }
1922
2023 public getTracer ( name : string , version ?: string , options ?: { schemaUrl ?: string } ) : Tracer {
2124 const key = `${ name } @${ version || '' } :${ options ?. schemaUrl || '' } ` ;
2225 if ( ! this . _tracers . has ( key ) ) {
23- const tracer = this . _provider . getTracer ( key , version , options ) ;
26+ const tracer = this . _provider ? .getTracer ?. ( key , version , options ) ;
2427 this . _tracers . set ( key , new SentryCloudflareTracer ( tracer ) ) ;
2528 }
2629
@@ -30,9 +33,9 @@ class SentryCloudflareTraceProvider implements TracerProvider {
3033}
3134
3235class SentryCloudflareTracer implements Tracer {
33- public constructor ( private readonly _tracer : Tracer ) { }
36+ public constructor ( private readonly _tracer ? : Tracer ) { }
3437 public startSpan ( name : string , options ?: SpanOptions ) : Span {
35- const topSpan = this . _tracer . startSpan ( name , options ) ;
38+ const topSpan = this . _tracer ? .startSpan ?. ( name , options ) ;
3639 const sentrySpan = startInactiveSpan ( {
3740 name,
3841 ...options ,
@@ -41,7 +44,18 @@ class SentryCloudflareTracer implements Tracer {
4144 'sentry.cloudflare_tracer' : true ,
4245 } ,
4346 } ) ;
47+ if ( ! topSpan ) {
48+ return sentrySpan ;
49+ }
4450 return new Proxy ( sentrySpan , {
51+ set : ( target , p , newValue , receiver ) => {
52+ try {
53+ Reflect . set ( topSpan , p , newValue , receiver ) ;
54+ } catch {
55+ //
56+ }
57+ return Reflect . set ( target , p , newValue ) ;
58+ } ,
4559 get : ( target , p ) => {
4660 const propertyValue = Reflect . get ( target , p ) ;
4761 if ( typeof propertyValue !== 'function' ) {
@@ -55,7 +69,7 @@ class SentryCloudflareTracer implements Tracer {
5569 apply : ( target , thisArg , argArray ) => {
5670 try {
5771 Reflect . apply ( proxyTo , topSpan , argArray ) ;
58- } catch ( e ) {
72+ } catch {
5973 //
6074 }
6175 return Reflect . apply ( target , thisArg , argArray ) ;
0 commit comments