diff --git a/sentry-opentelemetry/sentry-opentelemetry-agentcustomization/src/main/java/io/sentry/opentelemetry/SentryAutoConfigurationCustomizerProvider.java b/sentry-opentelemetry/sentry-opentelemetry-agentcustomization/src/main/java/io/sentry/opentelemetry/SentryAutoConfigurationCustomizerProvider.java index 8ea2f3bab56..cff10354573 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agentcustomization/src/main/java/io/sentry/opentelemetry/SentryAutoConfigurationCustomizerProvider.java +++ b/sentry-opentelemetry/sentry-opentelemetry-agentcustomization/src/main/java/io/sentry/opentelemetry/SentryAutoConfigurationCustomizerProvider.java @@ -6,7 +6,6 @@ import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder; import io.opentelemetry.sdk.trace.export.BatchSpanProcessor; -import io.sentry.Instrumenter; import io.sentry.Sentry; import io.sentry.SentryIntegrationPackageStorage; import io.sentry.SentryOptions; @@ -38,10 +37,6 @@ public void customize(AutoConfigurationCustomizer autoConfiguration) { Sentry.init( options -> { options.setEnableExternalConfiguration(true); - // TODO [POTEL] deprecate - options.setInstrumenter(Instrumenter.OTEL); - // TODO [POTEL] do we still need this? - options.addEventProcessor(new OpenTelemetryLinkErrorEventProcessor()); options.setIgnoredSpanOrigins(SpanUtils.ignoredSpanOriginsForOpenTelemetry()); options.setSpanFactory(new OtelSpanFactory()); final @Nullable SdkVersion sdkVersion = createSdkVersion(options, versionInfoHolder); @@ -153,8 +148,6 @@ private static class VersionInfoHolder { private SdkTracerProviderBuilder configureSdkTracerProvider( SdkTracerProviderBuilder tracerProvider, ConfigProperties config) { - // TODO [POTEL] configurable or separate packages for old vs new way - // return tracerProvider.addSpanProcessor(new SentrySpanProcessor()); return tracerProvider .setSampler(new SentrySampler()) .addSpanProcessor(new PotelSentrySpanProcessor()) diff --git a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/api/sentry-opentelemetry-bootstrap.api b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/api/sentry-opentelemetry-bootstrap.api index e7d23487716..d9907781b57 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/api/sentry-opentelemetry-bootstrap.api +++ b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/api/sentry-opentelemetry-bootstrap.api @@ -42,7 +42,6 @@ public final class io/sentry/opentelemetry/OtelSpanWrapper : io/sentry/ISpan { public fun getData ()Ljava/util/Map; public fun getData (Ljava/lang/String;)Ljava/lang/Object; public fun getDescription ()Ljava/lang/String; - public fun getEventId ()Lio/sentry/protocol/SentryId; public fun getFinishDate ()Lio/sentry/SentryDate; public fun getLocalMetricsAggregator ()Lio/sentry/metrics/LocalMetricsAggregator; public fun getMeasurements ()Ljava/util/Map; diff --git a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/OtelContextScopesStorage.java b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/OtelContextScopesStorage.java index d824776dab1..299e91dae90 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/OtelContextScopesStorage.java +++ b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/OtelContextScopesStorage.java @@ -14,7 +14,7 @@ public final class OtelContextScopesStorage implements IScopesStorage { @Override - public ISentryLifecycleToken set(@Nullable IScopes scopes) { + public @NotNull ISentryLifecycleToken set(@Nullable IScopes scopes) { final @NotNull Scope otelScope = Context.current().with(SENTRY_SCOPES_KEY, scopes).makeCurrent(); return new OtelStorageToken(otelScope); diff --git a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/OtelSpanWrapper.java b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/OtelSpanWrapper.java index a7f6b86eb75..2a023e115bc 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/OtelSpanWrapper.java +++ b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/OtelSpanWrapper.java @@ -476,12 +476,6 @@ public Map getMeasurements() { return context.getSamplingDecision(); } - @Override - public @NotNull SentryId getEventId() { - // TODO [POTEL] - return new SentryId(getOtelSpanId().toString()); - } - @ApiStatus.Internal public @NotNull IScopes getScopes() { return scopes; diff --git a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/OtelTransactionSpanForwarder.java b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/OtelTransactionSpanForwarder.java index eaa3fce56e2..373a4e19091 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/OtelTransactionSpanForwarder.java +++ b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/OtelTransactionSpanForwarder.java @@ -257,7 +257,8 @@ public boolean isNoOp() { @Override public @NotNull SentryId getEventId() { - return rootSpan.getEventId(); + // TODO [POTEL] + return new SentryId(); } @ApiStatus.Internal diff --git a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/SentryWeakSpanStorage.java b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/SentryWeakSpanStorage.java index ebcf89ce89f..af9413f74ff 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/SentryWeakSpanStorage.java +++ b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/SentryWeakSpanStorage.java @@ -7,14 +7,8 @@ import org.jetbrains.annotations.Nullable; /** - * This class may have to be moved to a new gradle module to include it in the bootstrap - * classloader. - * - *

This uses multiple maps instead of a single one with a wrapper object as porting this to - * Android would mean there's no access to methods like compute etc. before API level 24. There's - * also no easy way to pre-initialize the map for all keys as spans are used as keys. For span IDs - * it would also not work as they are random. For client report storage we know beforehand what keys - * can exist. + * Weakly references wrappers for OpenTelemetry spans meaning they'll be cleaned up when the + * OpenTelemetry span is garbage collected. */ @ApiStatus.Internal public final class SentryWeakSpanStorage { diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OpenTelemetryLinkErrorEventProcessor.java b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OpenTelemetryLinkErrorEventProcessor.java index 9ed17b06dde..cf1e530cd9e 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OpenTelemetryLinkErrorEventProcessor.java +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OpenTelemetryLinkErrorEventProcessor.java @@ -11,17 +11,23 @@ import io.sentry.ScopesAdapter; import io.sentry.SentryEvent; import io.sentry.SentryLevel; -import io.sentry.SentrySpanStorage; import io.sentry.SpanContext; import io.sentry.protocol.SentryId; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; +/** + * @deprecated this is no longer needed for the latest version of our OpenTelemetry integration. + */ +@Deprecated public final class OpenTelemetryLinkErrorEventProcessor implements EventProcessor { private final @NotNull IScopes scopes; - private final @NotNull SentrySpanStorage spanStorage = SentrySpanStorage.getInstance(); + + @SuppressWarnings("deprecation") + private final @NotNull io.sentry.SentrySpanStorage spanStorage = + io.sentry.SentrySpanStorage.getInstance(); public OpenTelemetryLinkErrorEventProcessor() { this(ScopesAdapter.getInstance()); diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSamplingUtil.java b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSamplingUtil.java index 4a6124df11b..45a8922741d 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSamplingUtil.java +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/OtelSamplingUtil.java @@ -9,7 +9,7 @@ @ApiStatus.Internal public final class OtelSamplingUtil { - public static @Nullable TracesSamplingDecision extractSamplingDecisionOrDefault( + public static @NotNull TracesSamplingDecision extractSamplingDecisionOrDefault( final @NotNull Attributes attributes) { final @Nullable TracesSamplingDecision decision = extractSamplingDecision(attributes); if (decision != null) { diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/PotelSentrySpanProcessor.java b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/PotelSentrySpanProcessor.java index 5ba54602b47..9ee3f8e854e 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/PotelSentrySpanProcessor.java +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/PotelSentrySpanProcessor.java @@ -80,9 +80,10 @@ public void onStart(final @NotNull Context parentContext, final @NotNull ReadWri } } - // TODO [POTEL] what do we use as fallback here? could happen if misconfigured (i.e. sampler - // not in place) - final boolean sampled = samplingDecision != null ? samplingDecision.getSampled() : true; + final boolean sampled = + samplingDecision != null + ? samplingDecision.getSampled() + : otelSpan.getSpanContext().isSampled(); final @NotNull PropagationContext propagationContext = sentryTraceHeader == null @@ -128,7 +129,6 @@ public void onEnd(final @NotNull ReadableSpan spanBeingEnded) { new SentryLongDate(spanBeingEnded.toSpanData().getEndEpochNanos()); sentrySpan.updateEndDate(finishDate); } - System.out.println("span ended: " + spanBeingEnded.getSpanContext().getSpanId()); } @Override diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentryPropagator.java b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentryPropagator.java index ed3e243f4d9..da411c31262 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentryPropagator.java +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentryPropagator.java @@ -14,7 +14,6 @@ import io.sentry.ISpan; import io.sentry.ScopesAdapter; import io.sentry.SentryLevel; -import io.sentry.SentrySpanStorage; import io.sentry.SentryTraceHeader; import io.sentry.exception.InvalidSentryTraceHeaderException; import java.util.Arrays; @@ -24,11 +23,19 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +/** + * @deprecated please use {@link PotelSentryPropagator} instead + */ +@Deprecated public final class SentryPropagator implements TextMapPropagator { private static final @NotNull List FIELDS = Arrays.asList(SentryTraceHeader.SENTRY_TRACE_HEADER, BaggageHeader.BAGGAGE_HEADER); - private final @NotNull SentrySpanStorage spanStorage = SentrySpanStorage.getInstance(); + + @SuppressWarnings("deprecation") + private final @NotNull io.sentry.SentrySpanStorage spanStorage = + io.sentry.SentrySpanStorage.getInstance(); + private final @NotNull IScopes scopes; public SentryPropagator() { diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySampler.java b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySampler.java index e2b5aee4549..f4b62334878 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySampler.java +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySampler.java @@ -6,15 +6,16 @@ import io.opentelemetry.context.Context; import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.samplers.Sampler; +import io.opentelemetry.sdk.trace.samplers.SamplingDecision; import io.opentelemetry.sdk.trace.samplers.SamplingResult; import io.sentry.Baggage; import io.sentry.IScopes; import io.sentry.PropagationContext; import io.sentry.SamplingContext; import io.sentry.ScopesAdapter; +import io.sentry.SentryOptions; import io.sentry.SentryTraceHeader; import io.sentry.SpanId; -import io.sentry.TracesSampler; import io.sentry.TracesSamplingDecision; import io.sentry.TransactionContext; import io.sentry.protocol.SentryId; @@ -25,10 +26,10 @@ public final class SentrySampler implements Sampler { private final @NotNull SentryWeakSpanStorage spanStorage = SentryWeakSpanStorage.getInstance(); - private final @NotNull TracesSampler tracesSampler; + private final @NotNull SentryOptions options; public SentrySampler(final @NotNull IScopes scopes) { - this.tracesSampler = scopes.getOptions().getInternalTracesSampler(); + this.options = scopes.getOptions(); } public SentrySampler() { @@ -61,8 +62,11 @@ public SamplingResult shouldSample( } } - private @NotNull SentrySamplingResult handleRootOtelSpan( + private @NotNull SamplingResult handleRootOtelSpan( final @NotNull String traceId, final @NotNull Context parentContext) { + if (!options.isTraceSampling()) { + return SamplingResult.create(SamplingDecision.DROP); + } @Nullable Baggage baggage = null; @Nullable SentryTraceHeader sentryTraceHeader = parentContext.get(SentryOtelKeys.SENTRY_TRACE_KEY); @@ -81,7 +85,7 @@ public SamplingResult shouldSample( final @NotNull TransactionContext transactionContext = TransactionContext.fromPropagationContext(propagationContext); final @NotNull TracesSamplingDecision sentryDecision = - tracesSampler.sample(new SamplingContext(transactionContext, null)); + options.getInternalTracesSampler().sample(new SamplingContext(transactionContext, null)); return new SentrySamplingResult(sentryDecision); } diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanExporter.java b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanExporter.java index 50439a87004..ec7ae4918bb 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanExporter.java +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanExporter.java @@ -157,21 +157,15 @@ private boolean isSentryRequest(final @NotNull SpanData spanData) { // TODO [POTEL] should check if enabled but multi init with different options makes testing hard // atm // if (scopes.getOptions().isEnableSpotlight()) { - final @Nullable String spotlightUrl = scopes.getOptions().getSpotlightConnectionUrl(); - if (spotlightUrl != null) { - if (containsSpotlightUrl(fullUrl, spotlightUrl)) { - return true; - } - if (containsSpotlightUrl(httpUrl, spotlightUrl)) { - return true; - } - } else { - if (containsSpotlightUrl(fullUrl, "http://localhost:8969/stream")) { - return true; - } - if (containsSpotlightUrl(httpUrl, "http://localhost:8969/stream")) { - return true; - } + final @Nullable String optionsSpotlightUrl = scopes.getOptions().getSpotlightConnectionUrl(); + final @NotNull String spotlightUrl = + optionsSpotlightUrl != null ? optionsSpotlightUrl : "http://localhost:8969/stream"; + + if (containsSpotlightUrl(fullUrl, spotlightUrl)) { + return true; + } + if (containsSpotlightUrl(httpUrl, spotlightUrl)) { + return true; } // } @@ -344,7 +338,7 @@ private void transferSpanDetails( traceId); final SpanId sentrySpanId = new SpanId(spanId); - @NotNull String transactionName = spanInfo.getDescription(); + @Nullable String transactionName = spanInfo.getDescription(); @NotNull TransactionNameSource transactionNameSource = spanInfo.getTransactionNameSource(); @Nullable SpanId parentSpanId = null; @Nullable Baggage baggage = null; diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanProcessor.java b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanProcessor.java index 60f379ceae0..4f91d29427c 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanProcessor.java +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanProcessor.java @@ -24,7 +24,6 @@ import io.sentry.SentryDate; import io.sentry.SentryLevel; import io.sentry.SentryLongDate; -import io.sentry.SentrySpanStorage; import io.sentry.SentryTraceHeader; import io.sentry.SpanId; import io.sentry.SpanOptions; @@ -40,6 +39,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +/** + * @deprecated please use {@link PotelSentrySpanProcessor} instead. + */ +@Deprecated public final class SentrySpanProcessor implements SpanProcessor { private static final String TRACE_ORIGN = "auto.otel"; @@ -48,7 +51,11 @@ public final class SentrySpanProcessor implements SpanProcessor { Arrays.asList(SpanKind.CLIENT, SpanKind.INTERNAL); private final @NotNull SpanDescriptionExtractor spanDescriptionExtractor = new SpanDescriptionExtractor(); - private final @NotNull SentrySpanStorage spanStorage = SentrySpanStorage.getInstance(); + + @SuppressWarnings("deprecation") + private final @NotNull io.sentry.SentrySpanStorage spanStorage = + io.sentry.SentrySpanStorage.getInstance(); + private final @NotNull IScopes scopes; public SentrySpanProcessor() { diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/TraceData.java b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/TraceData.java index 08751b56092..5904db39e77 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/TraceData.java +++ b/sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/TraceData.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +@Deprecated @ApiStatus.Internal public final class TraceData { diff --git a/sentry-spring-boot-jakarta/src/main/java/io/sentry/spring/boot/jakarta/SentryAutoConfiguration.java b/sentry-spring-boot-jakarta/src/main/java/io/sentry/spring/boot/jakarta/SentryAutoConfiguration.java index d7f5099aa20..f38682cf6dd 100644 --- a/sentry-spring-boot-jakarta/src/main/java/io/sentry/spring/boot/jakarta/SentryAutoConfiguration.java +++ b/sentry-spring-boot-jakarta/src/main/java/io/sentry/spring/boot/jakarta/SentryAutoConfiguration.java @@ -11,7 +11,6 @@ import io.sentry.SentryIntegrationPackageStorage; import io.sentry.SentryOptions; import io.sentry.graphql.SentryGraphqlExceptionHandler; -import io.sentry.opentelemetry.OpenTelemetryLinkErrorEventProcessor; import io.sentry.protocol.SdkVersion; import io.sentry.quartz.SentryJobListener; import io.sentry.spring.boot.jakarta.graphql.SentryGraphqlAutoConfiguration; @@ -158,14 +157,16 @@ static class ContextTagsEventProcessorConfiguration { @Configuration(proxyBeanMethods = false) @ConditionalOnProperty(name = "sentry.auto-init", havingValue = "false") - @ConditionalOnClass(OpenTelemetryLinkErrorEventProcessor.class) + @ConditionalOnClass(io.sentry.opentelemetry.OpenTelemetryLinkErrorEventProcessor.class) + @SuppressWarnings("deprecation") @Open static class OpenTelemetryLinkErrorEventProcessorConfiguration { @Bean @ConditionalOnMissingBean - public @NotNull OpenTelemetryLinkErrorEventProcessor openTelemetryLinkErrorEventProcessor() { - return new OpenTelemetryLinkErrorEventProcessor(); + public @NotNull io.sentry.opentelemetry.OpenTelemetryLinkErrorEventProcessor + openTelemetryLinkErrorEventProcessor() { + return new io.sentry.opentelemetry.OpenTelemetryLinkErrorEventProcessor(); } } diff --git a/sentry-spring-boot/src/main/java/io/sentry/spring/boot/SentryAutoConfiguration.java b/sentry-spring-boot/src/main/java/io/sentry/spring/boot/SentryAutoConfiguration.java index df3ca097bcd..62f8e8457df 100644 --- a/sentry-spring-boot/src/main/java/io/sentry/spring/boot/SentryAutoConfiguration.java +++ b/sentry-spring-boot/src/main/java/io/sentry/spring/boot/SentryAutoConfiguration.java @@ -11,7 +11,6 @@ import io.sentry.SentryIntegrationPackageStorage; import io.sentry.SentryOptions; import io.sentry.graphql.SentryGraphqlExceptionHandler; -import io.sentry.opentelemetry.OpenTelemetryLinkErrorEventProcessor; import io.sentry.protocol.SdkVersion; import io.sentry.quartz.SentryJobListener; import io.sentry.spring.ContextTagsEventProcessor; @@ -156,14 +155,16 @@ static class ContextTagsEventProcessorConfiguration { @Configuration(proxyBeanMethods = false) @ConditionalOnProperty(name = "sentry.auto-init", havingValue = "false") - @ConditionalOnClass(OpenTelemetryLinkErrorEventProcessor.class) + @ConditionalOnClass(io.sentry.opentelemetry.OpenTelemetryLinkErrorEventProcessor.class) + @SuppressWarnings("deprecation") @Open static class OpenTelemetryLinkErrorEventProcessorConfiguration { @Bean @ConditionalOnMissingBean - public @NotNull OpenTelemetryLinkErrorEventProcessor openTelemetryLinkErrorEventProcessor() { - return new OpenTelemetryLinkErrorEventProcessor(); + public @NotNull io.sentry.opentelemetry.OpenTelemetryLinkErrorEventProcessor + openTelemetryLinkErrorEventProcessor() { + return new io.sentry.opentelemetry.OpenTelemetryLinkErrorEventProcessor(); } } diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index 472b389dfec..f0514f13e5f 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -998,6 +998,7 @@ public abstract interface class io/sentry/ISpanFactory { public abstract interface class io/sentry/ITransaction : io/sentry/ISpan { public abstract fun finish (Lio/sentry/SpanStatus;Lio/sentry/SentryDate;ZLio/sentry/Hint;)V public abstract fun forceFinish (Lio/sentry/SpanStatus;ZLio/sentry/Hint;)V + public abstract fun getEventId ()Lio/sentry/protocol/SentryId; public abstract fun getLatestActiveSpan ()Lio/sentry/ISpan; public abstract fun getName ()Ljava/lang/String; public abstract fun getSpans ()Ljava/util/List; diff --git a/sentry/src/main/java/io/sentry/ISpan.java b/sentry/src/main/java/io/sentry/ISpan.java index 7fc56cc01f0..f624bb79ef0 100644 --- a/sentry/src/main/java/io/sentry/ISpan.java +++ b/sentry/src/main/java/io/sentry/ISpan.java @@ -2,7 +2,6 @@ import io.sentry.metrics.LocalMetricsAggregator; import io.sentry.protocol.Contexts; -import io.sentry.protocol.SentryId; import java.util.List; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -281,8 +280,8 @@ ISpan startChild( @Nullable TracesSamplingDecision getSamplingDecision(); - @NotNull - SentryId getEventId(); + // @NotNull + // SentryId getEventId(); @ApiStatus.Internal @NotNull diff --git a/sentry/src/main/java/io/sentry/ITransaction.java b/sentry/src/main/java/io/sentry/ITransaction.java index 9504e5b7a87..403b21187b7 100644 --- a/sentry/src/main/java/io/sentry/ITransaction.java +++ b/sentry/src/main/java/io/sentry/ITransaction.java @@ -1,5 +1,6 @@ package io.sentry; +import io.sentry.protocol.SentryId; import io.sentry.protocol.TransactionNameSource; import java.util.List; import org.jetbrains.annotations.ApiStatus; @@ -89,4 +90,7 @@ void finish( @Nullable SentryDate timestamp, boolean dropIfNoChildren, @Nullable Hint hint); + + @NotNull + SentryId getEventId(); } diff --git a/sentry/src/main/java/io/sentry/NoOpSpan.java b/sentry/src/main/java/io/sentry/NoOpSpan.java index 533bbf00749..6658308d760 100644 --- a/sentry/src/main/java/io/sentry/NoOpSpan.java +++ b/sentry/src/main/java/io/sentry/NoOpSpan.java @@ -191,11 +191,6 @@ public void setContext(@NotNull String key, @NotNull Object context) {} return null; } - @Override - public @NotNull SentryId getEventId() { - return SentryId.EMPTY_ID; - } - @Override public @NotNull ISentryLifecycleToken makeCurrent() { return NoOpScopesLifecycleToken.getInstance(); diff --git a/sentry/src/main/java/io/sentry/Scopes.java b/sentry/src/main/java/io/sentry/Scopes.java index f305411aa69..526c0f19d47 100644 --- a/sentry/src/main/java/io/sentry/Scopes.java +++ b/sentry/src/main/java/io/sentry/Scopes.java @@ -834,7 +834,7 @@ public void flush(long timeoutMillis) { .getLogger() .log( SentryLevel.DEBUG, - "Returning no-op for span origin %s as the SDK has been configured to use ignore it", + "Returning no-op for span origin %s as the SDK has been configured to ignore it", transactionContext.getOrigin()); transaction = NoOpTransaction.getInstance(); diff --git a/sentry/src/main/java/io/sentry/SentryOptions.java b/sentry/src/main/java/io/sentry/SentryOptions.java index c199533d202..d46eb8771c8 100644 --- a/sentry/src/main/java/io/sentry/SentryOptions.java +++ b/sentry/src/main/java/io/sentry/SentryOptions.java @@ -1954,7 +1954,11 @@ public void setEnableUserInteractionBreadcrumbs(boolean enableUserInteractionBre * startTransaction(...), nor will it create child spans if you call startChild(...) * * @param instrumenter - the instrumenter to use + * @deprecated this should no longer be needed with our current OpenTelmetry integration. Use + * {@link SentryOptions#setIgnoredSpanOrigins(List)} instead if you need fine grained control + * over what integrations can create spans. */ + @Deprecated public void setInstrumenter(final @NotNull Instrumenter instrumenter) { this.instrumenter = instrumenter; } @@ -2228,7 +2232,7 @@ public void setIgnoredSpanOrigins(final @Nullable List ignoredSpanOrigin } else { @NotNull final List filtered = new ArrayList<>(); for (String origin : ignoredSpanOrigins) { - if (!origin.isEmpty()) { + if (origin != null && !origin.isEmpty()) { filtered.add(origin); } } diff --git a/sentry/src/main/java/io/sentry/SentrySpanStorage.java b/sentry/src/main/java/io/sentry/SentrySpanStorage.java index b260f06e5c0..eb7379741c1 100644 --- a/sentry/src/main/java/io/sentry/SentrySpanStorage.java +++ b/sentry/src/main/java/io/sentry/SentrySpanStorage.java @@ -9,7 +9,10 @@ /** * Has been moved to `sentry` gradle module to include it in the bootstrap classloader without * having to introduce yet another module for OpenTelemetry support. + * + * @deprecated please use SentryWeakSpanStorage (from sentry-opentelemetry-bootstrap) instead. */ +@Deprecated @ApiStatus.Internal public final class SentrySpanStorage { private static volatile @Nullable SentrySpanStorage INSTANCE; diff --git a/sentry/src/main/java/io/sentry/Span.java b/sentry/src/main/java/io/sentry/Span.java index d85cbe43a93..73de8085951 100644 --- a/sentry/src/main/java/io/sentry/Span.java +++ b/sentry/src/main/java/io/sentry/Span.java @@ -306,6 +306,11 @@ public boolean isFinished() { return context.getSamplingDecision(); } + // @Override + // public @NotNull SentryId getEventId() { + // return new SentryId(UUID.nameUUIDFromBytes(getSpanId().toString().getBytes())); + // } + @Override public @NotNull SentryId getEventId() { return new SentryId(getSpanId().toString());