Skip to content

Commit 1d94fa8

Browse files
authored
Merge 319b527 into ad3465a
2 parents ad3465a + 319b527 commit 1d94fa8

File tree

5 files changed

+221
-16
lines changed

5 files changed

+221
-16
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66

77
- Use minSdk compatible `Objects` class ([#2436](https://github.com/getsentry/sentry-java/pull/2436))
88

9+
### Features
10+
11+
- Add logging for OpenTelemetry integration ([#2425](https://github.com/getsentry/sentry-java/pull/2425))
12+
913
## 6.10.0
1014

1115
### Features

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

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,36 @@
66
import io.sentry.EventProcessor;
77
import io.sentry.Hint;
88
import io.sentry.HubAdapter;
9+
import io.sentry.IHub;
910
import io.sentry.ISpan;
1011
import io.sentry.Instrumenter;
1112
import io.sentry.SentryEvent;
13+
import io.sentry.SentryLevel;
1214
import io.sentry.SentrySpanStorage;
1315
import io.sentry.SpanContext;
1416
import io.sentry.protocol.SentryId;
1517
import org.jetbrains.annotations.NotNull;
1618
import org.jetbrains.annotations.Nullable;
19+
import org.jetbrains.annotations.TestOnly;
1720

1821
public final class OpenTelemetryLinkErrorEventProcessor implements EventProcessor {
1922

23+
private final @NotNull IHub hub;
2024
private final @NotNull SentrySpanStorage spanStorage = SentrySpanStorage.getInstance();
2125

26+
public OpenTelemetryLinkErrorEventProcessor() {
27+
this(HubAdapter.getInstance());
28+
}
29+
30+
@TestOnly
31+
OpenTelemetryLinkErrorEventProcessor(final @NotNull IHub hub) {
32+
this.hub = hub;
33+
}
34+
2235
@Override
2336
public @Nullable SentryEvent process(final @NotNull SentryEvent event, final @NotNull Hint hint) {
24-
if (Instrumenter.OTEL.equals(HubAdapter.getInstance().getOptions().getInstrumenter())) {
37+
final @NotNull Instrumenter instrumenter = hub.getOptions().getInstrumenter();
38+
if (Instrumenter.OTEL.equals(instrumenter)) {
2539
@NotNull final Span otelSpan = Span.current();
2640
@NotNull final String traceId = otelSpan.getSpanContext().getTraceId();
2741
@NotNull final String spanId = otelSpan.getSpanContext().getSpanId();
@@ -41,8 +55,42 @@ public final class OpenTelemetryLinkErrorEventProcessor implements EventProcesso
4155
null);
4256

4357
event.getContexts().setTrace(spanContext);
58+
hub.getOptions()
59+
.getLogger()
60+
.log(
61+
SentryLevel.DEBUG,
62+
"Linking Sentry event %s to span %s created via OpenTelemetry (trace %s).",
63+
event.getEventId(),
64+
spanId,
65+
traceId);
66+
} else {
67+
hub.getOptions()
68+
.getLogger()
69+
.log(
70+
SentryLevel.DEBUG,
71+
"Not linking Sentry event %s to any transaction created via OpenTelemetry as none has been found for span %s (trace %s).",
72+
event.getEventId(),
73+
spanId,
74+
traceId);
4475
}
76+
} else {
77+
hub.getOptions()
78+
.getLogger()
79+
.log(
80+
SentryLevel.DEBUG,
81+
"Not linking Sentry event %s to any transaction created via OpenTelemetry as traceId %s or spanId %s are invalid.",
82+
event.getEventId(),
83+
traceId,
84+
spanId);
4585
}
86+
} else {
87+
hub.getOptions()
88+
.getLogger()
89+
.log(
90+
SentryLevel.DEBUG,
91+
"Not linking Sentry event %s to any transaction created via OpenTelemetry as instrumenter is set to %s.",
92+
event.getEventId(),
93+
instrumenter);
4694
}
4795

4896
return event;

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010
import io.opentelemetry.context.propagation.TextMapSetter;
1111
import io.sentry.Baggage;
1212
import io.sentry.BaggageHeader;
13+
import io.sentry.HubAdapter;
14+
import io.sentry.IHub;
1315
import io.sentry.ISpan;
16+
import io.sentry.SentryLevel;
1417
import io.sentry.SentrySpanStorage;
1518
import io.sentry.SentryTraceHeader;
1619
import io.sentry.exception.InvalidSentryTraceHeaderException;
@@ -26,6 +29,15 @@ public final class SentryPropagator implements TextMapPropagator {
2629
private static final @NotNull List<String> FIELDS =
2730
Arrays.asList(SentryTraceHeader.SENTRY_TRACE_HEADER, BaggageHeader.BAGGAGE_HEADER);
2831
private final @NotNull SentrySpanStorage spanStorage = SentrySpanStorage.getInstance();
32+
private final @NotNull IHub hub;
33+
34+
public SentryPropagator() {
35+
this(HubAdapter.getInstance());
36+
}
37+
38+
SentryPropagator(final @NotNull IHub hub) {
39+
this.hub = hub;
40+
}
2941

3042
@Override
3143
public Collection<String> fields() {
@@ -37,10 +49,22 @@ public <C> void inject(final Context context, final C carrier, final TextMapSett
3749
final @NotNull Span otelSpan = Span.fromContext(context);
3850
final @NotNull SpanContext otelSpanContext = otelSpan.getSpanContext();
3951
if (!otelSpanContext.isValid()) {
52+
hub.getOptions()
53+
.getLogger()
54+
.log(
55+
SentryLevel.DEBUG,
56+
"Not injecting Sentry tracing information for invalid OpenTelemetry span.");
4057
return;
4158
}
4259
final @Nullable ISpan sentrySpan = spanStorage.get(otelSpanContext.getSpanId());
4360
if (sentrySpan == null || sentrySpan.isNoOp()) {
61+
hub.getOptions()
62+
.getLogger()
63+
.log(
64+
SentryLevel.DEBUG,
65+
"Not injecting Sentry tracing information for span %s as no Sentry span has been found or it is a NoOp (trace %s). This might simply mean this is a request to Sentry.",
66+
otelSpanContext.getSpanId(),
67+
otelSpanContext.getTraceId());
4468
return;
4569
}
4670

@@ -82,8 +106,18 @@ public <C> Context extract(
82106
Span wrappedSpan = Span.wrap(otelSpanContext);
83107
modifiedContext = modifiedContext.with(wrappedSpan);
84108

109+
hub.getOptions()
110+
.getLogger()
111+
.log(SentryLevel.DEBUG, "Continuing Sentry trace %s", sentryTraceHeader.getTraceId());
112+
85113
return modifiedContext;
86114
} catch (InvalidSentryTraceHeaderException e) {
115+
hub.getOptions()
116+
.getLogger()
117+
.log(
118+
SentryLevel.ERROR,
119+
"Unable to extract Sentry tracing information from invalid header.",
120+
e);
87121
return context;
88122
}
89123
}

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

Lines changed: 75 additions & 5 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.SentryLevel;
2223
import io.sentry.SentrySpanStorage;
2324
import io.sentry.SentryTraceHeader;
2425
import io.sentry.SpanId;
@@ -48,7 +49,7 @@ public SentrySpanProcessor() {
4849
this(HubAdapter.getInstance());
4950
}
5051

51-
SentrySpanProcessor(@NotNull IHub hub) {
52+
SentrySpanProcessor(final @NotNull IHub hub) {
5253
this.hub = hub;
5354
}
5455

@@ -58,22 +59,44 @@ public void onStart(final @NotNull Context parentContext, final @NotNull ReadWri
5859
return;
5960
}
6061

62+
final @NotNull TraceData traceData = getTraceData(otelSpan, parentContext);
63+
6164
if (isSentryRequest(otelSpan)) {
65+
hub.getOptions()
66+
.getLogger()
67+
.log(
68+
SentryLevel.DEBUG,
69+
"Not forwarding OpenTelemetry span %s to Sentry as this looks like a span for a request to Sentry (trace %s).",
70+
traceData.getSpanId(),
71+
traceData.getTraceId());
6272
return;
6373
}
64-
65-
final @NotNull TraceData traceData = getTraceData(otelSpan, parentContext);
6674
final @Nullable ISpan sentryParentSpan =
6775
traceData.getParentSpanId() == null ? null : spanStorage.get(traceData.getParentSpanId());
6876

6977
if (sentryParentSpan != null) {
78+
hub.getOptions()
79+
.getLogger()
80+
.log(
81+
SentryLevel.DEBUG,
82+
"Creating Sentry child span for OpenTelemetry span %s (trace %s). Parent span is %s.",
83+
traceData.getSpanId(),
84+
traceData.getTraceId(),
85+
traceData.getParentSpanId());
7086
final @NotNull Date startDate =
7187
DateUtils.nanosToDate(otelSpan.toSpanData().getStartEpochNanos());
7288
final @NotNull ISpan sentryChildSpan =
7389
sentryParentSpan.startChild(
7490
otelSpan.getName(), otelSpan.getName(), startDate, Instrumenter.OTEL);
7591
spanStorage.store(traceData.getSpanId(), sentryChildSpan);
7692
} else {
93+
hub.getOptions()
94+
.getLogger()
95+
.log(
96+
SentryLevel.DEBUG,
97+
"Creating Sentry transaction for OpenTelemetry span %s (trace %s).",
98+
traceData.getSpanId(),
99+
traceData.getTraceId());
77100
final @NotNull String transactionName = otelSpan.getName();
78101
final @NotNull TransactionNameSource transactionNameSource = TransactionNameSource.CUSTOM;
79102
final @Nullable String op = otelSpan.getName();
@@ -124,18 +147,48 @@ public void onEnd(final @NotNull ReadableSpan otelSpan) {
124147
final @Nullable ISpan sentrySpan = spanStorage.removeAndGet(traceData.getSpanId());
125148

126149
if (sentrySpan == null) {
150+
hub.getOptions()
151+
.getLogger()
152+
.log(
153+
SentryLevel.DEBUG,
154+
"Unable to find Sentry span for OpenTelemetry span %s (trace %s).",
155+
traceData.getSpanId(),
156+
traceData.getTraceId());
127157
return;
128158
}
129159

130160
if (isSentryRequest(otelSpan)) {
161+
hub.getOptions()
162+
.getLogger()
163+
.log(
164+
SentryLevel.DEBUG,
165+
"Not forwarding OpenTelemetry span %s to Sentry as this looks like a span for a request to Sentry (trace %s).",
166+
traceData.getSpanId(),
167+
traceData.getTraceId());
131168
return;
132169
}
133170

134171
if (sentrySpan instanceof ITransaction) {
135-
ITransaction sentryTransaction = (ITransaction) sentrySpan;
172+
final @NotNull ITransaction sentryTransaction = (ITransaction) sentrySpan;
136173
updateTransactionWithOtelData(sentryTransaction, otelSpan);
174+
hub.getOptions()
175+
.getLogger()
176+
.log(
177+
SentryLevel.DEBUG,
178+
"Finishing Sentry transaction %s for OpenTelemetry span %s (trace %s).",
179+
sentryTransaction.getEventId(),
180+
traceData.getSpanId(),
181+
traceData.getTraceId());
137182
} else {
138183
updateSpanWithOtelData(sentrySpan, otelSpan);
184+
hub.getOptions()
185+
.getLogger()
186+
.log(
187+
SentryLevel.DEBUG,
188+
"Finishing Sentry span for OpenTelemetry span %s (trace %s). Parent span is %s.",
189+
traceData.getSpanId(),
190+
traceData.getTraceId(),
191+
traceData.getParentSpanId());
139192
}
140193

141194
final @NotNull SpanStatus sentryStatus = mapOtelStatus(otelSpan);
@@ -151,15 +204,32 @@ public boolean isEndRequired() {
151204

152205
private boolean ensurePrerequisites(final @NotNull ReadableSpan otelSpan) {
153206
if (!hasSentryBeenInitialized()) {
207+
hub.getOptions()
208+
.getLogger()
209+
.log(
210+
SentryLevel.DEBUG,
211+
"Not forwarding OpenTelemetry span to Sentry as Sentry has not yet been initialized.");
154212
return false;
155213
}
156214

157-
if (!Instrumenter.OTEL.equals(hub.getOptions().getInstrumenter())) {
215+
final @NotNull Instrumenter instrumenter = hub.getOptions().getInstrumenter();
216+
if (!Instrumenter.OTEL.equals(instrumenter)) {
217+
hub.getOptions()
218+
.getLogger()
219+
.log(
220+
SentryLevel.DEBUG,
221+
"Not forwarding OpenTelemetry span to Sentry as instrumenter has been set to %s.",
222+
instrumenter);
158223
return false;
159224
}
160225

161226
final @NotNull SpanContext otelSpanContext = otelSpan.getSpanContext();
162227
if (!otelSpanContext.isValid()) {
228+
hub.getOptions()
229+
.getLogger()
230+
.log(
231+
SentryLevel.DEBUG,
232+
"Not forwarding OpenTelemetry span to Sentry as the span is invalid.");
163233
return false;
164234
}
165235

0 commit comments

Comments
 (0)