From bd0c3b401a6b4b64647831328eb3f9d6893ff845 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Tue, 18 Mar 2025 11:08:37 +0100 Subject: [PATCH 01/20] Check for mixed SDK versions --- .../src/main/java/io/sentry/SentryClient.java | 3 ++ .../SentryIntegrationPackageStorage.java | 33 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/sentry/src/main/java/io/sentry/SentryClient.java b/sentry/src/main/java/io/sentry/SentryClient.java index 277be87aeef..cbd9ca9fc63 100644 --- a/sentry/src/main/java/io/sentry/SentryClient.java +++ b/sentry/src/main/java/io/sentry/SentryClient.java @@ -767,6 +767,9 @@ public void captureSession(final @NotNull Session session, final @Nullable Hint .log(SentryLevel.ERROR, "The BeforeEnvelope callback threw an exception.", e); } } + + SentryIntegrationPackageStorage.getInstance().checkForMixedVersions(options.getLogger()); + if (hint == null) { transport.send(envelope); } else { diff --git a/sentry/src/main/java/io/sentry/SentryIntegrationPackageStorage.java b/sentry/src/main/java/io/sentry/SentryIntegrationPackageStorage.java index 16534291448..d52ffc6c77b 100644 --- a/sentry/src/main/java/io/sentry/SentryIntegrationPackageStorage.java +++ b/sentry/src/main/java/io/sentry/SentryIntegrationPackageStorage.java @@ -5,6 +5,7 @@ import io.sentry.util.Objects; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; + import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -15,6 +16,8 @@ public final class SentryIntegrationPackageStorage { private static volatile @Nullable SentryIntegrationPackageStorage INSTANCE; private static final @NotNull AutoClosableReentrantLock staticLock = new AutoClosableReentrantLock(); + private static volatile @Nullable Boolean mixedVersionsDetected = null; + private static final @NotNull AutoClosableReentrantLock mixedVersionsLock = new AutoClosableReentrantLock(); public static @NotNull SentryIntegrationPackageStorage getInstance() { if (INSTANCE == null) { @@ -64,12 +67,42 @@ public void addPackage(final @NotNull String name, final @NotNull String version SentryPackage newPackage = new SentryPackage(name, version); packages.add(newPackage); + try (final @NotNull ISentryLifecycleToken ignored = mixedVersionsLock.acquire()) { + mixedVersionsDetected = null; + } } public @NotNull Set getPackages() { return packages; } + public boolean checkForMixedVersions(final @NotNull ILogger logger) { + final @Nullable Boolean mixedVersionsDetectedBefore = mixedVersionsDetected; + if (mixedVersionsDetectedBefore != null) { + return mixedVersionsDetectedBefore; + } + try (final @NotNull ISentryLifecycleToken ignored = mixedVersionsLock.acquire()) { + final @NotNull String sdkVersion = BuildConfig.VERSION_NAME; + boolean mixedVersionsDetectedThisCheck = false; + + for (SentryPackage pkg : packages) { + if (pkg.getName().startsWith("maven:io.sentry:") && !sdkVersion.equalsIgnoreCase(pkg.getVersion())) { + logger.log(SentryLevel.ERROR, "The Sentry SDK has been configured with mixed versions. Expected %s to match core SDK version %s but was %s", pkg.getName(), sdkVersion, pkg.getVersion()); + mixedVersionsDetectedThisCheck = true; + } + } + + if (mixedVersionsDetectedThisCheck) { + logger.log(SentryLevel.ERROR, "^^^^^^^^^^^^^^^^^^^^^^^^^^^^"); + logger.log(SentryLevel.ERROR, "^^^^^^^^^^^^^^^^^^^^^^^^^^^^"); + logger.log(SentryLevel.ERROR, "^^^^^^^^^^^^^^^^^^^^^^^^^^^^"); + logger.log(SentryLevel.ERROR, "^^^^^^^^^^^^^^^^^^^^^^^^^^^^"); + } + mixedVersionsDetected = mixedVersionsDetectedThisCheck; + return mixedVersionsDetectedThisCheck; + } + } + @TestOnly public void clearStorage() { integrations.clear(); From f50173bf30c8a78dae542aa50c530fa2d93264bc Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Thu, 20 Mar 2025 05:55:19 +0000 Subject: [PATCH 02/20] Format code --- .../io/sentry/SentryIntegrationPackageStorage.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/sentry/src/main/java/io/sentry/SentryIntegrationPackageStorage.java b/sentry/src/main/java/io/sentry/SentryIntegrationPackageStorage.java index d52ffc6c77b..1ceba1dba3a 100644 --- a/sentry/src/main/java/io/sentry/SentryIntegrationPackageStorage.java +++ b/sentry/src/main/java/io/sentry/SentryIntegrationPackageStorage.java @@ -5,7 +5,6 @@ import io.sentry.util.Objects; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; - import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -17,7 +16,8 @@ public final class SentryIntegrationPackageStorage { private static final @NotNull AutoClosableReentrantLock staticLock = new AutoClosableReentrantLock(); private static volatile @Nullable Boolean mixedVersionsDetected = null; - private static final @NotNull AutoClosableReentrantLock mixedVersionsLock = new AutoClosableReentrantLock(); + private static final @NotNull AutoClosableReentrantLock mixedVersionsLock = + new AutoClosableReentrantLock(); public static @NotNull SentryIntegrationPackageStorage getInstance() { if (INSTANCE == null) { @@ -86,8 +86,14 @@ public boolean checkForMixedVersions(final @NotNull ILogger logger) { boolean mixedVersionsDetectedThisCheck = false; for (SentryPackage pkg : packages) { - if (pkg.getName().startsWith("maven:io.sentry:") && !sdkVersion.equalsIgnoreCase(pkg.getVersion())) { - logger.log(SentryLevel.ERROR, "The Sentry SDK has been configured with mixed versions. Expected %s to match core SDK version %s but was %s", pkg.getName(), sdkVersion, pkg.getVersion()); + if (pkg.getName().startsWith("maven:io.sentry:") + && !sdkVersion.equalsIgnoreCase(pkg.getVersion())) { + logger.log( + SentryLevel.ERROR, + "The Sentry SDK has been configured with mixed versions. Expected %s to match core SDK version %s but was %s", + pkg.getName(), + sdkVersion, + pkg.getVersion()); mixedVersionsDetectedThisCheck = true; } } From a8875cf6dc410923fa81db6302ec80f0179d498c Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Thu, 20 Mar 2025 08:55:45 +0100 Subject: [PATCH 03/20] format + api --- sentry/api/sentry.api | 1 + 1 file changed, 1 insertion(+) diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index 96fc98eebd7..9637e4e7bc3 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -2706,6 +2706,7 @@ public final class io/sentry/SentryInstantDateProvider : io/sentry/SentryDatePro public final class io/sentry/SentryIntegrationPackageStorage { public fun addIntegration (Ljava/lang/String;)V public fun addPackage (Ljava/lang/String;Ljava/lang/String;)V + public fun checkForMixedVersions (Lio/sentry/ILogger;)Z public fun clearStorage ()V public static fun getInstance ()Lio/sentry/SentryIntegrationPackageStorage; public fun getIntegrations ()Ljava/util/Set; From c0eea6a8315dbf7f6994b77f0e22d3dd102919dc Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Thu, 20 Mar 2025 09:11:26 +0100 Subject: [PATCH 04/20] Init noops if mixed versions detected --- .../android/fragment/FragmentLifecycleIntegration.kt | 7 +++++++ .../android/navigation/SentryNavigationListener.kt | 5 +++++ .../java/io/sentry/android/ndk/SentryNdkUtil.java | 6 ++++++ .../io/sentry/android/replay/ReplayIntegration.kt | 7 +++++++ .../sentry/android/timber/SentryTimberIntegration.kt | 7 +++++++ .../io/sentry/apollo3/SentryApollo3HttpInterceptor.kt | 5 +++++ .../io/sentry/apollo4/SentryApollo4HttpInterceptor.kt | 5 +++++ .../java/io/sentry/apollo/SentryApolloInterceptor.kt | 6 ++++++ .../compose/gestures/ComposeGestureTargetLocator.java | 5 +++++ .../io/sentry/compose/SentryNavigationIntegration.kt | 6 ++++++ .../io/sentry/graphql22/SentryInstrumentation.java | 5 +++++ .../java/io/sentry/graphql/SentryInstrumentation.java | 5 +++++ .../java/io/sentry/jdbc/SentryJdbcEventListener.java | 5 +++++ .../src/main/java/io/sentry/jul/SentryHandler.java | 5 +++++ .../main/java/io/sentry/log4j2/SentryAppender.java | 5 +++++ .../main/java/io/sentry/logback/SentryAppender.java | 5 +++++ .../java/io/sentry/okhttp/SentryOkHttpInterceptor.kt | 7 +++++++ .../java/io/sentry/openfeign/SentryFeignClient.java | 5 +++++ .../opentelemetry/agent/AgentlessSpringMarker.java | 11 ++++++++++- .../sentry/opentelemetry/agent/AgentlessMarker.java | 10 +++++++++- .../main/java/io/sentry/quartz/SentryJobListener.java | 5 +++++ .../jakarta/SentryServletContainerInitializer.java | 6 ++++++ .../servlet/SentryServletContainerInitializer.java | 6 ++++++ .../spring/boot/jakarta/SentryAutoConfiguration.java | 5 +++++ .../sentry/spring/boot/SentryAutoConfiguration.java | 5 +++++ .../io/sentry/spring/jakarta/SentryHubRegistrar.java | 5 +++++ .../java/io/sentry/spring/SentryHubRegistrar.java | 5 +++++ sentry/src/main/java/io/sentry/util/InitUtil.java | 11 +++++++++++ 28 files changed, 168 insertions(+), 2 deletions(-) diff --git a/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleIntegration.kt b/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleIntegration.kt index 0577944be24..047f8741734 100644 --- a/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleIntegration.kt +++ b/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleIntegration.kt @@ -22,6 +22,13 @@ public class FragmentLifecycleIntegration( Integration, Closeable { + private companion object { + init { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-android-fragment", BuildConfig.VERSION_NAME) + } + } + public constructor(application: Application) : this( application = application, filterFragmentLifecycleBreadcrumbs = FragmentLifecycleState.states, diff --git a/sentry-android-navigation/src/main/java/io/sentry/android/navigation/SentryNavigationListener.kt b/sentry-android-navigation/src/main/java/io/sentry/android/navigation/SentryNavigationListener.kt index 4f546851a6d..e4adf73354c 100644 --- a/sentry-android-navigation/src/main/java/io/sentry/android/navigation/SentryNavigationListener.kt +++ b/sentry-android-navigation/src/main/java/io/sentry/android/navigation/SentryNavigationListener.kt @@ -195,5 +195,10 @@ public class SentryNavigationListener @JvmOverloads constructor( public companion object { public const val NAVIGATION_OP: String = "navigation" + + init { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-android-navigation", BuildConfig.VERSION_NAME) + } } } diff --git a/sentry-android-ndk/src/main/java/io/sentry/android/ndk/SentryNdkUtil.java b/sentry-android-ndk/src/main/java/io/sentry/android/ndk/SentryNdkUtil.java index d0c7f2663a6..9f92d2d4d79 100644 --- a/sentry-android-ndk/src/main/java/io/sentry/android/ndk/SentryNdkUtil.java +++ b/sentry-android-ndk/src/main/java/io/sentry/android/ndk/SentryNdkUtil.java @@ -1,5 +1,6 @@ package io.sentry.android.ndk; +import io.sentry.SentryIntegrationPackageStorage; import io.sentry.protocol.SdkVersion; import org.jetbrains.annotations.Nullable; @@ -8,6 +9,11 @@ */ final class SentryNdkUtil { + static { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-android-ndk", BuildConfig.VERSION_NAME); + } + private SentryNdkUtil() {} /** diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayIntegration.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayIntegration.kt index 6565090e7f4..b24efada38b 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayIntegration.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayIntegration.kt @@ -71,6 +71,13 @@ public class ReplayIntegration( IConnectionStatusObserver, IRateLimitObserver { + private companion object { + init { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-android-replay", BuildConfig.VERSION_NAME) + } + } + // needed for the Java's call site public constructor(context: Context, dateProvider: ICurrentDateProvider) : this( context.appContext(), diff --git a/sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberIntegration.kt b/sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberIntegration.kt index a0d9f4dad4d..d108f9dd9b6 100644 --- a/sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberIntegration.kt +++ b/sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberIntegration.kt @@ -21,6 +21,13 @@ public class SentryTimberIntegration( private lateinit var tree: SentryTimberTree private lateinit var logger: ILogger + private companion object { + init { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-android-timber", VERSION_NAME) + } + } + override fun register(scopes: IScopes, options: SentryOptions) { logger = options.logger diff --git a/sentry-apollo-3/src/main/java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt b/sentry-apollo-3/src/main/java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt index ea10503f2b3..d9e03fb6a51 100644 --- a/sentry-apollo-3/src/main/java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt +++ b/sentry-apollo-3/src/main/java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt @@ -453,5 +453,10 @@ class SentryApollo3HttpInterceptor @JvmOverloads constructor( const val SENTRY_APOLLO_3_VARIABLES = "SENTRY-APOLLO-3-VARIABLES" const val SENTRY_APOLLO_3_OPERATION_TYPE = "SENTRY-APOLLO-3-OPERATION-TYPE" const val DEFAULT_CAPTURE_FAILED_REQUESTS = true + + init { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-apollo-3", BuildConfig.VERSION_NAME) + } } } diff --git a/sentry-apollo-4/src/main/java/io/sentry/apollo4/SentryApollo4HttpInterceptor.kt b/sentry-apollo-4/src/main/java/io/sentry/apollo4/SentryApollo4HttpInterceptor.kt index a4e31431bb6..d4be15a81c8 100644 --- a/sentry-apollo-4/src/main/java/io/sentry/apollo4/SentryApollo4HttpInterceptor.kt +++ b/sentry-apollo-4/src/main/java/io/sentry/apollo4/SentryApollo4HttpInterceptor.kt @@ -449,5 +449,10 @@ class SentryApollo4HttpInterceptor @JvmOverloads constructor( companion object { const val DEFAULT_CAPTURE_FAILED_REQUESTS = true + + init { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-apollo-4", BuildConfig.VERSION_NAME) + } } } diff --git a/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt b/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt index c65f57bcc8c..f78352d55f0 100644 --- a/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt +++ b/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt @@ -36,6 +36,12 @@ class SentryApolloInterceptor( private val beforeSpan: BeforeSpanCallback? = null ) : ApolloInterceptor { + private companion object { + init { + SentryIntegrationPackageStorage.getInstance().addPackage("maven:io.sentry:sentry-apollo", BuildConfig.VERSION_NAME) + } + } + constructor(scopes: IScopes) : this(scopes, null) constructor(beforeSpan: BeforeSpanCallback) : this(ScopesAdapter.getInstance(), beforeSpan) diff --git a/sentry-compose-helper/src/jvmMain/java/io/sentry/compose/gestures/ComposeGestureTargetLocator.java b/sentry-compose-helper/src/jvmMain/java/io/sentry/compose/gestures/ComposeGestureTargetLocator.java index 68e32269a1d..55e412a73f2 100644 --- a/sentry-compose-helper/src/jvmMain/java/io/sentry/compose/gestures/ComposeGestureTargetLocator.java +++ b/sentry-compose-helper/src/jvmMain/java/io/sentry/compose/gestures/ComposeGestureTargetLocator.java @@ -33,6 +33,11 @@ public final class ComposeGestureTargetLocator implements GestureTargetLocator { private volatile @Nullable SentryComposeHelper composeHelper; private final @NotNull AutoClosableReentrantLock lock = new AutoClosableReentrantLock(); + static { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-compose", BuildConfig.VERSION_NAME); + } + public ComposeGestureTargetLocator(final @NotNull ILogger logger) { this.logger = logger; SentryIntegrationPackageStorage.getInstance().addIntegration("ComposeUserInteraction"); diff --git a/sentry-compose/src/androidMain/kotlin/io/sentry/compose/SentryNavigationIntegration.kt b/sentry-compose/src/androidMain/kotlin/io/sentry/compose/SentryNavigationIntegration.kt index 0246a5b9918..2b163bac3dc 100644 --- a/sentry-compose/src/androidMain/kotlin/io/sentry/compose/SentryNavigationIntegration.kt +++ b/sentry-compose/src/androidMain/kotlin/io/sentry/compose/SentryNavigationIntegration.kt @@ -26,6 +26,12 @@ internal class SentryLifecycleObserver( SentryNavigationListener(traceOriginAppendix = TRACE_ORIGIN_APPENDIX) ) : LifecycleEventObserver { + private companion object { + init { + SentryIntegrationPackageStorage.getInstance().addPackage("maven:io.sentry:sentry-compose", BuildConfig.VERSION_NAME) + } + } + init { addIntegrationToSdkVersion("ComposeNavigation") SentryIntegrationPackageStorage.getInstance().addPackage("maven:io.sentry:sentry-compose", BuildConfig.VERSION_NAME) diff --git a/sentry-graphql-22/src/main/java/io/sentry/graphql22/SentryInstrumentation.java b/sentry-graphql-22/src/main/java/io/sentry/graphql22/SentryInstrumentation.java index a62eeade700..32f5f150d9e 100644 --- a/sentry-graphql-22/src/main/java/io/sentry/graphql22/SentryInstrumentation.java +++ b/sentry-graphql-22/src/main/java/io/sentry/graphql22/SentryInstrumentation.java @@ -22,6 +22,11 @@ public final class SentryInstrumentation extends graphql.execution.instrumentation.SimplePerformantInstrumentation { + static { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-graphql-22", BuildConfig.VERSION_NAME); + } + /** * @deprecated please use {@link SentryGraphqlInstrumentation#SENTRY_SCOPES_CONTEXT_KEY} */ diff --git a/sentry-graphql/src/main/java/io/sentry/graphql/SentryInstrumentation.java b/sentry-graphql/src/main/java/io/sentry/graphql/SentryInstrumentation.java index db2982e0802..caaadf1432d 100644 --- a/sentry-graphql/src/main/java/io/sentry/graphql/SentryInstrumentation.java +++ b/sentry-graphql/src/main/java/io/sentry/graphql/SentryInstrumentation.java @@ -19,6 +19,11 @@ public final class SentryInstrumentation extends graphql.execution.instrumentation.SimpleInstrumentation { + static { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-graphql", BuildConfig.VERSION_NAME); + } + /** * @deprecated please use {@link SentryGraphqlInstrumentation#SENTRY_SCOPES_CONTEXT_KEY} */ diff --git a/sentry-jdbc/src/main/java/io/sentry/jdbc/SentryJdbcEventListener.java b/sentry-jdbc/src/main/java/io/sentry/jdbc/SentryJdbcEventListener.java index 8a57e1eecac..4b5c7895f46 100644 --- a/sentry-jdbc/src/main/java/io/sentry/jdbc/SentryJdbcEventListener.java +++ b/sentry-jdbc/src/main/java/io/sentry/jdbc/SentryJdbcEventListener.java @@ -31,6 +31,11 @@ public class SentryJdbcEventListener extends SimpleJdbcEventListener { protected final @NotNull AutoClosableReentrantLock databaseDetailsLock = new AutoClosableReentrantLock(); + static { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-jdbc", BuildConfig.VERSION_NAME); + } + public SentryJdbcEventListener(final @NotNull IScopes scopes) { this.scopes = Objects.requireNonNull(scopes, "scopes are required"); addPackageAndIntegrationInfo(); diff --git a/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java b/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java index 5d6bb6d9223..bc760489390 100644 --- a/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java +++ b/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java @@ -49,6 +49,11 @@ public class SentryHandler extends Handler { private @NotNull Level minimumBreadcrumbLevel = Level.INFO; private @NotNull Level minimumEventLevel = Level.SEVERE; + static { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-jul", BuildConfig.VERSION_NAME); + } + /** Creates an instance of SentryHandler. */ public SentryHandler() { this(new SentryOptions()); diff --git a/sentry-log4j2/src/main/java/io/sentry/log4j2/SentryAppender.java b/sentry-log4j2/src/main/java/io/sentry/log4j2/SentryAppender.java index 35b9d694192..5befd6fce9e 100644 --- a/sentry-log4j2/src/main/java/io/sentry/log4j2/SentryAppender.java +++ b/sentry-log4j2/src/main/java/io/sentry/log4j2/SentryAppender.java @@ -54,6 +54,11 @@ public class SentryAppender extends AbstractAppender { private final @NotNull IScopes scopes; private final @Nullable List contextTags; + static { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-log4j2", BuildConfig.VERSION_NAME); + } + public SentryAppender( final @NotNull String name, final @Nullable Filter filter, diff --git a/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java b/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java index 614e3dcb0f7..ea431929f91 100644 --- a/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java +++ b/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java @@ -48,6 +48,11 @@ public class SentryAppender extends UnsynchronizedAppenderBase { private @NotNull Level minimumEventLevel = Level.ERROR; private @Nullable Encoder encoder; + static { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-logback", BuildConfig.VERSION_NAME); + } + @Override public void start() { if (options.getDsn() == null || !options.getDsn().endsWith("_IS_UNDEFINED")) { diff --git a/sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpInterceptor.kt b/sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpInterceptor.kt index 1f22d1c541b..31b5a8997bd 100644 --- a/sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpInterceptor.kt +++ b/sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpInterceptor.kt @@ -50,6 +50,13 @@ public open class SentryOkHttpInterceptor( private val failedRequestTargets: List = listOf(DEFAULT_PROPAGATION_TARGETS) ) : Interceptor { + private companion object { + init { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-okhttp", BuildConfig.VERSION_NAME) + } + } + public constructor() : this(ScopesAdapter.getInstance()) public constructor(scopes: IScopes) : this(scopes, null) public constructor(beforeSpan: BeforeSpanCallback) : this(ScopesAdapter.getInstance(), beforeSpan) diff --git a/sentry-openfeign/src/main/java/io/sentry/openfeign/SentryFeignClient.java b/sentry-openfeign/src/main/java/io/sentry/openfeign/SentryFeignClient.java index 37a52af1646..0763df595a8 100644 --- a/sentry-openfeign/src/main/java/io/sentry/openfeign/SentryFeignClient.java +++ b/sentry-openfeign/src/main/java/io/sentry/openfeign/SentryFeignClient.java @@ -38,6 +38,11 @@ public final class SentryFeignClient implements Client { private final @NotNull IScopes scopes; private final @Nullable BeforeSpanCallback beforeSpan; + static { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-openfeign", BuildConfig.VERSION_NAME); + } + public SentryFeignClient( final @NotNull Client delegate, final @NotNull IScopes scopes, diff --git a/sentry-opentelemetry/sentry-opentelemetry-agentless-spring/src/main/java/io/sentry/opentelemetry/agent/AgentlessSpringMarker.java b/sentry-opentelemetry/sentry-opentelemetry-agentless-spring/src/main/java/io/sentry/opentelemetry/agent/AgentlessSpringMarker.java index eb9441148fc..ac0fb96e5ee 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agentless-spring/src/main/java/io/sentry/opentelemetry/agent/AgentlessSpringMarker.java +++ b/sentry-opentelemetry/sentry-opentelemetry-agentless-spring/src/main/java/io/sentry/opentelemetry/agent/AgentlessSpringMarker.java @@ -1,3 +1,12 @@ package io.sentry.opentelemetry.agent; -public final class AgentlessSpringMarker {} +import io.sentry.SentryIntegrationPackageStorage; +import io.sentry.opentelemetry.agentless.spring.BuildConfig; + +public final class AgentlessSpringMarker { + static { + SentryIntegrationPackageStorage.getInstance() + .addPackage( + "maven:io.sentry:sentry-opentelemetry-agentless-spring", BuildConfig.VERSION_NAME); + } +} diff --git a/sentry-opentelemetry/sentry-opentelemetry-agentless/src/main/java/io/sentry/opentelemetry/agent/AgentlessMarker.java b/sentry-opentelemetry/sentry-opentelemetry-agentless/src/main/java/io/sentry/opentelemetry/agent/AgentlessMarker.java index ddb5101c29b..9034f5a708e 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agentless/src/main/java/io/sentry/opentelemetry/agent/AgentlessMarker.java +++ b/sentry-opentelemetry/sentry-opentelemetry-agentless/src/main/java/io/sentry/opentelemetry/agent/AgentlessMarker.java @@ -1,3 +1,11 @@ package io.sentry.opentelemetry.agent; -public final class AgentlessMarker {} +import io.sentry.SentryIntegrationPackageStorage; +import io.sentry.opentelemetry.agentless.BuildConfig; + +public final class AgentlessMarker { + static { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-opentelemetry-agentless", BuildConfig.VERSION_NAME); + } +} diff --git a/sentry-quartz/src/main/java/io/sentry/quartz/SentryJobListener.java b/sentry-quartz/src/main/java/io/sentry/quartz/SentryJobListener.java index 38dbffdc8ee..78323899d9d 100644 --- a/sentry-quartz/src/main/java/io/sentry/quartz/SentryJobListener.java +++ b/sentry-quartz/src/main/java/io/sentry/quartz/SentryJobListener.java @@ -23,6 +23,11 @@ @ApiStatus.Experimental public final class SentryJobListener implements JobListener { + static { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-quartz", BuildConfig.VERSION_NAME); + } + public static final String SENTRY_CHECK_IN_ID_KEY = "sentry-checkin-id"; public static final String SENTRY_SLUG_KEY = "sentry-slug"; public static final String SENTRY_SCOPE_LIFECYCLE_TOKEN_KEY = "sentry-scope-lifecycle"; diff --git a/sentry-servlet-jakarta/src/main/java/io/sentry/servlet/jakarta/SentryServletContainerInitializer.java b/sentry-servlet-jakarta/src/main/java/io/sentry/servlet/jakarta/SentryServletContainerInitializer.java index d5b39e82c76..602e7286124 100644 --- a/sentry-servlet-jakarta/src/main/java/io/sentry/servlet/jakarta/SentryServletContainerInitializer.java +++ b/sentry-servlet-jakarta/src/main/java/io/sentry/servlet/jakarta/SentryServletContainerInitializer.java @@ -15,6 +15,12 @@ */ @Open public class SentryServletContainerInitializer implements ServletContainerInitializer { + + static { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-servlet-jakarta", BuildConfig.VERSION_NAME); + } + @Override public void onStartup(@Nullable Set> c, @NotNull ServletContext ctx) throws ServletException { diff --git a/sentry-servlet/src/main/java/io/sentry/servlet/SentryServletContainerInitializer.java b/sentry-servlet/src/main/java/io/sentry/servlet/SentryServletContainerInitializer.java index 26869b186e7..2eb210666e1 100644 --- a/sentry-servlet/src/main/java/io/sentry/servlet/SentryServletContainerInitializer.java +++ b/sentry-servlet/src/main/java/io/sentry/servlet/SentryServletContainerInitializer.java @@ -15,6 +15,12 @@ */ @Open public class SentryServletContainerInitializer implements ServletContainerInitializer { + + static { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-servlet", BuildConfig.VERSION_NAME); + } + @Override public void onStartup(@Nullable Set> c, @NotNull ServletContext ctx) throws ServletException { 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 9dc865ade77..170c1b69520 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 @@ -85,6 +85,11 @@ @Open public class SentryAutoConfiguration { + static { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-spring-boot-starter-jakarta", BuildConfig.VERSION_NAME); + } + /** Registers general purpose Sentry related beans. */ @Configuration(proxyBeanMethods = false) @EnableConfigurationProperties(SentryProperties.class) 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 cf55d5b1be4..8470aa8247a 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 @@ -83,6 +83,11 @@ @Open public class SentryAutoConfiguration { + static { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-spring-boot-starter", BuildConfig.VERSION_NAME); + } + /** Registers general purpose Sentry related beans. */ @Configuration(proxyBeanMethods = false) @EnableConfigurationProperties(SentryProperties.class) diff --git a/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/SentryHubRegistrar.java b/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/SentryHubRegistrar.java index 638f6a63223..76b94ce2191 100644 --- a/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/SentryHubRegistrar.java +++ b/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/SentryHubRegistrar.java @@ -20,6 +20,11 @@ @Open public class SentryHubRegistrar implements ImportBeanDefinitionRegistrar { + static { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-spring-jakarta", BuildConfig.VERSION_NAME); + } + @Override public void registerBeanDefinitions( final @NotNull AnnotationMetadata importingClassMetadata, diff --git a/sentry-spring/src/main/java/io/sentry/spring/SentryHubRegistrar.java b/sentry-spring/src/main/java/io/sentry/spring/SentryHubRegistrar.java index c02955d11b7..ed8979a558d 100644 --- a/sentry-spring/src/main/java/io/sentry/spring/SentryHubRegistrar.java +++ b/sentry-spring/src/main/java/io/sentry/spring/SentryHubRegistrar.java @@ -20,6 +20,11 @@ @Open public class SentryHubRegistrar implements ImportBeanDefinitionRegistrar { + static { + SentryIntegrationPackageStorage.getInstance() + .addPackage("maven:io.sentry:sentry-spring", BuildConfig.VERSION_NAME); + } + @Override public void registerBeanDefinitions( final @NotNull AnnotationMetadata importingClassMetadata, diff --git a/sentry/src/main/java/io/sentry/util/InitUtil.java b/sentry/src/main/java/io/sentry/util/InitUtil.java index f651383a788..416e25a5bb1 100644 --- a/sentry/src/main/java/io/sentry/util/InitUtil.java +++ b/sentry/src/main/java/io/sentry/util/InitUtil.java @@ -1,5 +1,7 @@ package io.sentry.util; +import io.sentry.SentryIntegrationPackageStorage; +import io.sentry.SentryLevel; import io.sentry.SentryOptions; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -11,6 +13,15 @@ public static boolean shouldInit( final @Nullable SentryOptions previousOptions, final @NotNull SentryOptions newOptions, final boolean isEnabled) { + if (SentryIntegrationPackageStorage.getInstance() + .checkForMixedVersions(newOptions.getLogger())) { + newOptions + .getLogger() + .log( + SentryLevel.ERROR, + "Not initializing Sentry because mixed SDK versions have been detected."); + return false; + } if (!isEnabled) { return true; } From 5c0976664288a84e5a0659929c82150c51bdf02c Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Thu, 20 Mar 2025 09:47:02 +0100 Subject: [PATCH 05/20] Add BuildConfig --- .../build.gradle.kts | 8 ++++++++ .../sentry-opentelemetry-agentless/build.gradle.kts | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/sentry-opentelemetry/sentry-opentelemetry-agentless-spring/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agentless-spring/build.gradle.kts index 1465574c653..5348a0f8fc7 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agentless-spring/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agentless-spring/build.gradle.kts @@ -1,5 +1,6 @@ plugins { `java-library` + id(Config.BuildPlugins.buildConfig) version Config.BuildPlugins.buildConfigVersion } dependencies { @@ -12,3 +13,10 @@ dependencies { api(Config.Libs.OpenTelemetry.otelExtensionAutoconfigure) api(Config.Libs.springBoot3StarterOpenTelemetry) } + +buildConfig { + useJavaOutput() + packageName("io.sentry.opentelemetry.agentless.spring") + buildConfigField("String", "SENTRY_OPENTELEMETRY_AGENTLESS_SPRING_SDK_NAME", "\"${Config.Sentry.SENTRY_OPENTELEMETRY_AGENTLESS_SPRING_SDK_NAME}\"") + buildConfigField("String", "VERSION_NAME", "\"${project.version}\"") +} diff --git a/sentry-opentelemetry/sentry-opentelemetry-agentless/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agentless/build.gradle.kts index efad0063a1b..7799b404fa3 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agentless/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agentless/build.gradle.kts @@ -1,5 +1,6 @@ plugins { `java-library` + id(Config.BuildPlugins.buildConfig) version Config.BuildPlugins.buildConfigVersion } dependencies { @@ -11,3 +12,10 @@ dependencies { api(Config.Libs.OpenTelemetry.otelSemconvIncubating) api(Config.Libs.OpenTelemetry.otelExtensionAutoconfigure) } + +buildConfig { + useJavaOutput() + packageName("io.sentry.opentelemetry.agentless") + buildConfigField("String", "SENTRY_OPENTELEMETRY_AGENTLESS_SDK_NAME", "\"${Config.Sentry.SENTRY_OPENTELEMETRY_AGENTLESS_SDK_NAME}\"") + buildConfigField("String", "VERSION_NAME", "\"${project.version}\"") +} From 735ff28ca6a3e21e39d279bfc628bc44a8fe95e1 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Thu, 20 Mar 2025 10:09:00 +0100 Subject: [PATCH 06/20] config entries for agentless module sdk names --- buildSrc/src/main/java/Config.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/buildSrc/src/main/java/Config.kt b/buildSrc/src/main/java/Config.kt index 126c14b64b6..3dd781fd4b4 100644 --- a/buildSrc/src/main/java/Config.kt +++ b/buildSrc/src/main/java/Config.kt @@ -253,6 +253,8 @@ object Config { val SENTRY_SPRING_BOOT_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.spring-boot" val SENTRY_SPRING_BOOT_JAKARTA_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.spring-boot.jakarta" val SENTRY_OPENTELEMETRY_AGENT_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.opentelemetry.agent" + val SENTRY_OPENTELEMETRY_AGENTLESS_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.opentelemetry.agentless" + val SENTRY_OPENTELEMETRY_AGENTLESS_SPRING_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.opentelemetry.agentless-spring" val SENTRY_APOLLO3_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.apollo3" val SENTRY_APOLLO4_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.apollo4" val SENTRY_APOLLO_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.apollo" From fe20321fa9581692fe39d726acb84350619a8e89 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Thu, 20 Mar 2025 11:52:33 +0100 Subject: [PATCH 07/20] Add MANIFEST.MF for JARs --- buildSrc/src/main/java/Config.kt | 8 ++++++++ sentry-graphql-22/build.gradle.kts | 13 +++++++++++++ sentry-graphql-core/build.gradle.kts | 13 +++++++++++++ sentry-graphql/build.gradle.kts | 13 +++++++++++++ sentry-jdbc/build.gradle.kts | 13 +++++++++++++ sentry-jul/build.gradle.kts | 13 +++++++++++++ sentry-kotlin-extensions/build.gradle.kts | 13 +++++++++++++ sentry-log4j2/build.gradle.kts | 13 +++++++++++++ sentry-logback/build.gradle.kts | 13 +++++++++++++ sentry-okhttp/build.gradle.kts | 13 +++++++++++++ sentry-openfeign/build.gradle.kts | 13 +++++++++++++ .../sentry-opentelemetry-agent/build.gradle.kts | 3 +++ .../build.gradle.kts | 13 +++++++++++++ .../build.gradle.kts | 13 +++++++++++++ .../sentry-opentelemetry-agentless/build.gradle.kts | 13 +++++++++++++ .../sentry-opentelemetry-bootstrap/build.gradle.kts | 13 +++++++++++++ .../sentry-opentelemetry-core/build.gradle.kts | 13 +++++++++++++ sentry-quartz/build.gradle.kts | 13 +++++++++++++ sentry-reactor/build.gradle.kts | 13 +++++++++++++ sentry-servlet-jakarta/build.gradle.kts | 13 +++++++++++++ sentry-servlet/build.gradle.kts | 13 +++++++++++++ sentry-spring-boot-jakarta/build.gradle.kts | 13 +++++++++++++ sentry-spring-boot-starter-jakarta/build.gradle.kts | 13 +++++++++++++ sentry-spring-boot-starter/build.gradle.kts | 13 +++++++++++++ sentry-spring-boot/build.gradle.kts | 13 +++++++++++++ sentry-spring-jakarta/build.gradle.kts | 13 +++++++++++++ sentry-spring/build.gradle.kts | 13 +++++++++++++ sentry/build.gradle.kts | 13 +++++++++++++ 28 files changed, 349 insertions(+) diff --git a/buildSrc/src/main/java/Config.kt b/buildSrc/src/main/java/Config.kt index 3dd781fd4b4..9c395a098e0 100644 --- a/buildSrc/src/main/java/Config.kt +++ b/buildSrc/src/main/java/Config.kt @@ -251,14 +251,21 @@ object Config { val SENTRY_SPRING_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.spring" val SENTRY_SPRING_JAKARTA_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.spring.jakarta" val SENTRY_SPRING_BOOT_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.spring-boot" + val SENTRY_SPRING_BOOT_STARTER_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.spring-boot-starter" val SENTRY_SPRING_BOOT_JAKARTA_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.spring-boot.jakarta" + val SENTRY_SPRING_BOOT_STARTER_JAKARTA_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.spring-boot-starter.jakarta" + val SENTRY_OPENTELEMETRY_BOOTSTRAP_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.opentelemetry.bootstrap" + val SENTRY_OPENTELEMETRY_CORE_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.opentelemetry.core" val SENTRY_OPENTELEMETRY_AGENT_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.opentelemetry.agent" val SENTRY_OPENTELEMETRY_AGENTLESS_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.opentelemetry.agentless" val SENTRY_OPENTELEMETRY_AGENTLESS_SPRING_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.opentelemetry.agentless-spring" + val SENTRY_OPENTELEMETRY_AGENTCUSTOMIZATION_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.opentelemetry.agentcustomization" + val SENTRY_OPENFEIGN_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.openfeign" val SENTRY_APOLLO3_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.apollo3" val SENTRY_APOLLO4_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.apollo4" val SENTRY_APOLLO_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.apollo" val SENTRY_GRAPHQL_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.graphql" + val SENTRY_GRAPHQL_CORE_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.graphql-core" val SENTRY_GRAPHQL22_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.graphql22" val SENTRY_QUARTZ_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.quartz" val SENTRY_JDBC_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.jdbc" @@ -267,6 +274,7 @@ object Config { val SENTRY_COMPOSE_HELPER_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.compose.helper" val SENTRY_OKHTTP_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.okhttp" val SENTRY_REACTOR_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.reactor" + val SENTRY_KOTLIN_EXTENSIONS_SDK_NAME = "$SENTRY_JAVA_SDK_NAME.kotlin-extensions" val group = "io.sentry" val description = "SDK for sentry.io" val versionNameProp = "versionName" diff --git a/sentry-graphql-22/build.gradle.kts b/sentry-graphql-22/build.gradle.kts index 4cae7bc7b6b..d24883b17eb 100644 --- a/sentry-graphql-22/build.gradle.kts +++ b/sentry-graphql-22/build.gradle.kts @@ -82,3 +82,16 @@ buildConfig { buildConfigField("String", "SENTRY_GRAPHQL22_SDK_NAME", "\"${Config.Sentry.SENTRY_GRAPHQL22_SDK_NAME}\"") buildConfigField("String", "VERSION_NAME", "\"${project.version}\"") } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_GRAPHQL22_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-graphql-22", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-graphql-core/build.gradle.kts b/sentry-graphql-core/build.gradle.kts index 20c06024899..fc672d325aa 100644 --- a/sentry-graphql-core/build.gradle.kts +++ b/sentry-graphql-core/build.gradle.kts @@ -81,3 +81,16 @@ buildConfig { buildConfigField("String", "SENTRY_GRAPHQL_SDK_NAME", "\"${Config.Sentry.SENTRY_GRAPHQL_SDK_NAME}\"") buildConfigField("String", "VERSION_NAME", "\"${project.version}\"") } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_GRAPHQL_CORE_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-graphql-core", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-graphql/build.gradle.kts b/sentry-graphql/build.gradle.kts index 2fec033ed7e..78115e548db 100644 --- a/sentry-graphql/build.gradle.kts +++ b/sentry-graphql/build.gradle.kts @@ -82,3 +82,16 @@ buildConfig { buildConfigField("String", "SENTRY_GRAPHQL_SDK_NAME", "\"${Config.Sentry.SENTRY_GRAPHQL_SDK_NAME}\"") buildConfigField("String", "VERSION_NAME", "\"${project.version}\"") } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_GRAPHQL_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-graphql", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-jdbc/build.gradle.kts b/sentry-jdbc/build.gradle.kts index eb4b53a962b..bfb3fecf9b7 100644 --- a/sentry-jdbc/build.gradle.kts +++ b/sentry-jdbc/build.gradle.kts @@ -76,3 +76,16 @@ buildConfig { buildConfigField("String", "SENTRY_JDBC_SDK_NAME", "\"${Config.Sentry.SENTRY_JDBC_SDK_NAME}\"") buildConfigField("String", "VERSION_NAME", "\"${project.version}\"") } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_JDBC_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-jdbc", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-jul/build.gradle.kts b/sentry-jul/build.gradle.kts index f59f14bbf41..9d22880a40c 100644 --- a/sentry-jul/build.gradle.kts +++ b/sentry-jul/build.gradle.kts @@ -81,3 +81,16 @@ tasks.withType().configureEach { option("NullAway:AnnotatedPackages", "io.sentry") } } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_JUL_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-jul", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-kotlin-extensions/build.gradle.kts b/sentry-kotlin-extensions/build.gradle.kts index 9db72d89ca1..c8aa448e511 100644 --- a/sentry-kotlin-extensions/build.gradle.kts +++ b/sentry-kotlin-extensions/build.gradle.kts @@ -69,3 +69,16 @@ tasks.withType { kotlin { explicitApi() } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_KOTLIN_EXTENSIONS_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-kotlin-extensions", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-log4j2/build.gradle.kts b/sentry-log4j2/build.gradle.kts index 1be24487c3a..4e364c159d6 100644 --- a/sentry-log4j2/build.gradle.kts +++ b/sentry-log4j2/build.gradle.kts @@ -79,3 +79,16 @@ tasks.withType().configureEach { option("NullAway:AnnotatedPackages", "io.sentry") } } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_LOG4J2_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-log4j2", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-logback/build.gradle.kts b/sentry-logback/build.gradle.kts index 48c81a452e8..ccd9848b2dc 100644 --- a/sentry-logback/build.gradle.kts +++ b/sentry-logback/build.gradle.kts @@ -76,3 +76,16 @@ tasks.withType().configureEach { option("NullAway:AnnotatedPackages", "io.sentry") } } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_LOGBACK_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-logback", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-okhttp/build.gradle.kts b/sentry-okhttp/build.gradle.kts index 71e09d8778e..ac801ced912 100644 --- a/sentry-okhttp/build.gradle.kts +++ b/sentry-okhttp/build.gradle.kts @@ -85,3 +85,16 @@ tasks.withType().configureEach { option("NullAway:AnnotatedPackages", "io.sentry") } } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_OKHTTP_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-okhttp", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-openfeign/build.gradle.kts b/sentry-openfeign/build.gradle.kts index 305b020a3b3..dbcf77f636a 100644 --- a/sentry-openfeign/build.gradle.kts +++ b/sentry-openfeign/build.gradle.kts @@ -69,3 +69,16 @@ tasks.withType().configureEach { option("NullAway:AnnotatedPackages", "io.sentry") } } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_OPENFEIGN_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-openfeign", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts index 747f6eb786c..3acd2adb237 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts @@ -146,8 +146,11 @@ tasks { attributes.put("Can-Redefine-Classes", "true") attributes.put("Can-Retransform-Classes", "true") attributes.put("Implementation-Vendor", "Sentry") + attributes.put("Implementation-Title", project.name) attributes.put("Implementation-Version", "sentry-${project.version}-otel-${Config.Libs.OpenTelemetry.otelInstrumentationVersion}") attributes.put("Sentry-Version-Name", project.version) + attributes.put("Sentry-SDK-Name", Config.Sentry.SENTRY_OPENTELEMETRY_AGENT_SDK_NAME) + attributes.put("Sentry-SDK-Package-Name", "maven:io.sentry:sentry-opentelemetry-agent") attributes.put("Sentry-Opentelemetry-SDK-Name", Config.Sentry.SENTRY_OPENTELEMETRY_AGENT_SDK_NAME) attributes.put("Sentry-Opentelemetry-Version-Name", Config.Libs.OpenTelemetry.otelVersion) attributes.put("Sentry-Opentelemetry-Javaagent-Version-Name", Config.Libs.OpenTelemetry.otelInstrumentationVersion) diff --git a/sentry-opentelemetry/sentry-opentelemetry-agentcustomization/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agentcustomization/build.gradle.kts index 97452cab953..d98c94c0f74 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agentcustomization/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agentcustomization/build.gradle.kts @@ -75,3 +75,16 @@ tasks.withType().configureEach { option("NullAway:AnnotatedPackages", "io.sentry") } } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_OPENTELEMETRY_AGENTCUSTOMIZATION_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-opentelemetry-agentcustomization", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-opentelemetry/sentry-opentelemetry-agentless-spring/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agentless-spring/build.gradle.kts index 5348a0f8fc7..804f035a3c1 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agentless-spring/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agentless-spring/build.gradle.kts @@ -20,3 +20,16 @@ buildConfig { buildConfigField("String", "SENTRY_OPENTELEMETRY_AGENTLESS_SPRING_SDK_NAME", "\"${Config.Sentry.SENTRY_OPENTELEMETRY_AGENTLESS_SPRING_SDK_NAME}\"") buildConfigField("String", "VERSION_NAME", "\"${project.version}\"") } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_OPENTELEMETRY_AGENTLESS_SPRING_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-opentelemetry-agentless-spring", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-opentelemetry/sentry-opentelemetry-agentless/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agentless/build.gradle.kts index 7799b404fa3..cab33259027 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agentless/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agentless/build.gradle.kts @@ -19,3 +19,16 @@ buildConfig { buildConfigField("String", "SENTRY_OPENTELEMETRY_AGENTLESS_SDK_NAME", "\"${Config.Sentry.SENTRY_OPENTELEMETRY_AGENTLESS_SDK_NAME}\"") buildConfigField("String", "VERSION_NAME", "\"${project.version}\"") } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_OPENTELEMETRY_AGENTLESS_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-opentelemetry-agentless", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/build.gradle.kts index 447b0823f58..c13d4597f9d 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/build.gradle.kts @@ -71,3 +71,16 @@ tasks.withType().configureEach { option("NullAway:AnnotatedPackages", "io.sentry") } } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_OPENTELEMETRY_BOOTSTRAP_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-opentelemetry-bootstrap", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-opentelemetry/sentry-opentelemetry-core/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-core/build.gradle.kts index de2143f01de..05c194d8608 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-core/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-core/build.gradle.kts @@ -80,3 +80,16 @@ tasks.withType().configureEach { option("NullAway:AnnotatedPackages", "io.sentry") } } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_OPENTELEMETRY_CORE_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-opentelemetry-core", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-quartz/build.gradle.kts b/sentry-quartz/build.gradle.kts index 605ae7a3b78..0bef5413ed9 100644 --- a/sentry-quartz/build.gradle.kts +++ b/sentry-quartz/build.gradle.kts @@ -76,3 +76,16 @@ buildConfig { buildConfigField("String", "SENTRY_QUARTZ_SDK_NAME", "\"${Config.Sentry.SENTRY_QUARTZ_SDK_NAME}\"") buildConfigField("String", "VERSION_NAME", "\"${project.version}\"") } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_QUARTZ_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-quartz", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-reactor/build.gradle.kts b/sentry-reactor/build.gradle.kts index 83e7bbdaff5..e1b917e0d1d 100644 --- a/sentry-reactor/build.gradle.kts +++ b/sentry-reactor/build.gradle.kts @@ -92,3 +92,16 @@ tasks.withType().configureEach { repositories { mavenCentral() } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_REACTOR_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-reactor", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-servlet-jakarta/build.gradle.kts b/sentry-servlet-jakarta/build.gradle.kts index 6760e00c400..45e62df8ac4 100644 --- a/sentry-servlet-jakarta/build.gradle.kts +++ b/sentry-servlet-jakarta/build.gradle.kts @@ -76,3 +76,16 @@ buildConfig { buildConfigField("String", "SENTRY_SERVLET_JAKARTA_SDK_NAME", "\"${Config.Sentry.SENTRY_SERVLET_JAKARTA_SDK_NAME}\"") buildConfigField("String", "VERSION_NAME", "\"${project.version}\"") } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_SERVLET_JAKARTA_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-servlet-jakarta", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-servlet/build.gradle.kts b/sentry-servlet/build.gradle.kts index 593f3460345..a5fab60fe89 100644 --- a/sentry-servlet/build.gradle.kts +++ b/sentry-servlet/build.gradle.kts @@ -77,3 +77,16 @@ buildConfig { buildConfigField("String", "SENTRY_SERVLET_SDK_NAME", "\"${Config.Sentry.SENTRY_SERVLET_SDK_NAME}\"") buildConfigField("String", "VERSION_NAME", "\"${project.version}\"") } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_SERVLET_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-servlet", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-spring-boot-jakarta/build.gradle.kts b/sentry-spring-boot-jakarta/build.gradle.kts index 67afbaf9b9e..db92669693b 100644 --- a/sentry-spring-boot-jakarta/build.gradle.kts +++ b/sentry-spring-boot-jakarta/build.gradle.kts @@ -133,3 +133,16 @@ tasks.withType().configureEach { option("NullAway:AnnotatedPackages", "io.sentry") } } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_SPRING_BOOT_JAKARTA_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-spring-boot-jakarta", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-spring-boot-starter-jakarta/build.gradle.kts b/sentry-spring-boot-starter-jakarta/build.gradle.kts index bbe28a05877..20077cfdffb 100644 --- a/sentry-spring-boot-starter-jakarta/build.gradle.kts +++ b/sentry-spring-boot-starter-jakarta/build.gradle.kts @@ -71,3 +71,16 @@ tasks.withType().configureEach { option("NullAway:AnnotatedPackages", "io.sentry") } } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_SPRING_BOOT_STARTER_JAKARTA_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-spring-boot-starter-jakarta", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-spring-boot-starter/build.gradle.kts b/sentry-spring-boot-starter/build.gradle.kts index d68f2c93323..e20e371ae0c 100644 --- a/sentry-spring-boot-starter/build.gradle.kts +++ b/sentry-spring-boot-starter/build.gradle.kts @@ -66,3 +66,16 @@ tasks.withType().configureEach { option("NullAway:AnnotatedPackages", "io.sentry") } } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_SPRING_BOOT_STARTER_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-spring-boot-starter", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-spring-boot/build.gradle.kts b/sentry-spring-boot/build.gradle.kts index 426cea26f62..d1bfaa43020 100644 --- a/sentry-spring-boot/build.gradle.kts +++ b/sentry-spring-boot/build.gradle.kts @@ -116,3 +116,16 @@ tasks.withType().configureEach { option("NullAway:AnnotatedPackages", "io.sentry") } } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_SPRING_BOOT_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-spring-boot", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-spring-jakarta/build.gradle.kts b/sentry-spring-jakarta/build.gradle.kts index fcae34caf8b..7257e7edc27 100644 --- a/sentry-spring-jakarta/build.gradle.kts +++ b/sentry-spring-jakarta/build.gradle.kts @@ -121,3 +121,16 @@ tasks.withType().configureEach { option("NullAway:AnnotatedPackages", "io.sentry") } } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_SPRING_JAKARTA_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-spring-jakarta", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry-spring/build.gradle.kts b/sentry-spring/build.gradle.kts index 6873c1cadaf..ad09899630c 100644 --- a/sentry-spring/build.gradle.kts +++ b/sentry-spring/build.gradle.kts @@ -104,3 +104,16 @@ tasks.withType().configureEach { option("NullAway:AnnotatedPackages", "io.sentry") } } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_SPRING_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry-spring", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} diff --git a/sentry/build.gradle.kts b/sentry/build.gradle.kts index bbe4c0dca35..8b183cf50bb 100644 --- a/sentry/build.gradle.kts +++ b/sentry/build.gradle.kts @@ -82,3 +82,16 @@ tasks.withType() { } options.errorprone.errorproneArgs.add("-XepExcludedPaths:.*/io/sentry/vendor/.*") } + +tasks.jar { + manifest { + attributes( + "Sentry-Version-Name" to project.version, + "Sentry-SDK-Name" to Config.Sentry.SENTRY_JAVA_SDK_NAME, + "Sentry-SDK-Package-Name" to "maven:io.sentry:sentry", + "Implementation-Vendor" to "Sentry", + "Implementation-Title" to project.name, + "Implementation-Version" to project.version + ) + } +} From 901830d1905a25a9fd003cf3acc5d8137ec08bd8 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Fri, 21 Mar 2025 12:36:34 +0100 Subject: [PATCH 08/20] Throw on startup; use manifests for backend; reuse code for otel --- .../core/AndroidOptionsInitializer.java | 2 + ...ryAutoConfigurationCustomizerProvider.java | 78 ++-------- .../io/sentry/DefaultVersionDetector.java | 19 +++ .../main/java/io/sentry/IVersionDetector.java | 11 ++ .../io/sentry/ManifestVersionDetector.java | 22 +++ .../java/io/sentry/NoopVersionDetector.java | 17 +++ .../main/java/io/sentry/SentryOptions.java | 13 ++ .../internal/ManifestVersionReader.java | 134 ++++++++++++++++++ .../main/java/io/sentry/util/InitUtil.java | 13 +- 9 files changed, 237 insertions(+), 72 deletions(-) create mode 100644 sentry/src/main/java/io/sentry/DefaultVersionDetector.java create mode 100644 sentry/src/main/java/io/sentry/IVersionDetector.java create mode 100644 sentry/src/main/java/io/sentry/ManifestVersionDetector.java create mode 100644 sentry/src/main/java/io/sentry/NoopVersionDetector.java create mode 100644 sentry/src/main/java/io/sentry/internal/ManifestVersionReader.java diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java index 90b6c5d741e..1a6e73274a0 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java @@ -7,6 +7,7 @@ import android.content.pm.PackageInfo; import io.sentry.DeduplicateMultithreadedEventProcessor; import io.sentry.DefaultTransactionPerformanceCollector; +import io.sentry.DefaultVersionDetector; import io.sentry.ILogger; import io.sentry.ISentryLifecycleToken; import io.sentry.ITransactionProfiler; @@ -184,6 +185,7 @@ static void initializeIntegrationsAndProcessors( } options.setModulesLoader(new AssetsModulesLoader(context, options.getLogger())); options.setDebugMetaLoader(new AssetsDebugMetaLoader(context, options.getLogger())); + options.setVersionDetector(new DefaultVersionDetector(options)); final boolean isAndroidXScrollViewAvailable = loadClass.isClassAvailable("androidx.core.view.ScrollingView", options); 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 37851c14550..e1902f1bed7 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 @@ -9,17 +9,11 @@ import io.sentry.Sentry; import io.sentry.SentryIntegrationPackageStorage; import io.sentry.SentryOptions; +import io.sentry.internal.ManifestVersionReader; import io.sentry.protocol.SdkVersion; import io.sentry.protocol.SentryPackage; -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Enumeration; import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.jar.Attributes; -import java.util.jar.Manifest; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -31,7 +25,8 @@ public final class SentryAutoConfigurationCustomizerProvider @Override public void customize(AutoConfigurationCustomizer autoConfiguration) { ensureSentryOtelStorageIsInitialized(); - final @Nullable VersionInfoHolder versionInfoHolder = createVersionInfo(); + final @Nullable ManifestVersionReader.VersionInfoHolder versionInfoHolder = + ManifestVersionReader.getInstance().readOpenTelemetryVersion(); if (isSentryAutoInitEnabled()) { Sentry.init( @@ -46,10 +41,10 @@ public void customize(AutoConfigurationCustomizer autoConfiguration) { } if (versionInfoHolder != null) { - for (SentryPackage pkg : versionInfoHolder.packages) { + for (SentryPackage pkg : versionInfoHolder.getPackages()) { SentryIntegrationPackageStorage.getInstance().addPackage(pkg.getName(), pkg.getVersion()); } - for (String integration : versionInfoHolder.integrations) { + for (String integration : versionInfoHolder.getIntegrations()) { SentryIntegrationPackageStorage.getInstance().addIntegration(integration); } } @@ -84,76 +79,21 @@ private boolean isSentryAutoInitEnabled() { } } - private @Nullable VersionInfoHolder createVersionInfo() { - VersionInfoHolder infoHolder = null; - try { - final @NotNull Enumeration resources = - ClassLoader.getSystemClassLoader().getResources("META-INF/MANIFEST.MF"); - while (resources.hasMoreElements()) { - try { - final @NotNull Manifest manifest = new Manifest(resources.nextElement().openStream()); - final @Nullable Attributes mainAttributes = manifest.getMainAttributes(); - if (mainAttributes != null) { - final @Nullable String name = mainAttributes.getValue("Sentry-Opentelemetry-SDK-Name"); - final @Nullable String version = mainAttributes.getValue("Sentry-Version-Name"); - - if (name != null && version != null) { - infoHolder = new VersionInfoHolder(); - infoHolder.sdkName = name; - infoHolder.sdkVersion = version; - infoHolder.packages.add( - new SentryPackage("maven:io.sentry:sentry-opentelemetry-agent", version)); - final @Nullable String otelVersion = - mainAttributes.getValue("Sentry-Opentelemetry-Version-Name"); - if (otelVersion != null) { - infoHolder.packages.add( - new SentryPackage("maven:io.opentelemetry:opentelemetry-sdk", otelVersion)); - infoHolder.integrations.add("OpenTelemetry"); - } - final @Nullable String otelJavaagentVersion = - mainAttributes.getValue("Sentry-Opentelemetry-Javaagent-Version-Name"); - if (otelJavaagentVersion != null) { - infoHolder.packages.add( - new SentryPackage( - "maven:io.opentelemetry.javaagent:opentelemetry-javaagent", - otelJavaagentVersion)); - infoHolder.integrations.add("OpenTelemetry-Agent"); - } - break; - } - } - } catch (Exception e) { - // ignore - } - } - } catch (IOException e) { - // ignore - } - return infoHolder; - } - private @Nullable SdkVersion createSdkVersion( final @NotNull SentryOptions sentryOptions, - final @Nullable VersionInfoHolder versionInfoHolder) { + final @Nullable ManifestVersionReader.VersionInfoHolder versionInfoHolder) { SdkVersion sdkVersion = sentryOptions.getSdkVersion(); if (versionInfoHolder != null - && versionInfoHolder.sdkName != null - && versionInfoHolder.sdkVersion != null) { + && versionInfoHolder.getSdkName() != null + && versionInfoHolder.getSdkVersion() != null) { sdkVersion = SdkVersion.updateSdkVersion( - sdkVersion, versionInfoHolder.sdkName, versionInfoHolder.sdkVersion); + sdkVersion, versionInfoHolder.getSdkName(), versionInfoHolder.getSdkVersion()); } return sdkVersion; } - private static class VersionInfoHolder { - private @Nullable String sdkName; - private @Nullable String sdkVersion; - private List packages = new ArrayList<>(); - private List integrations = new ArrayList<>(); - } - private SdkTracerProviderBuilder configureSdkTracerProvider( SdkTracerProviderBuilder tracerProvider, ConfigProperties config) { return tracerProvider diff --git a/sentry/src/main/java/io/sentry/DefaultVersionDetector.java b/sentry/src/main/java/io/sentry/DefaultVersionDetector.java new file mode 100644 index 00000000000..a68a0d1c390 --- /dev/null +++ b/sentry/src/main/java/io/sentry/DefaultVersionDetector.java @@ -0,0 +1,19 @@ +package io.sentry; + +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +@ApiStatus.Internal +public final class DefaultVersionDetector implements IVersionDetector { + + private final @NotNull SentryOptions options; + + public DefaultVersionDetector(final @NotNull SentryOptions options) { + this.options = options; + } + + @Override + public boolean checkForMixedVersions() { + return SentryIntegrationPackageStorage.getInstance().checkForMixedVersions(options.getLogger()); + } +} diff --git a/sentry/src/main/java/io/sentry/IVersionDetector.java b/sentry/src/main/java/io/sentry/IVersionDetector.java new file mode 100644 index 00000000000..fcd4890ee43 --- /dev/null +++ b/sentry/src/main/java/io/sentry/IVersionDetector.java @@ -0,0 +1,11 @@ +package io.sentry; + +public interface IVersionDetector { + + /** + * Checks whether all installed Sentry Java SDK dependencies have the same version. + * + * @return true if mixed versions have been detected, false if all versions align + */ + boolean checkForMixedVersions(); +} diff --git a/sentry/src/main/java/io/sentry/ManifestVersionDetector.java b/sentry/src/main/java/io/sentry/ManifestVersionDetector.java new file mode 100644 index 00000000000..c8eb2e732b2 --- /dev/null +++ b/sentry/src/main/java/io/sentry/ManifestVersionDetector.java @@ -0,0 +1,22 @@ +package io.sentry; + +import io.sentry.internal.ManifestVersionReader; + +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +@ApiStatus.Internal +public final class ManifestVersionDetector implements IVersionDetector { + + private final @NotNull SentryOptions options; + + public ManifestVersionDetector(final @NotNull SentryOptions options) { + this.options = options; + } + + @Override + public boolean checkForMixedVersions() { + ManifestVersionReader.getInstance().readManifestFiles(); + return SentryIntegrationPackageStorage.getInstance().checkForMixedVersions(options.getLogger()); + } +} diff --git a/sentry/src/main/java/io/sentry/NoopVersionDetector.java b/sentry/src/main/java/io/sentry/NoopVersionDetector.java new file mode 100644 index 00000000000..531dc16e318 --- /dev/null +++ b/sentry/src/main/java/io/sentry/NoopVersionDetector.java @@ -0,0 +1,17 @@ +package io.sentry; + +public final class NoopVersionDetector implements IVersionDetector { + + private static final NoopVersionDetector instance = new NoopVersionDetector(); + + private NoopVersionDetector() {} + + public static NoopVersionDetector getInstance() { + return instance; + } + + @Override + public boolean checkForMixedVersions() { + return false; + } +} diff --git a/sentry/src/main/java/io/sentry/SentryOptions.java b/sentry/src/main/java/io/sentry/SentryOptions.java index 1ddb12f0772..20c81366c5a 100644 --- a/sentry/src/main/java/io/sentry/SentryOptions.java +++ b/sentry/src/main/java/io/sentry/SentryOptions.java @@ -532,6 +532,8 @@ public class SentryOptions { private @NotNull SentryReplayOptions sessionReplay; @ApiStatus.Experimental private boolean captureOpenTelemetryEvents = false; + + private @NotNull IVersionDetector versionDetector = NoopVersionDetector.getInstance(); /** * Adds an event processor * @@ -2465,6 +2467,17 @@ public void setEnableBackpressureHandling(final boolean enableBackpressureHandli this.enableBackpressureHandling = enableBackpressureHandling; } + @ApiStatus.Internal + @NotNull + public IVersionDetector getVersionDetector() { + return versionDetector; + } + + @ApiStatus.Internal + public void setVersionDetector(final @NotNull IVersionDetector versionDetector) { + this.versionDetector = versionDetector; + } + /** * Returns the rate the profiler will sample rates at. 100 hz means 100 traces in 1 second. * diff --git a/sentry/src/main/java/io/sentry/internal/ManifestVersionReader.java b/sentry/src/main/java/io/sentry/internal/ManifestVersionReader.java new file mode 100644 index 00000000000..112cd0dd4d0 --- /dev/null +++ b/sentry/src/main/java/io/sentry/internal/ManifestVersionReader.java @@ -0,0 +1,134 @@ +package io.sentry.internal; + +import io.sentry.ISentryLifecycleToken; +import io.sentry.SentryIntegrationPackageStorage; +import io.sentry.protocol.SentryPackage; +import io.sentry.util.AutoClosableReentrantLock; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.jar.Attributes; +import java.util.jar.Manifest; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +@ApiStatus.Internal +public final class ManifestVersionReader { + private static volatile @Nullable ManifestVersionReader INSTANCE; + private static final @NotNull AutoClosableReentrantLock staticLock = + new AutoClosableReentrantLock(); + private volatile boolean hasManifestBeenRead = false; + private volatile @Nullable VersionInfoHolder versionInfo = null; + private @NotNull AutoClosableReentrantLock lock = new AutoClosableReentrantLock(); + + public static @NotNull ManifestVersionReader getInstance() { + if (INSTANCE == null) { + try (final @NotNull ISentryLifecycleToken ignored = staticLock.acquire()) { + if (INSTANCE == null) { + INSTANCE = new ManifestVersionReader(); + } + } + } + + return INSTANCE; + } + + private ManifestVersionReader() {} + + public @Nullable VersionInfoHolder readOpenTelemetryVersion() { + readManifestFiles(); + return versionInfo; + } + + public void readManifestFiles() { + if (hasManifestBeenRead) { + return; + } + + @Nullable VersionInfoHolder infoHolder = null; + try (final @NotNull ISentryLifecycleToken ignored = lock.acquire()) { + if (hasManifestBeenRead) { + return; + } + final @NotNull Enumeration resources = + ClassLoader.getSystemClassLoader().getResources("META-INF/MANIFEST.MF"); + while (resources.hasMoreElements()) { + try { + final @NotNull Manifest manifest = new Manifest(resources.nextElement().openStream()); + final @Nullable Attributes mainAttributes = manifest.getMainAttributes(); + if (mainAttributes != null) { + final @Nullable String name = mainAttributes.getValue("Sentry-Opentelemetry-SDK-Name"); + final @Nullable String version = mainAttributes.getValue("Sentry-Version-Name"); + final @Nullable String sdkName = mainAttributes.getValue("Sentry-SDK-Name"); + final @Nullable String packageName = mainAttributes.getValue("Sentry-SDK-Package-Name"); + + if (name != null && version != null) { + infoHolder = new VersionInfoHolder(); + infoHolder.sdkName = name; + infoHolder.sdkVersion = version; + infoHolder.packages.add( + new SentryPackage("maven:io.sentry:sentry-opentelemetry-agent", version)); + final @Nullable String otelVersion = + mainAttributes.getValue("Sentry-Opentelemetry-Version-Name"); + if (otelVersion != null) { + infoHolder.packages.add( + new SentryPackage("maven:io.opentelemetry:opentelemetry-sdk", otelVersion)); + infoHolder.integrations.add("OpenTelemetry"); + } + final @Nullable String otelJavaagentVersion = + mainAttributes.getValue("Sentry-Opentelemetry-Javaagent-Version-Name"); + if (otelJavaagentVersion != null) { + infoHolder.packages.add( + new SentryPackage( + "maven:io.opentelemetry.javaagent:opentelemetry-javaagent", + otelJavaagentVersion)); + infoHolder.integrations.add("OpenTelemetry-Agent"); + } + break; + } + + if (sdkName != null + && version != null + && packageName != null + && sdkName.startsWith("sentry.java")) { + SentryIntegrationPackageStorage.getInstance().addPackage(packageName, version); + } + } + } catch (Exception e) { + // ignore + } + } + } catch (IOException e) { + // ignore + } finally { + hasManifestBeenRead = true; + versionInfo = infoHolder; + } + } + + public final static class VersionInfoHolder { + private @Nullable String sdkName; + private @Nullable String sdkVersion; + private List packages = new ArrayList<>(); + private List integrations = new ArrayList<>(); + + public @Nullable String getSdkName() { + return sdkName; + } + + public @Nullable String getSdkVersion() { + return sdkVersion; + } + + public List getPackages() { + return packages; + } + + public List getIntegrations() { + return integrations; + } + } +} diff --git a/sentry/src/main/java/io/sentry/util/InitUtil.java b/sentry/src/main/java/io/sentry/util/InitUtil.java index 416e25a5bb1..4a891dd5270 100644 --- a/sentry/src/main/java/io/sentry/util/InitUtil.java +++ b/sentry/src/main/java/io/sentry/util/InitUtil.java @@ -1,5 +1,7 @@ package io.sentry.util; +import io.sentry.ManifestVersionDetector; +import io.sentry.NoopVersionDetector; import io.sentry.SentryIntegrationPackageStorage; import io.sentry.SentryLevel; import io.sentry.SentryOptions; @@ -13,14 +15,19 @@ public static boolean shouldInit( final @Nullable SentryOptions previousOptions, final @NotNull SentryOptions newOptions, final boolean isEnabled) { - if (SentryIntegrationPackageStorage.getInstance() - .checkForMixedVersions(newOptions.getLogger())) { + if (Platform.isJvm() && newOptions.getVersionDetector() instanceof NoopVersionDetector) { + newOptions.setVersionDetector(new ManifestVersionDetector(newOptions)); + } + if (newOptions.getVersionDetector().checkForMixedVersions()) { newOptions .getLogger() .log( SentryLevel.ERROR, "Not initializing Sentry because mixed SDK versions have been detected."); - return false; + final @NotNull String docsUrl = Platform.isAndroid() ? + "https://docs.sentry.io/platforms/android/troubleshooting/mixed-versions" : + "https://docs.sentry.io/platforms/java/troubleshooting/mixed-versions"; + throw new IllegalStateException("Sentry SDK has detected a mix of versions. This is not supported and likely leads to crashes. Please always use the same version of all Java SDK modules (dependencies). See " + docsUrl + " for more details."); } if (!isEnabled) { return true; From 65a7a6fabd8848df2b400c10fa3bb63057e65608 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Fri, 21 Mar 2025 11:43:19 +0000 Subject: [PATCH 09/20] Format code --- .../java/io/sentry/ManifestVersionDetector.java | 1 - .../io/sentry/internal/ManifestVersionReader.java | 2 +- sentry/src/main/java/io/sentry/util/InitUtil.java | 13 ++++++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/sentry/src/main/java/io/sentry/ManifestVersionDetector.java b/sentry/src/main/java/io/sentry/ManifestVersionDetector.java index c8eb2e732b2..08aeed2afe1 100644 --- a/sentry/src/main/java/io/sentry/ManifestVersionDetector.java +++ b/sentry/src/main/java/io/sentry/ManifestVersionDetector.java @@ -1,7 +1,6 @@ package io.sentry; import io.sentry.internal.ManifestVersionReader; - import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; diff --git a/sentry/src/main/java/io/sentry/internal/ManifestVersionReader.java b/sentry/src/main/java/io/sentry/internal/ManifestVersionReader.java index 112cd0dd4d0..beef44159d9 100644 --- a/sentry/src/main/java/io/sentry/internal/ManifestVersionReader.java +++ b/sentry/src/main/java/io/sentry/internal/ManifestVersionReader.java @@ -109,7 +109,7 @@ public void readManifestFiles() { } } - public final static class VersionInfoHolder { + public static final class VersionInfoHolder { private @Nullable String sdkName; private @Nullable String sdkVersion; private List packages = new ArrayList<>(); diff --git a/sentry/src/main/java/io/sentry/util/InitUtil.java b/sentry/src/main/java/io/sentry/util/InitUtil.java index 4a891dd5270..d558653b58a 100644 --- a/sentry/src/main/java/io/sentry/util/InitUtil.java +++ b/sentry/src/main/java/io/sentry/util/InitUtil.java @@ -2,7 +2,6 @@ import io.sentry.ManifestVersionDetector; import io.sentry.NoopVersionDetector; -import io.sentry.SentryIntegrationPackageStorage; import io.sentry.SentryLevel; import io.sentry.SentryOptions; import org.jetbrains.annotations.ApiStatus; @@ -24,10 +23,14 @@ public static boolean shouldInit( .log( SentryLevel.ERROR, "Not initializing Sentry because mixed SDK versions have been detected."); - final @NotNull String docsUrl = Platform.isAndroid() ? - "https://docs.sentry.io/platforms/android/troubleshooting/mixed-versions" : - "https://docs.sentry.io/platforms/java/troubleshooting/mixed-versions"; - throw new IllegalStateException("Sentry SDK has detected a mix of versions. This is not supported and likely leads to crashes. Please always use the same version of all Java SDK modules (dependencies). See " + docsUrl + " for more details."); + final @NotNull String docsUrl = + Platform.isAndroid() + ? "https://docs.sentry.io/platforms/android/troubleshooting/mixed-versions" + : "https://docs.sentry.io/platforms/java/troubleshooting/mixed-versions"; + throw new IllegalStateException( + "Sentry SDK has detected a mix of versions. This is not supported and likely leads to crashes. Please always use the same version of all Java SDK modules (dependencies). See " + + docsUrl + + " for more details."); } if (!isEnabled) { return true; From 954610d78d8edcd5a5f75cdecb06d2ca4e2389c9 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Mon, 24 Mar 2025 05:49:30 +0000 Subject: [PATCH 10/20] Format code --- .../java/io/sentry/android/core/AndroidOptionsInitializer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java index 4ede6cf8324..9c5b7891a73 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java @@ -7,8 +7,8 @@ import android.content.pm.PackageInfo; import io.sentry.DeduplicateMultithreadedEventProcessor; import io.sentry.DefaultCompositePerformanceCollector; -import io.sentry.IContinuousProfiler; import io.sentry.DefaultVersionDetector; +import io.sentry.IContinuousProfiler; import io.sentry.ILogger; import io.sentry.ISentryLifecycleToken; import io.sentry.ITransactionProfiler; From 8144647ff86ca8ebfc45d228c5f44737b21dc049 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Mon, 24 Mar 2025 06:57:41 +0100 Subject: [PATCH 11/20] changelog --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41f19e4a1c5..231f3f5776b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ ## Unreleased +### Behavioral Changes + +- The Sentry SDK will now crash on startup if mixed versions have been detected ([#4277](https://github.com/getsentry/sentry-java/pull/4277)) + - On `Sentry.init` / `SentryAndroid.init` the SDK now checks if all Sentry Java / Android SDK dependencies have the same version. + - While this may seem like a bad idea at first glance, mixing versions of dependencies has a very high chance of causing a crash later. We opted for a controlled crash that's hard to miss. + - Note: This detection only works for new versions of the SDK, so please take this as a reminder to check your SDK version alignment manually when upgrading the SDK to this version and then you should be good. + - The SDK will also print log messages if mixed versions have been detected at a later point. ([#4270](https://github.com/getsentry/sentry-java/pull/4270)) + - This takes care of cases missed by the startup check above due to older versions. + ### Features - Increase http timeouts from 5s to 30s to have a better chance of events being delivered without retry ([#4276](https://github.com/getsentry/sentry-java/pull/4276)) From 7d1942e5566b4a203f32bf7ee4a92771f7556c4e Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Mon, 24 Mar 2025 06:59:58 +0100 Subject: [PATCH 12/20] api --- sentry/api/sentry.api | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index f1dde7292a7..56aa5a58349 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -416,6 +416,11 @@ public final class io/sentry/DefaultSpanFactory : io/sentry/ISpanFactory { public fun createTransaction (Lio/sentry/TransactionContext;Lio/sentry/IScopes;Lio/sentry/TransactionOptions;Lio/sentry/CompositePerformanceCollector;)Lio/sentry/ITransaction; } +public final class io/sentry/DefaultVersionDetector : io/sentry/IVersionDetector { + public fun (Lio/sentry/SentryOptions;)V + public fun checkForMixedVersions ()Z +} + public final class io/sentry/DiagnosticLogger : io/sentry/ILogger { public fun (Lio/sentry/SentryOptions;Lio/sentry/ILogger;)V public fun getLogger ()Lio/sentry/ILogger; @@ -1101,6 +1106,10 @@ public abstract interface class io/sentry/ITransportFactory { public abstract fun create (Lio/sentry/SentryOptions;Lio/sentry/RequestDetails;)Lio/sentry/transport/ITransport; } +public abstract interface class io/sentry/IVersionDetector { + public abstract fun checkForMixedVersions ()Z +} + public final class io/sentry/InitPriority : java/lang/Enum { public static final field HIGH Lio/sentry/InitPriority; public static final field HIGHEST Lio/sentry/InitPriority; @@ -1250,6 +1259,11 @@ public final class io/sentry/MainEventProcessor : io/sentry/EventProcessor, java public fun process (Lio/sentry/protocol/SentryTransaction;Lio/sentry/Hint;)Lio/sentry/protocol/SentryTransaction; } +public final class io/sentry/ManifestVersionDetector : io/sentry/IVersionDetector { + public fun (Lio/sentry/SentryOptions;)V + public fun checkForMixedVersions ()Z +} + public abstract interface class io/sentry/MeasurementUnit { public static final field NONE Ljava/lang/String; public abstract fun apiName ()Ljava/lang/String; @@ -1802,6 +1816,11 @@ public final class io/sentry/NoOpTransportFactory : io/sentry/ITransportFactory public static fun getInstance ()Lio/sentry/NoOpTransportFactory; } +public final class io/sentry/NoopVersionDetector : io/sentry/IVersionDetector { + public fun checkForMixedVersions ()Z + public static fun getInstance ()Lio/sentry/NoopVersionDetector; +} + public abstract interface class io/sentry/ObjectReader : java/io/Closeable { public abstract fun beginArray ()V public abstract fun beginObject ()V @@ -3100,6 +3119,7 @@ public class io/sentry/SentryOptions { public fun getTransactionProfiler ()Lio/sentry/ITransactionProfiler; public fun getTransportFactory ()Lio/sentry/ITransportFactory; public fun getTransportGate ()Lio/sentry/transport/ITransportGate; + public fun getVersionDetector ()Lio/sentry/IVersionDetector; public final fun getViewHierarchyExporters ()Ljava/util/List; public fun isAttachServerName ()Z public fun isAttachStacktrace ()Z @@ -3234,6 +3254,7 @@ public class io/sentry/SentryOptions { public fun setTransactionProfiler (Lio/sentry/ITransactionProfiler;)V public fun setTransportFactory (Lio/sentry/ITransportFactory;)V public fun setTransportGate (Lio/sentry/transport/ITransportGate;)V + public fun setVersionDetector (Lio/sentry/IVersionDetector;)V public fun setViewHierarchyExporters (Ljava/util/List;)V } @@ -4410,6 +4431,20 @@ public final class io/sentry/instrumentation/file/SentryFileWriter : java/io/Out public fun (Ljava/lang/String;Z)V } +public final class io/sentry/internal/ManifestVersionReader { + public static fun getInstance ()Lio/sentry/internal/ManifestVersionReader; + public fun readManifestFiles ()V + public fun readOpenTelemetryVersion ()Lio/sentry/internal/ManifestVersionReader$VersionInfoHolder; +} + +public final class io/sentry/internal/ManifestVersionReader$VersionInfoHolder { + public fun ()V + public fun getIntegrations ()Ljava/util/List; + public fun getPackages ()Ljava/util/List; + public fun getSdkName ()Ljava/lang/String; + public fun getSdkVersion ()Ljava/lang/String; +} + public abstract interface class io/sentry/internal/debugmeta/IDebugMetaLoader { public abstract fun loadDebugMeta ()Ljava/util/List; } From e72dff69ed19eb24894437ebef1e0cf8dc286a76 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Mon, 24 Mar 2025 09:14:00 +0100 Subject: [PATCH 13/20] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41f19e4a1c5..53e9d522f69 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Features - Increase http timeouts from 5s to 30s to have a better chance of events being delivered without retry ([#4276](https://github.com/getsentry/sentry-java/pull/4276)) +- Add `MANIFEST.MF` to Sentry JARs ([#4272](https://github.com/getsentry/sentry-java/pull/4272)) ### Fixes From c3d50aba7cf3dcfed034e9c3cf09bfcea17f7860 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Tue, 25 Mar 2025 06:13:33 +0100 Subject: [PATCH 14/20] Remove duplicate addPackage calls --- .../io/sentry/android/fragment/FragmentLifecycleIntegration.kt | 2 -- .../io/sentry/android/navigation/SentryNavigationListener.kt | 2 -- .../main/java/io/sentry/android/replay/ReplayIntegration.kt | 2 -- .../java/io/sentry/android/timber/SentryTimberIntegration.kt | 1 - .../java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt | 2 -- .../java/io/sentry/apollo4/SentryApollo4HttpInterceptor.kt | 2 -- .../src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt | 1 - .../sentry/compose/gestures/ComposeGestureTargetLocator.java | 2 -- .../kotlin/io/sentry/compose/SentryNavigationIntegration.kt | 1 - .../main/java/io/sentry/graphql22/SentryInstrumentation.java | 2 -- .../src/main/java/io/sentry/graphql/SentryInstrumentation.java | 2 -- .../src/main/java/io/sentry/jdbc/SentryJdbcEventListener.java | 2 -- sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java | 2 -- .../src/main/java/io/sentry/log4j2/SentryAppender.java | 2 -- .../src/main/java/io/sentry/logback/SentryAppender.java | 2 -- .../src/main/java/io/sentry/okhttp/SentryOkHttpInterceptor.kt | 2 -- .../src/main/java/io/sentry/openfeign/SentryFeignClient.java | 2 -- .../src/main/java/io/sentry/quartz/SentryJobListener.java | 2 -- .../servlet/jakarta/SentryServletContainerInitializer.java | 2 -- .../io/sentry/servlet/SentryServletContainerInitializer.java | 2 -- .../io/sentry/spring/boot/jakarta/SentryAutoConfiguration.java | 3 --- .../java/io/sentry/spring/boot/SentryAutoConfiguration.java | 2 -- .../main/java/io/sentry/spring/jakarta/SentryHubRegistrar.java | 2 -- .../src/main/java/io/sentry/spring/SentryHubRegistrar.java | 2 -- 24 files changed, 46 deletions(-) diff --git a/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleIntegration.kt b/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleIntegration.kt index 047f8741734..686cd59e462 100644 --- a/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleIntegration.kt +++ b/sentry-android-fragment/src/main/java/io/sentry/android/fragment/FragmentLifecycleIntegration.kt @@ -57,8 +57,6 @@ public class FragmentLifecycleIntegration( application.registerActivityLifecycleCallbacks(this) options.logger.log(DEBUG, "FragmentLifecycleIntegration installed.") addIntegrationToSdkVersion("FragmentLifecycle") - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-android-fragment", BuildConfig.VERSION_NAME) } override fun close() { diff --git a/sentry-android-navigation/src/main/java/io/sentry/android/navigation/SentryNavigationListener.kt b/sentry-android-navigation/src/main/java/io/sentry/android/navigation/SentryNavigationListener.kt index e4adf73354c..0436a40980a 100644 --- a/sentry-android-navigation/src/main/java/io/sentry/android/navigation/SentryNavigationListener.kt +++ b/sentry-android-navigation/src/main/java/io/sentry/android/navigation/SentryNavigationListener.kt @@ -50,8 +50,6 @@ public class SentryNavigationListener @JvmOverloads constructor( init { addIntegrationToSdkVersion("NavigationListener") - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-android-navigation", BuildConfig.VERSION_NAME) } override fun onDestinationChanged( diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayIntegration.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayIntegration.kt index b24efada38b..b5f533c337b 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayIntegration.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayIntegration.kt @@ -158,8 +158,6 @@ public class ReplayIntegration( } addIntegrationToSdkVersion("Replay") - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-android-replay", BuildConfig.VERSION_NAME) finalizePreviousReplay() } diff --git a/sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberIntegration.kt b/sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberIntegration.kt index d108f9dd9b6..0659ecf9670 100644 --- a/sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberIntegration.kt +++ b/sentry-android-timber/src/main/java/io/sentry/android/timber/SentryTimberIntegration.kt @@ -35,7 +35,6 @@ public class SentryTimberIntegration( Timber.plant(tree) logger.log(SentryLevel.DEBUG, "SentryTimberIntegration installed.") - SentryIntegrationPackageStorage.getInstance().addPackage("maven:io.sentry:sentry-android-timber", VERSION_NAME) addIntegrationToSdkVersion("Timber") } diff --git a/sentry-apollo-3/src/main/java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt b/sentry-apollo-3/src/main/java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt index d9e03fb6a51..80daa25edc3 100644 --- a/sentry-apollo-3/src/main/java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt +++ b/sentry-apollo-3/src/main/java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt @@ -53,8 +53,6 @@ class SentryApollo3HttpInterceptor @JvmOverloads constructor( SentryIntegrationPackageStorage.getInstance() .addIntegration("Apollo3ClientError") } - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-apollo-3", BuildConfig.VERSION_NAME) } private val regex: Regex by lazy { diff --git a/sentry-apollo-4/src/main/java/io/sentry/apollo4/SentryApollo4HttpInterceptor.kt b/sentry-apollo-4/src/main/java/io/sentry/apollo4/SentryApollo4HttpInterceptor.kt index d4be15a81c8..dcd4b98b92b 100644 --- a/sentry-apollo-4/src/main/java/io/sentry/apollo4/SentryApollo4HttpInterceptor.kt +++ b/sentry-apollo-4/src/main/java/io/sentry/apollo4/SentryApollo4HttpInterceptor.kt @@ -52,8 +52,6 @@ class SentryApollo4HttpInterceptor @JvmOverloads constructor( SentryIntegrationPackageStorage.getInstance() .addIntegration("Apollo4ClientError") } - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-apollo-4", BuildConfig.VERSION_NAME) } private val regex: Regex by lazy { diff --git a/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt b/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt index f78352d55f0..7b89f3329c9 100644 --- a/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt +++ b/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt @@ -47,7 +47,6 @@ class SentryApolloInterceptor( init { addIntegrationToSdkVersion("Apollo") - SentryIntegrationPackageStorage.getInstance().addPackage("maven:io.sentry:sentry-apollo", BuildConfig.VERSION_NAME) } override fun interceptAsync(request: InterceptorRequest, chain: ApolloInterceptorChain, dispatcher: Executor, callBack: CallBack) { diff --git a/sentry-compose-helper/src/jvmMain/java/io/sentry/compose/gestures/ComposeGestureTargetLocator.java b/sentry-compose-helper/src/jvmMain/java/io/sentry/compose/gestures/ComposeGestureTargetLocator.java index 55e412a73f2..3c2286298f1 100644 --- a/sentry-compose-helper/src/jvmMain/java/io/sentry/compose/gestures/ComposeGestureTargetLocator.java +++ b/sentry-compose-helper/src/jvmMain/java/io/sentry/compose/gestures/ComposeGestureTargetLocator.java @@ -41,8 +41,6 @@ public final class ComposeGestureTargetLocator implements GestureTargetLocator { public ComposeGestureTargetLocator(final @NotNull ILogger logger) { this.logger = logger; SentryIntegrationPackageStorage.getInstance().addIntegration("ComposeUserInteraction"); - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-compose", BuildConfig.VERSION_NAME); } @Override diff --git a/sentry-compose/src/androidMain/kotlin/io/sentry/compose/SentryNavigationIntegration.kt b/sentry-compose/src/androidMain/kotlin/io/sentry/compose/SentryNavigationIntegration.kt index 2b163bac3dc..5145fac6d87 100644 --- a/sentry-compose/src/androidMain/kotlin/io/sentry/compose/SentryNavigationIntegration.kt +++ b/sentry-compose/src/androidMain/kotlin/io/sentry/compose/SentryNavigationIntegration.kt @@ -34,7 +34,6 @@ internal class SentryLifecycleObserver( init { addIntegrationToSdkVersion("ComposeNavigation") - SentryIntegrationPackageStorage.getInstance().addPackage("maven:io.sentry:sentry-compose", BuildConfig.VERSION_NAME) } override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { diff --git a/sentry-graphql-22/src/main/java/io/sentry/graphql22/SentryInstrumentation.java b/sentry-graphql-22/src/main/java/io/sentry/graphql22/SentryInstrumentation.java index 32f5f150d9e..264c0a99da2 100644 --- a/sentry-graphql-22/src/main/java/io/sentry/graphql22/SentryInstrumentation.java +++ b/sentry-graphql-22/src/main/java/io/sentry/graphql22/SentryInstrumentation.java @@ -94,8 +94,6 @@ public SentryInstrumentation( new SentryGraphqlInstrumentation( beforeSpan, subscriptionHandler, exceptionReporter, ignoredErrorTypes, TRACE_ORIGIN); SentryIntegrationPackageStorage.getInstance().addIntegration("GraphQL-v22"); - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-graphql-22", BuildConfig.VERSION_NAME); } /** diff --git a/sentry-graphql/src/main/java/io/sentry/graphql/SentryInstrumentation.java b/sentry-graphql/src/main/java/io/sentry/graphql/SentryInstrumentation.java index caaadf1432d..b8d35697f1f 100644 --- a/sentry-graphql/src/main/java/io/sentry/graphql/SentryInstrumentation.java +++ b/sentry-graphql/src/main/java/io/sentry/graphql/SentryInstrumentation.java @@ -91,8 +91,6 @@ public SentryInstrumentation( new SentryGraphqlInstrumentation( beforeSpan, subscriptionHandler, exceptionReporter, ignoredErrorTypes, TRACE_ORIGIN); SentryIntegrationPackageStorage.getInstance().addIntegration("GraphQL"); - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-graphql", BuildConfig.VERSION_NAME); } /** diff --git a/sentry-jdbc/src/main/java/io/sentry/jdbc/SentryJdbcEventListener.java b/sentry-jdbc/src/main/java/io/sentry/jdbc/SentryJdbcEventListener.java index 4b5c7895f46..4a9085b6dfd 100644 --- a/sentry-jdbc/src/main/java/io/sentry/jdbc/SentryJdbcEventListener.java +++ b/sentry-jdbc/src/main/java/io/sentry/jdbc/SentryJdbcEventListener.java @@ -79,8 +79,6 @@ public void onAfterAnyExecute( private void addPackageAndIntegrationInfo() { SentryIntegrationPackageStorage.getInstance().addIntegration("JDBC"); - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-jdbc", BuildConfig.VERSION_NAME); } private void applyDatabaseDetailsToSpan( diff --git a/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java b/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java index bc760489390..1ba1923f1ee 100644 --- a/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java +++ b/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java @@ -310,8 +310,6 @@ public void close() throws SecurityException { } private void addPackageAndIntegrationInfo() { - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-jul", BuildConfig.VERSION_NAME); SentryIntegrationPackageStorage.getInstance().addIntegration("Jul"); } diff --git a/sentry-log4j2/src/main/java/io/sentry/log4j2/SentryAppender.java b/sentry-log4j2/src/main/java/io/sentry/log4j2/SentryAppender.java index 5befd6fce9e..12013447758 100644 --- a/sentry-log4j2/src/main/java/io/sentry/log4j2/SentryAppender.java +++ b/sentry-log4j2/src/main/java/io/sentry/log4j2/SentryAppender.java @@ -282,8 +282,6 @@ public void append(final @NotNull LogEvent eventObject) { } private void addPackageAndIntegrationInfo() { - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-log4j2", BuildConfig.VERSION_NAME); SentryIntegrationPackageStorage.getInstance().addIntegration("Log4j"); } } diff --git a/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java b/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java index ea431929f91..7e96892d576 100644 --- a/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java +++ b/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java @@ -229,8 +229,6 @@ private String formatted(@NotNull ILoggingEvent loggingEvent) { } private void addPackageAndIntegrationInfo() { - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-logback", BuildConfig.VERSION_NAME); SentryIntegrationPackageStorage.getInstance().addIntegration("Logback"); } diff --git a/sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpInterceptor.kt b/sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpInterceptor.kt index 31b5a8997bd..c67f698ccc8 100644 --- a/sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpInterceptor.kt +++ b/sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpInterceptor.kt @@ -63,8 +63,6 @@ public open class SentryOkHttpInterceptor( init { addIntegrationToSdkVersion("OkHttp") - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-okhttp", BuildConfig.VERSION_NAME) } @Suppress("LongMethod") diff --git a/sentry-openfeign/src/main/java/io/sentry/openfeign/SentryFeignClient.java b/sentry-openfeign/src/main/java/io/sentry/openfeign/SentryFeignClient.java index 0763df595a8..35b2b5c8fdb 100644 --- a/sentry-openfeign/src/main/java/io/sentry/openfeign/SentryFeignClient.java +++ b/sentry-openfeign/src/main/java/io/sentry/openfeign/SentryFeignClient.java @@ -54,8 +54,6 @@ public SentryFeignClient( } private void addPackageAndIntegrationInfo() { - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-openfeign", BuildConfig.VERSION_NAME); addIntegrationToSdkVersion("OpenFeign"); } diff --git a/sentry-quartz/src/main/java/io/sentry/quartz/SentryJobListener.java b/sentry-quartz/src/main/java/io/sentry/quartz/SentryJobListener.java index 78323899d9d..95b69169b7e 100644 --- a/sentry-quartz/src/main/java/io/sentry/quartz/SentryJobListener.java +++ b/sentry-quartz/src/main/java/io/sentry/quartz/SentryJobListener.java @@ -41,8 +41,6 @@ public SentryJobListener() { public SentryJobListener(final @NotNull IScopes scopes) { this.scopes = Objects.requireNonNull(scopes, "scopes are required"); SentryIntegrationPackageStorage.getInstance().addIntegration("Quartz"); - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-quartz", BuildConfig.VERSION_NAME); } @Override diff --git a/sentry-servlet-jakarta/src/main/java/io/sentry/servlet/jakarta/SentryServletContainerInitializer.java b/sentry-servlet-jakarta/src/main/java/io/sentry/servlet/jakarta/SentryServletContainerInitializer.java index 602e7286124..d030fe51c9f 100644 --- a/sentry-servlet-jakarta/src/main/java/io/sentry/servlet/jakarta/SentryServletContainerInitializer.java +++ b/sentry-servlet-jakarta/src/main/java/io/sentry/servlet/jakarta/SentryServletContainerInitializer.java @@ -26,7 +26,5 @@ public void onStartup(@Nullable Set> c, @NotNull ServletContext ctx) throws ServletException { ctx.addListener(SentryServletRequestListener.class); SentryIntegrationPackageStorage.getInstance().addIntegration("Servlet-Jakarta"); - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-servlet-jakarta", BuildConfig.VERSION_NAME); } } diff --git a/sentry-servlet/src/main/java/io/sentry/servlet/SentryServletContainerInitializer.java b/sentry-servlet/src/main/java/io/sentry/servlet/SentryServletContainerInitializer.java index 2eb210666e1..71c3e7a9443 100644 --- a/sentry-servlet/src/main/java/io/sentry/servlet/SentryServletContainerInitializer.java +++ b/sentry-servlet/src/main/java/io/sentry/servlet/SentryServletContainerInitializer.java @@ -26,7 +26,5 @@ public void onStartup(@Nullable Set> c, @NotNull ServletContext ctx) throws ServletException { ctx.addListener(SentryServletRequestListener.class); SentryIntegrationPackageStorage.getInstance().addIntegration("Servlet"); - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-servlet", BuildConfig.VERSION_NAME); } } 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 170c1b69520..761872ffb66 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 @@ -466,9 +466,6 @@ static class ApacheHttpClientTransportFactoryAutoconfiguration { } private static void addPackageAndIntegrationInfo() { - SentryIntegrationPackageStorage.getInstance() - .addPackage( - "maven:io.sentry:sentry-spring-boot-starter-jakarta", BuildConfig.VERSION_NAME); SentryIntegrationPackageStorage.getInstance().addIntegration("SpringBoot3"); } } 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 8470aa8247a..bde822a1f86 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 @@ -436,8 +436,6 @@ static class ApacheHttpClientTransportFactoryAutoconfiguration { } private static void addPackageAndIntegrationInfo() { - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-spring-boot-starter", BuildConfig.VERSION_NAME); SentryIntegrationPackageStorage.getInstance().addIntegration("SpringBoot"); } } diff --git a/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/SentryHubRegistrar.java b/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/SentryHubRegistrar.java index 76b94ce2191..cca74ae2a2d 100644 --- a/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/SentryHubRegistrar.java +++ b/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/SentryHubRegistrar.java @@ -98,8 +98,6 @@ private void registerSentryExceptionResolver( } private static void addPackageAndIntegrationInfo() { - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-spring-jakarta", BuildConfig.VERSION_NAME); SentryIntegrationPackageStorage.getInstance().addIntegration("Spring6"); } } diff --git a/sentry-spring/src/main/java/io/sentry/spring/SentryHubRegistrar.java b/sentry-spring/src/main/java/io/sentry/spring/SentryHubRegistrar.java index ed8979a558d..14a6776e3ee 100644 --- a/sentry-spring/src/main/java/io/sentry/spring/SentryHubRegistrar.java +++ b/sentry-spring/src/main/java/io/sentry/spring/SentryHubRegistrar.java @@ -98,8 +98,6 @@ private void registerSentryExceptionResolver( } private static void addPackageAndIntegrationInfo() { - SentryIntegrationPackageStorage.getInstance() - .addPackage("maven:io.sentry:sentry-spring", BuildConfig.VERSION_NAME); SentryIntegrationPackageStorage.getInstance().addIntegration("Spring"); } } From 818538827d7b96e3bae75f43da2a271b96cd869e Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Tue, 25 Mar 2025 09:11:03 +0100 Subject: [PATCH 15/20] remove test assertion for package --- .../java/io/sentry/apollo3/SentryApollo3InterceptorTest.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/sentry-apollo-3/src/test/java/io/sentry/apollo3/SentryApollo3InterceptorTest.kt b/sentry-apollo-3/src/test/java/io/sentry/apollo3/SentryApollo3InterceptorTest.kt index 03072ae8b5a..2ab7c29459f 100644 --- a/sentry-apollo-3/src/test/java/io/sentry/apollo3/SentryApollo3InterceptorTest.kt +++ b/sentry-apollo-3/src/test/java/io/sentry/apollo3/SentryApollo3InterceptorTest.kt @@ -323,9 +323,6 @@ class SentryApollo3InterceptorTest { fun `sets SDKVersion Info`() { assertNotNull(fixture.scopes.options.sdkVersion) assert(fixture.scopes.options.sdkVersion!!.integrationSet.contains("Apollo3")) - val packageInfo = fixture.scopes.options.sdkVersion!!.packageSet.firstOrNull { pkg -> pkg.name == "maven:io.sentry:sentry-apollo-3" } - assertNotNull(packageInfo) - assert(packageInfo.version == BuildConfig.VERSION_NAME) } @Test From f8ba72d2aaaa4fd44723d81e5f2e7a46eed5d2d2 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Wed, 26 Mar 2025 06:03:02 +0100 Subject: [PATCH 16/20] Introduce fatal SDK logger --- .../android/core/AndroidFatalLogger.java | 68 +++++++++++++++++++ .../core/AndroidOptionsInitializer.java | 1 + .../io/sentry/DefaultVersionDetector.java | 2 +- .../io/sentry/ManifestVersionDetector.java | 2 +- sentry/src/main/java/io/sentry/Sentry.java | 7 ++ .../main/java/io/sentry/SentryOptions.java | 22 ++++++ 6 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 sentry-android-core/src/main/java/io/sentry/android/core/AndroidFatalLogger.java diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidFatalLogger.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidFatalLogger.java new file mode 100644 index 00000000000..0a2ebad384b --- /dev/null +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidFatalLogger.java @@ -0,0 +1,68 @@ +package io.sentry.android.core; + +import android.util.Log; + +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import io.sentry.ILogger; +import io.sentry.SentryLevel; + +@ApiStatus.Internal +public final class AndroidFatalLogger implements ILogger { + + private final @NotNull String tag; + + public AndroidFatalLogger() { + this("Sentry"); + } + + public AndroidFatalLogger(final @NotNull String tag) { + this.tag = tag; + } + + @SuppressWarnings("AnnotateFormatMethod") + @Override + public void log( + final @NotNull SentryLevel level, + final @NotNull String message, + final @Nullable Object... args) { + if (args == null || args.length == 0) { + Log.println(toLogcatLevel(level), tag, message); + } else { + Log.println(toLogcatLevel(level), tag, String.format(message, args)); + } + } + + @SuppressWarnings("AnnotateFormatMethod") + @Override + public void log( + final @NotNull SentryLevel level, + final @Nullable Throwable throwable, + final @NotNull String message, + final @Nullable Object... args) { + if (args == null || args.length == 0) { + log(level, message, throwable); + } else { + log(level, String.format(message, args), throwable); + } + } + + @Override + public void log( + final @NotNull SentryLevel level, + final @NotNull String message, + final @Nullable Throwable throwable) { + Log.wtf(tag, message, throwable); + } + + @Override + public boolean isEnabled(@Nullable SentryLevel level) { + return true; + } + + private int toLogcatLevel(final @NotNull SentryLevel sentryLevel) { + return Log.ASSERT; + } +} diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java index 9c5b7891a73..8230157a753 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java @@ -110,6 +110,7 @@ static void loadDefaultAndMetadataOptions( // Firstly set the logger, if `debug=true` configured, logging can start asap. options.setLogger(logger); + options.setFatalLogger(new AndroidFatalLogger()); options.setDefaultScopeType(ScopeType.CURRENT); options.setOpenTelemetryMode(SentryOpenTelemetryMode.OFF); diff --git a/sentry/src/main/java/io/sentry/DefaultVersionDetector.java b/sentry/src/main/java/io/sentry/DefaultVersionDetector.java index a68a0d1c390..17f53573761 100644 --- a/sentry/src/main/java/io/sentry/DefaultVersionDetector.java +++ b/sentry/src/main/java/io/sentry/DefaultVersionDetector.java @@ -14,6 +14,6 @@ public DefaultVersionDetector(final @NotNull SentryOptions options) { @Override public boolean checkForMixedVersions() { - return SentryIntegrationPackageStorage.getInstance().checkForMixedVersions(options.getLogger()); + return SentryIntegrationPackageStorage.getInstance().checkForMixedVersions(options.getFatalLogger()); } } diff --git a/sentry/src/main/java/io/sentry/ManifestVersionDetector.java b/sentry/src/main/java/io/sentry/ManifestVersionDetector.java index 08aeed2afe1..75a54a607ac 100644 --- a/sentry/src/main/java/io/sentry/ManifestVersionDetector.java +++ b/sentry/src/main/java/io/sentry/ManifestVersionDetector.java @@ -16,6 +16,6 @@ public ManifestVersionDetector(final @NotNull SentryOptions options) { @Override public boolean checkForMixedVersions() { ManifestVersionReader.getInstance().readManifestFiles(); - return SentryIntegrationPackageStorage.getInstance().checkForMixedVersions(options.getLogger()); + return SentryIntegrationPackageStorage.getInstance().checkForMixedVersions(options.getFatalLogger()); } } diff --git a/sentry/src/main/java/io/sentry/Sentry.java b/sentry/src/main/java/io/sentry/Sentry.java index 6bb0d07b3e5..dc9de2a203d 100644 --- a/sentry/src/main/java/io/sentry/Sentry.java +++ b/sentry/src/main/java/io/sentry/Sentry.java @@ -292,6 +292,7 @@ private static void init(final @NotNull SentryOptions options, final boolean glo .getLogger() .log(SentryLevel.INFO, "GlobalHubMode: '%s'", String.valueOf(globalHubModeToUse)); Sentry.globalHubMode = globalHubModeToUse; + initFatalLogger(options); final boolean shouldInit = InitUtil.shouldInit(globalScope.getOptions(), options, isEnabled()); if (shouldInit) { @@ -392,6 +393,12 @@ private static void initLogger(final @NotNull SentryOptions options) { } } + private static void initFatalLogger(final @NotNull SentryOptions options) { + if (options.getFatalLogger() instanceof NoOpLogger) { + options.setFatalLogger(new SystemOutLogger()); + } + } + private static void initScopesStorage(SentryOptions options) { getScopesStorage().close(); if (SentryOpenTelemetryMode.OFF == options.getOpenTelemetryMode()) { diff --git a/sentry/src/main/java/io/sentry/SentryOptions.java b/sentry/src/main/java/io/sentry/SentryOptions.java index 85cd44e90ef..2a2009045c1 100644 --- a/sentry/src/main/java/io/sentry/SentryOptions.java +++ b/sentry/src/main/java/io/sentry/SentryOptions.java @@ -126,6 +126,8 @@ public class SentryOptions { /** Logger interface to log useful debugging information if debug is enabled */ private @NotNull ILogger logger = NoOpLogger.getInstance(); + @ApiStatus.Experimental + private @NotNull ILogger fatalLogger = NoOpLogger.getInstance(); /** minimum LogLevel to be used if debug is enabled */ private @NotNull SentryLevel diagnosticLevel = DEFAULT_DIAGNOSTIC_LEVEL; @@ -646,6 +648,26 @@ public void setLogger(final @Nullable ILogger logger) { this.logger = (logger == null) ? NoOpLogger.getInstance() : new DiagnosticLogger(this, logger); } + /** + * Returns the Logger interface for logging important SDK messages + * + * @return the logger for fatal SDK messages + */ + @ApiStatus.Experimental + public @NotNull ILogger getFatalLogger() { + return fatalLogger; + } + + /** + * Sets the Logger interface for important SDK messages. If null, logger will be NoOp + * + * @param logger the logger for fatal SDK messages + */ + @ApiStatus.Experimental + public void setFatalLogger(final @Nullable ILogger logger) { + this.fatalLogger = (logger == null) ? NoOpLogger.getInstance() : logger; + } + /** * Returns the minimum LogLevel * From e4d522fc69022a258c74319f62e8c9ab2bb16605 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Thu, 27 Mar 2025 08:55:20 +0100 Subject: [PATCH 17/20] Use Implementation-Version as raw version --- .../sentry-opentelemetry-agent/build.gradle.kts | 4 ++-- .../main/java/io/sentry/internal/ManifestVersionReader.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts index 3acd2adb237..b24377f1142 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts @@ -147,8 +147,8 @@ tasks { attributes.put("Can-Retransform-Classes", "true") attributes.put("Implementation-Vendor", "Sentry") attributes.put("Implementation-Title", project.name) - attributes.put("Implementation-Version", "sentry-${project.version}-otel-${Config.Libs.OpenTelemetry.otelInstrumentationVersion}") - attributes.put("Sentry-Version-Name", project.version) + attributes.put("Implementation-Version", project.version) + attributes.put("Sentry-Version-Name", "sentry-${project.version}-otel-${Config.Libs.OpenTelemetry.otelInstrumentationVersion}") attributes.put("Sentry-SDK-Name", Config.Sentry.SENTRY_OPENTELEMETRY_AGENT_SDK_NAME) attributes.put("Sentry-SDK-Package-Name", "maven:io.sentry:sentry-opentelemetry-agent") attributes.put("Sentry-Opentelemetry-SDK-Name", Config.Sentry.SENTRY_OPENTELEMETRY_AGENT_SDK_NAME) diff --git a/sentry/src/main/java/io/sentry/internal/ManifestVersionReader.java b/sentry/src/main/java/io/sentry/internal/ManifestVersionReader.java index beef44159d9..a9fe2a54702 100644 --- a/sentry/src/main/java/io/sentry/internal/ManifestVersionReader.java +++ b/sentry/src/main/java/io/sentry/internal/ManifestVersionReader.java @@ -61,7 +61,7 @@ public void readManifestFiles() { final @Nullable Attributes mainAttributes = manifest.getMainAttributes(); if (mainAttributes != null) { final @Nullable String name = mainAttributes.getValue("Sentry-Opentelemetry-SDK-Name"); - final @Nullable String version = mainAttributes.getValue("Sentry-Version-Name"); + final @Nullable String version = mainAttributes.getValue("Implementation-Version"); final @Nullable String sdkName = mainAttributes.getValue("Sentry-SDK-Name"); final @Nullable String packageName = mainAttributes.getValue("Sentry-SDK-Package-Name"); From 7def3ea808ad952c7fc65ad7478b2bd173b56822 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Thu, 27 Mar 2025 11:15:46 +0100 Subject: [PATCH 18/20] Add tests for checking mixed versions --- .../SentryIntegrationPackageStorageTest.kt | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 sentry/src/test/java/io/sentry/SentryIntegrationPackageStorageTest.kt diff --git a/sentry/src/test/java/io/sentry/SentryIntegrationPackageStorageTest.kt b/sentry/src/test/java/io/sentry/SentryIntegrationPackageStorageTest.kt new file mode 100644 index 00000000000..6fdcef38c2c --- /dev/null +++ b/sentry/src/test/java/io/sentry/SentryIntegrationPackageStorageTest.kt @@ -0,0 +1,69 @@ +package io.sentry + +import kotlin.test.Test +import kotlin.test.assertFalse +import kotlin.test.assertTrue + +class SentryIntegrationPackageStorageTest { + + @Test + fun `same package version is OK`() { + val storage = SentryIntegrationPackageStorage.getInstance() + storage.clearStorage() + + storage.addPackage("maven:io.sentry:sentry", BuildConfig.VERSION_NAME) + storage.addPackage("maven:io.sentry:sentry-logback", BuildConfig.VERSION_NAME) + + assertFalse(storage.checkForMixedVersions(SystemOutLogger())) + } + + @Test + fun `checking twice works`() { + val storage = SentryIntegrationPackageStorage.getInstance() + storage.clearStorage() + + storage.addPackage("maven:io.sentry:sentry", BuildConfig.VERSION_NAME) + storage.addPackage("maven:io.sentry:sentry-logback", BuildConfig.VERSION_NAME) + + assertFalse(storage.checkForMixedVersions(SystemOutLogger())) + assertFalse(storage.checkForMixedVersions(SystemOutLogger())) + } + + @Test + fun `checking twice with changes works`() { + val storage = SentryIntegrationPackageStorage.getInstance() + storage.clearStorage() + + storage.addPackage("maven:io.sentry:sentry", BuildConfig.VERSION_NAME) + storage.addPackage("maven:io.sentry:sentry-logback", BuildConfig.VERSION_NAME) + + assertFalse(storage.checkForMixedVersions(SystemOutLogger())) + + storage.addPackage("maven:io.sentry:sentry-spring", "8.0.0") + assertTrue(storage.checkForMixedVersions(SystemOutLogger())) + } + + @Test + fun `mixed package version is not OK`() { + val storage = SentryIntegrationPackageStorage.getInstance() + storage.clearStorage() + + storage.addPackage("maven:io.sentry:sentry", BuildConfig.VERSION_NAME) + storage.addPackage("maven:io.sentry:sentry-logback", "8.0.0") + + assertTrue(storage.checkForMixedVersions(SystemOutLogger())) + } + + @Test + fun `only java sdk modules are checked`() { + val storage = SentryIntegrationPackageStorage.getInstance() + storage.clearStorage() + + storage.addPackage("maven:io.sentry:sentry", BuildConfig.VERSION_NAME) + storage.addPackage("maven:io.sentry:sentry-logback", BuildConfig.VERSION_NAME) + storage.addPackage("maven:io.sentry.other:sentry-other", "1.0.0") + storage.addPackage("maven:io.opentelemetry.javaagent:opentelemetry-javaagent", "2.0.0") + + assertFalse(storage.checkForMixedVersions(SystemOutLogger())) + } +} From 3b13d0d49fc2b8dff0eefd897d57cd2910f29530 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Thu, 27 Mar 2025 10:19:49 +0000 Subject: [PATCH 19/20] Format code --- .../java/io/sentry/android/core/AndroidFatalLogger.java | 6 ++---- sentry/src/main/java/io/sentry/DefaultVersionDetector.java | 3 ++- sentry/src/main/java/io/sentry/ManifestVersionDetector.java | 3 ++- sentry/src/main/java/io/sentry/SentryOptions.java | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidFatalLogger.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidFatalLogger.java index 0a2ebad384b..76d6ba99784 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidFatalLogger.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidFatalLogger.java @@ -1,14 +1,12 @@ package io.sentry.android.core; import android.util.Log; - +import io.sentry.ILogger; +import io.sentry.SentryLevel; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import io.sentry.ILogger; -import io.sentry.SentryLevel; - @ApiStatus.Internal public final class AndroidFatalLogger implements ILogger { diff --git a/sentry/src/main/java/io/sentry/DefaultVersionDetector.java b/sentry/src/main/java/io/sentry/DefaultVersionDetector.java index 17f53573761..220e7ac9b38 100644 --- a/sentry/src/main/java/io/sentry/DefaultVersionDetector.java +++ b/sentry/src/main/java/io/sentry/DefaultVersionDetector.java @@ -14,6 +14,7 @@ public DefaultVersionDetector(final @NotNull SentryOptions options) { @Override public boolean checkForMixedVersions() { - return SentryIntegrationPackageStorage.getInstance().checkForMixedVersions(options.getFatalLogger()); + return SentryIntegrationPackageStorage.getInstance() + .checkForMixedVersions(options.getFatalLogger()); } } diff --git a/sentry/src/main/java/io/sentry/ManifestVersionDetector.java b/sentry/src/main/java/io/sentry/ManifestVersionDetector.java index 75a54a607ac..9bc99bc5c08 100644 --- a/sentry/src/main/java/io/sentry/ManifestVersionDetector.java +++ b/sentry/src/main/java/io/sentry/ManifestVersionDetector.java @@ -16,6 +16,7 @@ public ManifestVersionDetector(final @NotNull SentryOptions options) { @Override public boolean checkForMixedVersions() { ManifestVersionReader.getInstance().readManifestFiles(); - return SentryIntegrationPackageStorage.getInstance().checkForMixedVersions(options.getFatalLogger()); + return SentryIntegrationPackageStorage.getInstance() + .checkForMixedVersions(options.getFatalLogger()); } } diff --git a/sentry/src/main/java/io/sentry/SentryOptions.java b/sentry/src/main/java/io/sentry/SentryOptions.java index 2a2009045c1..9f55d24f740 100644 --- a/sentry/src/main/java/io/sentry/SentryOptions.java +++ b/sentry/src/main/java/io/sentry/SentryOptions.java @@ -126,8 +126,8 @@ public class SentryOptions { /** Logger interface to log useful debugging information if debug is enabled */ private @NotNull ILogger logger = NoOpLogger.getInstance(); - @ApiStatus.Experimental - private @NotNull ILogger fatalLogger = NoOpLogger.getInstance(); + + @ApiStatus.Experimental private @NotNull ILogger fatalLogger = NoOpLogger.getInstance(); /** minimum LogLevel to be used if debug is enabled */ private @NotNull SentryLevel diagnosticLevel = DEFAULT_DIAGNOSTIC_LEVEL; From 868ed6b76b64d2e7c79e089523645bbfecd2455e Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Thu, 27 Mar 2025 15:22:42 +0100 Subject: [PATCH 20/20] clear storage after test to not affect other tests --- .../java/io/sentry/SentryIntegrationPackageStorageTest.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sentry/src/test/java/io/sentry/SentryIntegrationPackageStorageTest.kt b/sentry/src/test/java/io/sentry/SentryIntegrationPackageStorageTest.kt index 6fdcef38c2c..739c2c6c9ee 100644 --- a/sentry/src/test/java/io/sentry/SentryIntegrationPackageStorageTest.kt +++ b/sentry/src/test/java/io/sentry/SentryIntegrationPackageStorageTest.kt @@ -1,11 +1,17 @@ package io.sentry +import kotlin.test.AfterTest import kotlin.test.Test import kotlin.test.assertFalse import kotlin.test.assertTrue class SentryIntegrationPackageStorageTest { + @AfterTest + fun teardown() { + SentryIntegrationPackageStorage.getInstance().clearStorage() + } + @Test fun `same package version is OK`() { val storage = SentryIntegrationPackageStorage.getInstance()