diff --git a/CHANGELOG.md b/CHANGELOG.md
index b859654f3d1..5c6f3a0bf0b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,7 +12,7 @@
- Add init priority settings ([#3674](https://github.com/getsentry/sentry-java/pull/3674))
- You may now set `forceInit=true` (`force-init` for `.properties` files) to ensure a call to Sentry.init / SentryAndroid.init takes effect
-- Add force init option to Android Manifest
+- Add force init option to Android Manifest ([#3675](https://github.com/getsentry/sentry-java/pull/3675))
- Use `` to ensure Sentry Android auto init is not easily overwritten
### Fixes
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 c52b4706f2a..d6afd514e63 100644
--- a/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java
+++ b/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java
@@ -6,6 +6,7 @@
import com.jakewharton.nopen.annotation.Open;
import io.sentry.Breadcrumb;
import io.sentry.Hint;
+import io.sentry.InitPriority;
import io.sentry.ScopesAdapter;
import io.sentry.Sentry;
import io.sentry.SentryEvent;
@@ -69,11 +70,10 @@ public SentryHandler(final @NotNull SentryOptions options) {
if (configureFromLogManager) {
retrieveProperties();
}
- if (!Sentry.isEnabled()) {
- options.setEnableExternalConfiguration(true);
- options.setSdkVersion(createSdkVersion(options));
- Sentry.init(options);
- }
+ options.setEnableExternalConfiguration(true);
+ options.setInitPriority(InitPriority.LOWEST);
+ options.setSdkVersion(createSdkVersion(options));
+ Sentry.init(options);
addPackageAndIntegrationInfo();
}
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 4ee07ab7b92..35b9d694192 100644
--- a/sentry-log4j2/src/main/java/io/sentry/log4j2/SentryAppender.java
+++ b/sentry-log4j2/src/main/java/io/sentry/log4j2/SentryAppender.java
@@ -9,6 +9,7 @@
import io.sentry.Hint;
import io.sentry.IScopes;
import io.sentry.ITransportFactory;
+import io.sentry.InitPriority;
import io.sentry.ScopesAdapter;
import io.sentry.Sentry;
import io.sentry.SentryEvent;
@@ -116,28 +117,27 @@ public SentryAppender(
@Override
public void start() {
- if (!Sentry.isEnabled()) {
- try {
- Sentry.init(
- options -> {
- options.setEnableExternalConfiguration(true);
- options.setDsn(dsn);
- if (debug != null) {
- options.setDebug(debug);
+ try {
+ Sentry.init(
+ options -> {
+ options.setEnableExternalConfiguration(true);
+ options.setInitPriority(InitPriority.LOWEST);
+ options.setDsn(dsn);
+ if (debug != null) {
+ options.setDebug(debug);
+ }
+ options.setSentryClientName(
+ BuildConfig.SENTRY_LOG4J2_SDK_NAME + "/" + BuildConfig.VERSION_NAME);
+ options.setSdkVersion(createSdkVersion(options));
+ if (contextTags != null) {
+ for (final String contextTag : contextTags) {
+ options.addContextTag(contextTag);
}
- options.setSentryClientName(
- BuildConfig.SENTRY_LOG4J2_SDK_NAME + "/" + BuildConfig.VERSION_NAME);
- options.setSdkVersion(createSdkVersion(options));
- if (contextTags != null) {
- for (final String contextTag : contextTags) {
- options.addContextTag(contextTag);
- }
- }
- Optional.ofNullable(transportFactory).ifPresent(options::setTransportFactory);
- });
- } catch (IllegalArgumentException e) {
- LOGGER.warn("Failed to init Sentry during appender initialization: " + e.getMessage());
- }
+ }
+ Optional.ofNullable(transportFactory).ifPresent(options::setTransportFactory);
+ });
+ } catch (IllegalArgumentException e) {
+ LOGGER.warn("Failed to init Sentry during appender initialization: " + e.getMessage());
}
addPackageAndIntegrationInfo();
super.start();
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 56db0b4dbcc..77ce05f47f3 100644
--- a/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java
+++ b/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java
@@ -13,6 +13,7 @@
import io.sentry.DateUtils;
import io.sentry.Hint;
import io.sentry.ITransportFactory;
+import io.sentry.InitPriority;
import io.sentry.ScopesAdapter;
import io.sentry.Sentry;
import io.sentry.SentryEvent;
@@ -49,24 +50,22 @@ public class SentryAppender extends UnsynchronizedAppenderBase {
@Override
public void start() {
- // NOTE: logback.xml properties will only be applied if the SDK has not yet been initialized
- if (!Sentry.isEnabled()) {
- if (options.getDsn() == null || !options.getDsn().endsWith("_IS_UNDEFINED")) {
- options.setEnableExternalConfiguration(true);
- options.setSentryClientName(
- BuildConfig.SENTRY_LOGBACK_SDK_NAME + "/" + BuildConfig.VERSION_NAME);
- options.setSdkVersion(createSdkVersion(options));
- Optional.ofNullable(transportFactory).ifPresent(options::setTransportFactory);
- try {
- Sentry.init(options);
- } catch (IllegalArgumentException e) {
- addWarn("Failed to init Sentry during appender initialization: " + e.getMessage());
- }
- } else {
- options
- .getLogger()
- .log(SentryLevel.WARNING, "DSN is null. SentryAppender is not being initialized");
+ if (options.getDsn() == null || !options.getDsn().endsWith("_IS_UNDEFINED")) {
+ options.setEnableExternalConfiguration(true);
+ options.setInitPriority(InitPriority.LOWEST);
+ options.setSentryClientName(
+ BuildConfig.SENTRY_LOGBACK_SDK_NAME + "/" + BuildConfig.VERSION_NAME);
+ options.setSdkVersion(createSdkVersion(options));
+ Optional.ofNullable(transportFactory).ifPresent(options::setTransportFactory);
+ try {
+ Sentry.init(options);
+ } catch (IllegalArgumentException e) {
+ addWarn("Failed to init Sentry during appender initialization: " + e.getMessage());
}
+ } else if (!Sentry.isEnabled()) {
+ options
+ .getLogger()
+ .log(SentryLevel.WARNING, "DSN is null. SentryAppender is not being initialized");
}
addPackageAndIntegrationInfo();
super.start();
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 019541e7e3a..581b0fd12ae 100644
--- a/sentry-opentelemetry/sentry-opentelemetry-agentcustomization/src/main/java/io/sentry/opentelemetry/SentryAutoConfigurationCustomizerProvider.java
+++ b/sentry-opentelemetry/sentry-opentelemetry-agentcustomization/src/main/java/io/sentry/opentelemetry/SentryAutoConfigurationCustomizerProvider.java
@@ -6,6 +6,7 @@
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
+import io.sentry.InitPriority;
import io.sentry.Sentry;
import io.sentry.SentryIntegrationPackageStorage;
import io.sentry.SentryOptions;
@@ -50,6 +51,7 @@ public void customize(AutoConfigurationCustomizer autoConfiguration) {
Sentry.init(
options -> {
options.setEnableExternalConfiguration(true);
+ options.setInitPriority(InitPriority.HIGH);
options.setIgnoredSpanOrigins(SpanUtils.ignoredSpanOriginsForOpenTelemetry());
options.setSpanFactory(spanFactory);
final @Nullable SdkVersion sdkVersion = createSdkVersion(options, versionInfoHolder);
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 f38682cf6dd..51ce2e4f785 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
@@ -5,6 +5,7 @@
import io.sentry.EventProcessor;
import io.sentry.IScopes;
import io.sentry.ITransportFactory;
+import io.sentry.InitPriority;
import io.sentry.Integration;
import io.sentry.ScopesAdapter;
import io.sentry.Sentry;
@@ -133,6 +134,7 @@ static class HubConfiguration {
options.setSentryClientName(
BuildConfig.SENTRY_SPRING_BOOT_JAKARTA_SDK_NAME + "/" + BuildConfig.VERSION_NAME);
options.setSdkVersion(createSdkVersion(options));
+ options.setInitPriority(InitPriority.LOW);
addPackageAndIntegrationInfo();
// Spring Boot sets ignored exceptions in runtime using reflection - where the generic
// information is lost
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 62f8e8457df..39eb420793c 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
@@ -5,6 +5,7 @@
import io.sentry.EventProcessor;
import io.sentry.IScopes;
import io.sentry.ITransportFactory;
+import io.sentry.InitPriority;
import io.sentry.Integration;
import io.sentry.ScopesAdapter;
import io.sentry.Sentry;
@@ -131,6 +132,7 @@ static class HubConfiguration {
options.setSentryClientName(
BuildConfig.SENTRY_SPRING_BOOT_SDK_NAME + "/" + BuildConfig.VERSION_NAME);
options.setSdkVersion(createSdkVersion(options));
+ options.setInitPriority(InitPriority.LOW);
addPackageAndIntegrationInfo();
// Spring Boot sets ignored exceptions in runtime using reflection - where the generic
// information is lost
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 9598f0c926a..638f6a63223 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
@@ -1,6 +1,7 @@
package io.sentry.spring.jakarta;
import com.jakewharton.nopen.annotation.Open;
+import io.sentry.InitPriority;
import io.sentry.ScopesAdapter;
import io.sentry.SentryIntegrationPackageStorage;
import io.sentry.SentryOptions;
@@ -46,6 +47,7 @@ private void registerSentryOptions(
builder.addPropertyValue("enableExternalConfiguration", true);
builder.addPropertyValue("sentryClientName", BuildConfig.SENTRY_SPRING_JAKARTA_SDK_NAME);
builder.addPropertyValue("sdkVersion", createSdkVersion());
+ builder.addPropertyValue("initPriority", InitPriority.LOW);
addPackageAndIntegrationInfo();
if (annotationAttributes.containsKey("sendDefaultPii")) {
builder.addPropertyValue("sendDefaultPii", annotationAttributes.getBoolean("sendDefaultPii"));
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 195a88e277c..c02955d11b7 100644
--- a/sentry-spring/src/main/java/io/sentry/spring/SentryHubRegistrar.java
+++ b/sentry-spring/src/main/java/io/sentry/spring/SentryHubRegistrar.java
@@ -1,6 +1,7 @@
package io.sentry.spring;
import com.jakewharton.nopen.annotation.Open;
+import io.sentry.InitPriority;
import io.sentry.ScopesAdapter;
import io.sentry.SentryIntegrationPackageStorage;
import io.sentry.SentryOptions;
@@ -46,6 +47,7 @@ private void registerSentryOptions(
builder.addPropertyValue("enableExternalConfiguration", true);
builder.addPropertyValue("sentryClientName", BuildConfig.SENTRY_SPRING_SDK_NAME);
builder.addPropertyValue("sdkVersion", createSdkVersion());
+ builder.addPropertyValue("initPriority", InitPriority.LOW);
addPackageAndIntegrationInfo();
if (annotationAttributes.containsKey("sendDefaultPii")) {
builder.addPropertyValue("sendDefaultPii", annotationAttributes.getBoolean("sendDefaultPii"));
diff --git a/sentry/src/main/java/io/sentry/Sentry.java b/sentry/src/main/java/io/sentry/Sentry.java
index 7807bced45a..1482d391f4f 100644
--- a/sentry/src/main/java/io/sentry/Sentry.java
+++ b/sentry/src/main/java/io/sentry/Sentry.java
@@ -272,13 +272,6 @@ private static synchronized void init(
"You are running Android. Please, use SentryAndroid.init. "
+ options.getClass().getName());
}
- if (isEnabled()) {
- options
- .getLogger()
- .log(
- SentryLevel.WARNING,
- "Sentry has been already initialized. Previous configuration will be overwritten.");
- }
if (!preInitConfigurations(options)) {
return;
@@ -288,6 +281,13 @@ private static synchronized void init(
Sentry.globalHubMode = globalHubMode;
final boolean shouldInit = InitUtil.shouldInit(globalScope.getOptions(), options, isEnabled());
if (shouldInit) {
+ if (isEnabled()) {
+ options
+ .getLogger()
+ .log(
+ SentryLevel.WARNING,
+ "Sentry has been already initialized. Previous configuration will be overwritten.");
+ }
globalScope.replaceOptions(options);
final IScopes scopes = getCurrentScopes();