Skip to content

Commit fe6463f

Browse files
authored
Merge f5360c5 into c682d68
2 parents c682d68 + f5360c5 commit fe6463f

File tree

27 files changed

+295
-121
lines changed

27 files changed

+295
-121
lines changed

buildSrc/src/main/java/Config.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ object Config {
9898
val springBoot3StarterSecurity = "org.springframework.boot:spring-boot-starter-security:$springBoot3Version"
9999
val springBoot3StarterJdbc = "org.springframework.boot:spring-boot-starter-jdbc:$springBoot3Version"
100100
val springBoot3StarterActuator = "org.springframework.boot:spring-boot-starter-actuator:$springBoot3Version"
101+
val springBoot3StarterOpenTelemetry = "io.opentelemetry.instrumentation:opentelemetry-spring-boot-starter:${OpenTelemetry.otelJavaagentVersion}"
101102

102103
val springWeb = "org.springframework:spring-webmvc"
103104
val springWebflux = "org.springframework:spring-webflux"

sentry-opentelemetry/sentry-opentelemetry-agentcustomization/api/sentry-opentelemetry-agentcustomization.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
public final class io/sentry/opentelemetry/SentryAutoConfigurationCustomizerProvider : io/opentelemetry/sdk/autoconfigure/spi/AutoConfigurationCustomizerProvider {
2+
public static field skipInit Z
23
public fun <init> ()V
34
public fun customize (Lio/opentelemetry/sdk/autoconfigure/spi/AutoConfigurationCustomizer;)V
45
}

sentry-opentelemetry/sentry-opentelemetry-agentcustomization/src/main/java/io/sentry/opentelemetry/SentryAutoConfigurationCustomizerProvider.java

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.sentry.opentelemetry;
22

3-
import io.opentelemetry.context.ContextStorage;
43
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer;
54
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider;
65
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
@@ -13,7 +12,6 @@
1312
import io.sentry.SentrySpanFactoryHolder;
1413
import io.sentry.protocol.SdkVersion;
1514
import io.sentry.protocol.SentryPackage;
16-
import io.sentry.util.SpanUtils;
1715
import java.io.IOException;
1816
import java.net.URL;
1917
import java.util.ArrayList;
@@ -29,31 +27,27 @@
2927
public final class SentryAutoConfigurationCustomizerProvider
3028
implements AutoConfigurationCustomizerProvider {
3129

30+
public static volatile boolean skipInit = false;
31+
3232
@Override
3333
public void customize(AutoConfigurationCustomizer autoConfiguration) {
34+
System.out.println("hello from agent");
3435
final @Nullable VersionInfoHolder versionInfoHolder = createVersionInfo();
3536

3637
final @NotNull OtelSpanFactory spanFactory = new OtelSpanFactory();
3738
SentrySpanFactoryHolder.setSpanFactory(spanFactory);
38-
/**
39-
* We're currently overriding the storage mechanism to allow for cleanup of non closed OTel
40-
* scopes. These happen when using e.g. Sentry static API due to getCurrentScopes() invoking
41-
* Context.makeCurrent and then ignoring the returned lifecycle token (OTel Scope). After fixing
42-
* the classloader problem (sentry bootstrap dependency is currently in agent classloader) we
43-
* can revisit and try again to set the storage instead of overriding it in the wrapper. We
44-
* should try to use OTels StorageProvider mechanism instead.
45-
*/
46-
// ContextStorage.addWrapper((storage) -> new SentryContextStorage(storage));
47-
ContextStorage.addWrapper(
48-
(storage) -> new SentryContextStorage(new SentryOtelThreadLocalStorage()));
4939

5040
if (isSentryAutoInitEnabled()) {
41+
System.out.println("hello from before agent init");
5142
Sentry.init(
5243
options -> {
44+
System.out.println("hello from agent init options config block");
5345
options.setEnableExternalConfiguration(true);
5446
options.setInitPriority(InitPriority.HIGH);
55-
options.setIgnoredSpanOrigins(SpanUtils.ignoredSpanOriginsForOpenTelemetry());
56-
options.setSpanFactory(spanFactory);
47+
OpenTelemetryUtil.applyOpenTelemetryOptions(options);
48+
//
49+
// options.setIgnoredSpanOrigins(SpanUtils.ignoredSpanOriginsForOpenTelemetry());
50+
// options.setSpanFactory(spanFactory);
5751
final @Nullable SdkVersion sdkVersion = createSdkVersion(options, versionInfoHolder);
5852
if (sdkVersion != null) {
5953
options.setSdkVersion(sdkVersion);
@@ -76,6 +70,9 @@ public void customize(AutoConfigurationCustomizer autoConfiguration) {
7670
}
7771

7872
private boolean isSentryAutoInitEnabled() {
73+
if (skipInit) {
74+
return false;
75+
}
7976
final @Nullable String sentryAutoInit = System.getenv("SENTRY_AUTO_INIT");
8077

8178
if (sentryAutoInit != null) {

sentry-opentelemetry/sentry-opentelemetry-extra/api/sentry-opentelemetry-extra.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public final class io/sentry/opentelemetry/OtelContextScopesStorage : io/sentry/
77
public fun <init> ()V
88
public fun close ()V
99
public fun get ()Lio/sentry/IScopes;
10+
public fun init ()V
1011
public fun set (Lio/sentry/IScopes;)Lio/sentry/ISentryLifecycleToken;
1112
}
1213

@@ -20,6 +21,7 @@ public final class io/sentry/opentelemetry/OtelSpanContext : io/sentry/SpanConte
2021

2122
public final class io/sentry/opentelemetry/OtelSpanFactory : io/sentry/ISpanFactory {
2223
public fun <init> ()V
24+
public fun <init> (Lio/opentelemetry/api/OpenTelemetry;)V
2325
public fun createSpan (Lio/sentry/IScopes;Lio/sentry/SpanOptions;Lio/sentry/SpanContext;Lio/sentry/ISpan;)Lio/sentry/ISpan;
2426
public fun createTransaction (Lio/sentry/TransactionContext;Lio/sentry/IScopes;Lio/sentry/TransactionOptions;Lio/sentry/TransactionPerformanceCollector;)Lio/sentry/ITransaction;
2527
}

sentry-opentelemetry/sentry-opentelemetry-extra/src/main/java/io/sentry/opentelemetry/OtelContextScopesStorage.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static io.sentry.opentelemetry.SentryOtelKeys.SENTRY_SCOPES_KEY;
44

55
import io.opentelemetry.context.Context;
6+
import io.opentelemetry.context.ContextStorage;
67
import io.opentelemetry.context.Scope;
78
import io.sentry.IScopes;
89
import io.sentry.IScopesStorage;
@@ -15,6 +16,22 @@
1516
@SuppressWarnings("MustBeClosedChecker")
1617
public final class OtelContextScopesStorage implements IScopesStorage {
1718

19+
@Override
20+
public void init() {
21+
System.out.println("hello from OtelContextScopesStorage init");
22+
/**
23+
* We're currently overriding the storage mechanism to allow for cleanup of non closed OTel
24+
* scopes. These happen when using e.g. Sentry static API due to getCurrentScopes() invoking
25+
* Context.makeCurrent and then ignoring the returned lifecycle token (OTel Scope). After fixing
26+
* the classloader problem (sentry bootstrap dependency is currently in agent classloader) we
27+
* can revisit and try again to set the storage instead of overriding it in the wrapper. We
28+
* should try to use OTels StorageProvider mechanism instead.
29+
*/
30+
// ContextStorage.addWrapper((storage) -> new SentryContextStorage(storage));
31+
ContextStorage.addWrapper(
32+
(storage) -> new SentryContextStorage(new SentryOtelThreadLocalStorage()));
33+
}
34+
1835
@Override
1936
public @NotNull ISentryLifecycleToken set(@Nullable IScopes scopes) {
2037
final Context context = Context.current();

sentry-opentelemetry/sentry-opentelemetry-extra/src/main/java/io/sentry/opentelemetry/OtelSpanFactory.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package io.sentry.opentelemetry;
22

33
import io.opentelemetry.api.GlobalOpenTelemetry;
4+
import io.opentelemetry.api.OpenTelemetry;
45
import io.opentelemetry.api.trace.Span;
56
import io.opentelemetry.api.trace.SpanBuilder;
67
import io.opentelemetry.api.trace.TraceFlags;
78
import io.opentelemetry.api.trace.TraceState;
89
import io.opentelemetry.api.trace.Tracer;
10+
import io.opentelemetry.api.trace.TracerProvider;
911
import io.opentelemetry.context.Context;
1012
import io.sentry.Baggage;
13+
import io.sentry.BuildConfig;
1114
import io.sentry.IScopes;
1215
import io.sentry.ISpan;
1316
import io.sentry.ISpanFactory;
@@ -33,6 +36,15 @@
3336
public final class OtelSpanFactory implements ISpanFactory {
3437

3538
private final @NotNull SentryWeakSpanStorage storage = SentryWeakSpanStorage.getInstance();
39+
private final @Nullable OpenTelemetry openTelemetry;
40+
41+
public OtelSpanFactory(final @Nullable OpenTelemetry openTelemetry) {
42+
this.openTelemetry = openTelemetry;
43+
}
44+
45+
public OtelSpanFactory() {
46+
this(null);
47+
}
3648

3749
@Override
3850
public @NotNull ITransaction createTransaction(
@@ -145,7 +157,14 @@ public final class OtelSpanFactory implements ISpanFactory {
145157
}
146158

147159
private @NotNull Tracer getTracer() {
148-
return GlobalOpenTelemetry.getTracer(
149-
"sentry-instrumentation-scope-name", "sentry-instrumentation-scope-version");
160+
return getTracerProvider().get("sentry-opentelemetry", BuildConfig.VERSION_NAME);
161+
}
162+
163+
private @NotNull TracerProvider getTracerProvider() {
164+
System.out.println("hello from " + toString());
165+
if (openTelemetry != null) {
166+
return openTelemetry.getTracerProvider();
167+
}
168+
return GlobalOpenTelemetry.getTracerProvider();
150169
}
151170
}

sentry-opentelemetry/sentry-opentelemetry-extra/src/main/java/io/sentry/opentelemetry/SentryContextStorage.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,15 @@
33
import io.opentelemetry.context.Context;
44
import io.opentelemetry.context.ContextStorage;
55
import io.opentelemetry.context.Scope;
6-
import java.util.logging.Level;
7-
import java.util.logging.Logger;
86
import org.jetbrains.annotations.ApiStatus;
97
import org.jetbrains.annotations.NotNull;
108

119
@ApiStatus.Internal
1210
public final class SentryContextStorage implements ContextStorage {
13-
private final @NotNull Logger logger = Logger.getLogger(SentryContextStorage.class.getName());
14-
1511
private final @NotNull ContextStorage contextStorage;
1612

1713
public SentryContextStorage(final @NotNull ContextStorage contextStorage) {
1814
this.contextStorage = contextStorage;
19-
logger.log(Level.SEVERE, "SentryContextStorage ctor called");
2015
}
2116

2217
@Override

sentry-samples/sentry-samples-spring-boot-jakarta-opentelemetry/build.gradle.kts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,11 @@ dependencies {
5252
implementation(projects.sentryLogback)
5353
implementation(projects.sentryGraphql22)
5454
implementation(projects.sentryQuartz)
55-
implementation(Config.Libs.OpenTelemetry.otelSdk)
55+
// implementation(Config.Libs.OpenTelemetry.otelSdk)
56+
implementation("io.opentelemetry.instrumentation:opentelemetry-spring-boot-starter")
57+
implementation(Config.Libs.springBoot3StarterOpenTelemetry)
58+
implementation(projects.sentryOpentelemetry.sentryOpentelemetryBootstrap)
59+
implementation(projects.sentryOpentelemetry.sentryOpentelemetryAgentcustomization)
5660

5761
// database query tracing
5862
implementation(projects.sentryJdbc)
@@ -67,6 +71,12 @@ dependencies {
6771
testImplementation(Config.Libs.apolloKotlin)
6872
}
6973

74+
dependencyManagement {
75+
imports {
76+
mavenBom("io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:2.7.0")
77+
}
78+
}
79+
7080
configure<SourceSetContainer> {
7181
test {
7282
java.srcDir("src/test/java")

sentry-samples/sentry-samples-spring-boot-jakarta-opentelemetry/src/main/java/io/sentry/samples/spring/boot/jakarta/CustomJob.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import io.sentry.spring.jakarta.tracing.SentryTransaction;
55
import org.slf4j.Logger;
66
import org.slf4j.LoggerFactory;
7-
import org.springframework.scheduling.annotation.Scheduled;
87
import org.springframework.stereotype.Component;
98

109
/**
@@ -18,7 +17,7 @@ public class CustomJob {
1817
private static final Logger LOGGER = LoggerFactory.getLogger(CustomJob.class);
1918

2019
@SentryCheckIn("monitor_slug_1")
21-
@Scheduled(fixedRate = 3 * 60 * 1000L)
20+
// @Scheduled(fixedRate = 3 * 60 * 1000L)
2221
void execute() throws InterruptedException {
2322
LOGGER.info("Executing scheduled job");
2423
Thread.sleep(2000L);

sentry-samples/sentry-samples-spring-boot-jakarta-opentelemetry/src/main/java/io/sentry/samples/spring/boot/jakarta/PersonController.java

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package io.sentry.samples.spring.boot.jakarta;
22

3+
import io.opentelemetry.api.OpenTelemetry;
34
import io.opentelemetry.api.trace.Span;
4-
import io.opentelemetry.api.trace.Tracer;
55
import io.opentelemetry.context.Scope;
6+
import io.opentelemetry.instrumentation.annotations.WithSpan;
67
import io.sentry.ISpan;
78
import io.sentry.Sentry;
89
import org.jetbrains.annotations.NotNull;
@@ -19,19 +20,27 @@
1920
@RequestMapping("/person/")
2021
public class PersonController {
2122
private final PersonService personService;
22-
private final Tracer tracer;
23+
private final OpenTelemetry openTelemetry;
2324
private static final Logger LOGGER = LoggerFactory.getLogger(PersonController.class);
2425

25-
public PersonController(PersonService personService, Tracer tracer) {
26+
public PersonController(PersonService personService, OpenTelemetry openTelemetry) {
2627
this.personService = personService;
27-
this.tracer = tracer;
28+
this.openTelemetry = openTelemetry;
2829
}
2930

3031
@GetMapping("{id}")
32+
@WithSpan("personSpanThroughOtelAnnotation")
3133
Person person(@PathVariable Long id) {
32-
Span span = tracer.spanBuilder("spanCreatedThroughOtelApi").startSpan();
34+
ISpan annotationSpan = Sentry.getSpan();
35+
System.out.println(annotationSpan);
36+
Span span =
37+
openTelemetry
38+
.getTracer("tracerForSpringBootDemo")
39+
.spanBuilder("spanCreatedThroughOtelApi")
40+
.startSpan();
3341
try (final @NotNull Scope spanScope = span.makeCurrent()) {
34-
ISpan sentrySpan = Sentry.getSpan().startChild("spanCreatedThroughSentryApi");
42+
ISpan currentSpan = Sentry.getSpan();
43+
ISpan sentrySpan = currentSpan.startChild("spanCreatedThroughSentryApi");
3544
try {
3645
LOGGER.error("Trying person with id={}", id, new RuntimeException("error while loading"));
3746
throw new IllegalArgumentException("Something went wrong [id=" + id + "]");
@@ -45,7 +54,11 @@ Person person(@PathVariable Long id) {
4554

4655
@PostMapping
4756
Person create(@RequestBody Person person) {
48-
Span span = tracer.spanBuilder("spanCreatedThroughOtelApi").startSpan();
57+
Span span =
58+
openTelemetry
59+
.getTracer("tracerForSpringBootDemo")
60+
.spanBuilder("spanCreatedThroughOtelApi")
61+
.startSpan();
4962
try (final @NotNull Scope spanScope = span.makeCurrent()) {
5063
ISpan sentrySpan = Sentry.getSpan().startChild("spanCreatedThroughSentryApi");
5164
try {

0 commit comments

Comments
 (0)