@@ -7,6 +7,7 @@ import io.opentelemetry.api.trace.TraceState
77import io.opentelemetry.context.Context
88import io.opentelemetry.context.propagation.TextMapGetter
99import io.opentelemetry.context.propagation.TextMapSetter
10+ import io.opentelemetry.sdk.trace.SdkTracerProvider
1011import io.sentry.Baggage
1112import io.sentry.Sentry
1213import kotlin.test.AfterTest
@@ -171,6 +172,97 @@ class OpenTelemetryOtlpPropagatorTest {
171172 )
172173 }
173174
175+ @Test
176+ fun `injects headers if URL in span attributes matches tracePropagationTargets` () {
177+ Sentry .init { options ->
178+ options.dsn = " https://key@sentry.io/proj"
179+ options.setTracePropagationTargets(listOf (" sentry.io" ))
180+ }
181+ val propagator = OpenTelemetryOtlpPropagator ()
182+ val carrier = mutableMapOf<String , String >()
183+ val tracerProvider = SdkTracerProvider .builder().build()
184+ val otelSpan =
185+ tracerProvider
186+ .get(" test" )
187+ .spanBuilder(" test" )
188+ .setAttribute(" url.full" , " https://sentry.io/api/0/" )
189+ .startSpan()
190+ val baggage =
191+ Baggage .fromHeader(
192+ " sentry-environment=production,sentry-public_key=502f25099c204a2fbf4cb16edc5975d1,sentry-sample_rand=0.456789,sentry-sample_rate=0.5,sentry-sampled=true,sentry-trace_id=df71f5972f754b4c85af13ff5c07017d"
193+ )
194+
195+ try {
196+ val context =
197+ Context .root().with (otelSpan).with (OpenTelemetryOtlpPropagator .SENTRY_BAGGAGE_KEY , baggage)
198+
199+ propagator.inject(context, carrier, MapSetter ())
200+ } finally {
201+ otelSpan.end()
202+ tracerProvider.shutdown()
203+ }
204+
205+ assertEquals(
206+ " ${otelSpan.spanContext.traceId} -${otelSpan.spanContext.spanId} -1" ,
207+ carrier[" sentry-trace" ],
208+ )
209+ assertEquals(
210+ " sentry-environment=production,sentry-public_key=502f25099c204a2fbf4cb16edc5975d1,sentry-sample_rand=0.456789,sentry-sample_rate=0.5,sentry-sampled=true,sentry-trace_id=df71f5972f754b4c85af13ff5c07017d" ,
211+ carrier[" baggage" ],
212+ )
213+ }
214+
215+ @Test
216+ fun `does not inject headers if URL in span attributes does not match tracePropagationTargets` () {
217+ Sentry .init { options ->
218+ options.dsn = " https://key@sentry.io/proj"
219+ options.setTracePropagationTargets(listOf (" github.com" ))
220+ }
221+ val propagator = OpenTelemetryOtlpPropagator ()
222+ val carrier = mutableMapOf<String , String >()
223+ val tracerProvider = SdkTracerProvider .builder().build()
224+ val otelSpan =
225+ tracerProvider
226+ .get(" test" )
227+ .spanBuilder(" test" )
228+ .setAttribute(" url.full" , " https://sentry.io/api/0/" )
229+ .startSpan()
230+
231+ try {
232+ propagator.inject(Context .root().with (otelSpan), carrier, MapSetter ())
233+ } finally {
234+ otelSpan.end()
235+ tracerProvider.shutdown()
236+ }
237+
238+ assertNull(carrier[" sentry-trace" ])
239+ assertNull(carrier[" baggage" ])
240+ }
241+
242+ @Test
243+ fun `does not inject headers if tracePropagationTargets is restricted and URL is unavailable` () {
244+ Sentry .init { options ->
245+ options.dsn = " https://key@sentry.io/proj"
246+ options.setTracePropagationTargets(listOf (" sentry.io" ))
247+ }
248+ val propagator = OpenTelemetryOtlpPropagator ()
249+ val carrier = mutableMapOf<String , String >()
250+
251+ val otelSpanContext =
252+ SpanContext .create(
253+ " f9118105af4a2d42b4124532cd1065ff" ,
254+ " 424cffc8f94feeee" ,
255+ TraceFlags .getSampled(),
256+ TraceState .getDefault(),
257+ )
258+ val otelSpan = Span .wrap(otelSpanContext)
259+
260+ propagator.inject(Context .root().with (otelSpan), carrier, MapSetter ())
261+
262+ assertNull(carrier[" sentry-trace" ])
263+ assertNull(carrier[" baggage" ])
264+ }
265+
174266 @Test
175267 fun `does not inject headers when no span in context` () {
176268 val propagator = OpenTelemetryOtlpPropagator ()
0 commit comments