Skip to content

Commit fe38665

Browse files
authored
Merge 3814df6 into 20d7d3d
2 parents 20d7d3d + 3814df6 commit fe38665

9 files changed

Lines changed: 96 additions & 13 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010
- Fix `ClassNotFoundException` for `io.sentry.spring.SentrySpringServletContainerInitializer` in `sentry-spring-jakarta` ([#2411](https://github.com/getsentry/sentry-java/issues/2411))
1111
- Fix `sentry-samples-spring-jakarta` ([#2411](https://github.com/getsentry/sentry-java/issues/2411))
1212

13+
### Features
14+
15+
- Add SENTRY_AUTO_INIT environment variable to control OpenTelemetry Agent init ([#2410](https://github.com/getsentry/sentry-java/pull/2410))
16+
- Add OpenTelemetryLinkErrorEventProcessor for linking errors to traces created via OpenTelemetry ([#2418](https://github.com/getsentry/sentry-java/pull/2418))
17+
1318
## 6.9.1
1419

1520
### Fixes

sentry-opentelemetry/sentry-opentelemetry-agent/README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ Sentry.init(
3838
Using the `otel` instrumenter will ensure `Sentry` instrumentation will be done via OpenTelemetry
3939
and integrations as well as direct interactions with transactions and spans have no effect.
4040

41+
## Controlling auto initialization of Sentry
42+
43+
By default if you pass either `SENTRY_DSN` or `SENTRY_PROPERTIES_FILE` as environment variable,
44+
Sentry will automatically be initialized by this agent. To disable this behaviour, you can set
45+
`SENTRY_AUTO_INIT=false` as environment variable. You will then have to initialize Sentry inside
46+
the target application.
47+
4148
## Debugging
4249

4350
To enable debug logging for Sentry, please provide `SENTRY_DEBUG=true` as environment variable or

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,12 @@ public final class SentryAutoConfigurationCustomizerProvider
2323

2424
@Override
2525
public void customize(AutoConfigurationCustomizer autoConfiguration) {
26-
final @Nullable String sentryPropertiesFile = System.getenv("SENTRY_PROPERTIES_FILE");
27-
final @Nullable String sentryDsn = System.getenv("SENTRY_DSN");
28-
29-
if (sentryPropertiesFile != null || sentryDsn != null) {
26+
if (isSentryAutoInitEnabled()) {
3027
Sentry.init(
3128
options -> {
3229
options.setEnableExternalConfiguration(true);
3330
options.setInstrumenter(Instrumenter.OTEL);
31+
options.addEventProcessor(new OpenTelemetryLinkErrorEventProcessor());
3432
final @Nullable SdkVersion sdkVersion = createSdkVersion(options);
3533
if (sdkVersion != null) {
3634
options.setSdkVersion(sdkVersion);
@@ -43,6 +41,19 @@ public void customize(AutoConfigurationCustomizer autoConfiguration) {
4341
.addPropertiesSupplier(this::getDefaultProperties);
4442
}
4543

44+
private boolean isSentryAutoInitEnabled() {
45+
final @Nullable String sentryAutoInit = System.getenv("SENTRY_AUTO_INIT");
46+
47+
if (sentryAutoInit != null) {
48+
return "true".equalsIgnoreCase(sentryAutoInit);
49+
} else {
50+
final @Nullable String sentryPropertiesFile = System.getenv("SENTRY_PROPERTIES_FILE");
51+
final @Nullable String sentryDsn = System.getenv("SENTRY_DSN");
52+
53+
return sentryPropertiesFile != null || sentryDsn != null;
54+
}
55+
}
56+
4657
private @Nullable SdkVersion createSdkVersion(final @NotNull SentryOptions sentryOptions) {
4758
SdkVersion sdkVersion = sentryOptions.getSdkVersion();
4859

sentry-opentelemetry/sentry-opentelemetry-core/api/sentry-opentelemetry-core.api

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
public final class io/sentry/opentelemetry/OpenTelemetryLinkErrorEventProcessor : io/sentry/EventProcessor {
2+
public fun <init> ()V
3+
public fun process (Lio/sentry/SentryEvent;Lio/sentry/Hint;)Lio/sentry/SentryEvent;
4+
}
5+
16
public final class io/sentry/opentelemetry/OtelSpanInfo {
27
public fun <init> (Ljava/lang/String;Ljava/lang/String;Lio/sentry/protocol/TransactionNameSource;)V
38
public fun getDescription ()Ljava/lang/String;
@@ -26,13 +31,6 @@ public final class io/sentry/opentelemetry/SentrySpanProcessor : io/opentelemetr
2631
public fun onStart (Lio/opentelemetry/context/Context;Lio/opentelemetry/sdk/trace/ReadWriteSpan;)V
2732
}
2833

29-
public final class io/sentry/opentelemetry/SentrySpanStorage {
30-
public fun get (Ljava/lang/String;)Lio/sentry/ISpan;
31-
public static fun getInstance ()Lio/sentry/opentelemetry/SentrySpanStorage;
32-
public fun removeAndGet (Ljava/lang/String;)Lio/sentry/ISpan;
33-
public fun store (Ljava/lang/String;Lio/sentry/ISpan;)V
34-
}
35-
3634
public final class io/sentry/opentelemetry/SpanDescriptionExtractor {
3735
public fun <init> ()V
3836
public fun extractSpanDescription (Lio/opentelemetry/sdk/trace/ReadableSpan;)Lio/sentry/opentelemetry/OtelSpanInfo;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package io.sentry.opentelemetry;
2+
3+
import io.opentelemetry.api.trace.Span;
4+
import io.opentelemetry.api.trace.SpanId;
5+
import io.opentelemetry.api.trace.TraceId;
6+
import io.sentry.EventProcessor;
7+
import io.sentry.Hint;
8+
import io.sentry.HubAdapter;
9+
import io.sentry.ISpan;
10+
import io.sentry.Instrumenter;
11+
import io.sentry.SentryEvent;
12+
import io.sentry.SentrySpanStorage;
13+
import io.sentry.SpanContext;
14+
import io.sentry.protocol.SentryId;
15+
import org.jetbrains.annotations.NotNull;
16+
import org.jetbrains.annotations.Nullable;
17+
18+
public final class OpenTelemetryLinkErrorEventProcessor implements EventProcessor {
19+
20+
private final @NotNull SentrySpanStorage spanStorage = SentrySpanStorage.getInstance();
21+
22+
@Override
23+
public @Nullable SentryEvent process(final @NotNull SentryEvent event, final @NotNull Hint hint) {
24+
if (Instrumenter.OTEL.equals(HubAdapter.getInstance().getOptions().getInstrumenter())) {
25+
@NotNull final Span otelSpan = Span.current();
26+
@NotNull final String traceId = otelSpan.getSpanContext().getTraceId();
27+
@NotNull final String spanId = otelSpan.getSpanContext().getSpanId();
28+
29+
if (TraceId.isValid(traceId) && SpanId.isValid(spanId)) {
30+
final @Nullable ISpan sentrySpan = spanStorage.get(spanId);
31+
if (sentrySpan != null) {
32+
final @NotNull SpanContext sentrySpanSpanContext = sentrySpan.getSpanContext();
33+
final @NotNull String operation = sentrySpanSpanContext.getOperation();
34+
final @Nullable io.sentry.SpanId parentSpanId = sentrySpanSpanContext.getParentSpanId();
35+
final @NotNull SpanContext spanContext =
36+
new SpanContext(
37+
new SentryId(traceId),
38+
new io.sentry.SpanId(spanId),
39+
operation,
40+
parentSpanId,
41+
null);
42+
43+
event.getContexts().setTrace(spanContext);
44+
}
45+
}
46+
}
47+
48+
return event;
49+
}
50+
}

sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentryPropagator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.sentry.Baggage;
1212
import io.sentry.BaggageHeader;
1313
import io.sentry.ISpan;
14+
import io.sentry.SentrySpanStorage;
1415
import io.sentry.SentryTraceHeader;
1516
import io.sentry.exception.InvalidSentryTraceHeaderException;
1617
import java.util.Arrays;

sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanProcessor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.sentry.ISpan;
2020
import io.sentry.ITransaction;
2121
import io.sentry.Instrumenter;
22+
import io.sentry.SentrySpanStorage;
2223
import io.sentry.SentryTraceHeader;
2324
import io.sentry.SpanId;
2425
import io.sentry.SpanStatus;

sentry/api/sentry.api

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1562,6 +1562,13 @@ public abstract interface class io/sentry/SentryOptions$TracesSamplerCallback {
15621562
public abstract fun sample (Lio/sentry/SamplingContext;)Ljava/lang/Double;
15631563
}
15641564

1565+
public final class io/sentry/SentrySpanStorage {
1566+
public fun get (Ljava/lang/String;)Lio/sentry/ISpan;
1567+
public static fun getInstance ()Lio/sentry/SentrySpanStorage;
1568+
public fun removeAndGet (Ljava/lang/String;)Lio/sentry/ISpan;
1569+
public fun store (Ljava/lang/String;Lio/sentry/ISpan;)V
1570+
}
1571+
15651572
public final class io/sentry/SentryTraceHeader {
15661573
public static final field SENTRY_TRACE_HEADER Ljava/lang/String;
15671574
public fun <init> (Lio/sentry/protocol/SentryId;Lio/sentry/SpanId;Ljava/lang/Boolean;)V

sentry-opentelemetry/sentry-opentelemetry-core/src/main/java/io/sentry/opentelemetry/SentrySpanStorage.java renamed to sentry/src/main/java/io/sentry/SentrySpanStorage.java

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

3-
import io.sentry.ISpan;
43
import java.util.Map;
54
import java.util.concurrent.ConcurrentHashMap;
65
import org.jetbrains.annotations.ApiStatus;
76
import org.jetbrains.annotations.NotNull;
87
import org.jetbrains.annotations.Nullable;
98

9+
/**
10+
* Has been moved to `sentry` gradle module to include it in the bootstrap classloader without
11+
* having to introduce yet another module for OpenTelemetry support.
12+
*/
1013
@ApiStatus.Internal
1114
public final class SentrySpanStorage {
1215
private static volatile @Nullable SentrySpanStorage INSTANCE;

0 commit comments

Comments
 (0)