Skip to content

Commit 53bf61a

Browse files
POTEL 61 - Tracing without Performance defer sampling decision (#3945)
* bump OTel to 2.10.0 * support DB_QUERY_TEXT * changelog * change bom version for otel * Replace OTel ContextStorage wrapper with ContextStorageProvider * bump spring boot 3.4 * fix twp * Use null sampled for TwP * make todo url configurable * Format code * reverse configurable todo url * changelog --------- Co-authored-by: Sentry Github Bot <[email protected]>
1 parent 254461b commit 53bf61a

File tree

4 files changed

+19
-17
lines changed

4 files changed

+19
-17
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
- A `sentry-trace` header that only contains trace ID and span ID but no sampled flag (`-1`, `-0` suffix) means the receiving system can make its own sampling decision
99
- When generating `sentry-trace` header from `PropagationContext` we now copy the `sampled` flag.
1010
- In `TransactionContext.fromPropagationContext` when there is no parent sampling decision, keep the decision `null` so a new sampling decision is made instead of defaulting to `false`
11+
- Defer sampling decision by setting `sampled` to `null` in `PropagationContext` when using OpenTelemetry in case of an incoming defer sampling `sentry-trace` header. ([#3945](https://github.com/getsentry/sentry-java/pull/3945))
1112

1213
## 8.0.0-rc.1
1314

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ public final class io/sentry/opentelemetry/OtelInternalSpanDetectionUtil {
1212
public final class io/sentry/opentelemetry/OtelSamplingUtil {
1313
public fun <init> ()V
1414
public static fun extractSamplingDecision (Lio/opentelemetry/api/common/Attributes;)Lio/sentry/TracesSamplingDecision;
15-
public static fun extractSamplingDecisionOrDefault (Lio/opentelemetry/api/common/Attributes;)Lio/sentry/TracesSamplingDecision;
1615
}
1716

1817
public final class io/sentry/opentelemetry/OtelSentryPropagator : io/opentelemetry/context/propagation/TextMapPropagator {

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

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,6 @@
99
@ApiStatus.Internal
1010
public final class OtelSamplingUtil {
1111

12-
public static @NotNull TracesSamplingDecision extractSamplingDecisionOrDefault(
13-
final @NotNull Attributes attributes) {
14-
final @Nullable TracesSamplingDecision decision = extractSamplingDecision(attributes);
15-
if (decision != null) {
16-
return decision;
17-
} else {
18-
return new TracesSamplingDecision(false);
19-
}
20-
}
21-
2212
public static @Nullable TracesSamplingDecision extractSamplingDecision(
2313
final @NotNull Attributes attributes) {
2414
final @Nullable Boolean sampled = attributes.get(InternalSemanticAttributes.SAMPLED);

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

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ public void onStart(final @NotNull Context parentContext, final @NotNull ReadWri
4949

5050
final @Nullable IOtelSpanWrapper sentryParentSpan =
5151
spanStorage.getSentrySpan(otelSpan.getParentSpanContext());
52-
@NotNull
52+
@Nullable
5353
TracesSamplingDecision samplingDecision =
54-
OtelSamplingUtil.extractSamplingDecisionOrDefault(otelSpan.toSpanData().getAttributes());
54+
OtelSamplingUtil.extractSamplingDecision(otelSpan.toSpanData().getAttributes());
5555
@Nullable Baggage baggage = null;
5656
@Nullable SpanId sentryParentSpanId = null;
5757
otelSpan.setAttribute(IS_REMOTE_PARENT, otelSpan.getParentSpanContext().isRemote());
@@ -81,10 +81,7 @@ public void onStart(final @NotNull Context parentContext, final @NotNull ReadWri
8181
}
8282
}
8383

84-
final boolean sampled =
85-
samplingDecision != null
86-
? samplingDecision.getSampled()
87-
: otelSpan.getSpanContext().isSampled();
84+
final @Nullable Boolean sampled = isSampled(otelSpan, samplingDecision);
8885

8986
final @NotNull PropagationContext propagationContext =
9087
sentryTraceHeader == null
@@ -111,6 +108,21 @@ public void onStart(final @NotNull Context parentContext, final @NotNull ReadWri
111108
spanStorage.storeSentrySpan(spanContext, sentrySpan);
112109
}
113110

111+
private @Nullable Boolean isSampled(
112+
final @NotNull ReadWriteSpan otelSpan,
113+
final @Nullable TracesSamplingDecision samplingDecision) {
114+
if (samplingDecision != null) {
115+
return samplingDecision.getSampled();
116+
}
117+
118+
if (otelSpan.getSpanContext().isSampled()) {
119+
return true;
120+
}
121+
122+
// tracing without performance
123+
return null;
124+
}
125+
114126
private static void updatePropagationContext(
115127
IScopes scopes, PropagationContext propagationContext) {
116128
scopes.configureScope(

0 commit comments

Comments
 (0)