Skip to content

Commit 4241258

Browse files
authored
Merge 71d79f1 into 9cef931
2 parents 9cef931 + 71d79f1 commit 4241258

File tree

8 files changed

+88
-6
lines changed

8 files changed

+88
-6
lines changed

sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,8 @@ tasks {
145145
attributes.put("Premain-Class", "io.opentelemetry.javaagent.OpenTelemetryAgent")
146146
attributes.put("Can-Redefine-Classes", "true")
147147
attributes.put("Can-Retransform-Classes", "true")
148-
attributes.put("Implementation-Vendor", "Demo")
149-
attributes.put("Implementation-Version", "demo-${project.version}-otel-${Config.Libs.otelJavaagentVersion}")
148+
attributes.put("Implementation-Vendor", "Sentry")
149+
attributes.put("Implementation-Version", "sentry-${project.version}-otel-${Config.Libs.otelJavaagentVersion}")
150150
}
151151
}
152152

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

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

3+
import io.opentelemetry.api.common.Attributes;
34
import io.opentelemetry.api.trace.SpanContext;
45
import io.opentelemetry.api.trace.SpanKind;
56
import io.opentelemetry.api.trace.StatusCode;
@@ -176,16 +177,15 @@ private void updateTransactionWithOtelData(
176177
spanDescription.getDescription(), spanDescription.getTransactionNameSource());
177178

178179
final @NotNull Map<String, Object> otelContext = toOtelContext(otelSpan);
179-
System.out.println(otelContext);
180-
// TODO set otel context on transaction
180+
sentryTransaction.setContext("otel", otelContext);
181181
}
182182

183183
private @NotNull Map<String, Object> toOtelContext(final @NotNull ReadableSpan otelSpan) {
184184
final @NotNull SpanData spanData = otelSpan.toSpanData();
185185
final @NotNull Map<String, Object> context = new HashMap<>();
186186

187-
context.put("attributes", spanData.getAttributes().asMap());
188-
context.put("resource", spanData.getResource().getAttributes().asMap());
187+
context.put("attributes", toMapWithStringKeys(spanData.getAttributes()));
188+
context.put("resource", toMapWithStringKeys(spanData.getResource().getAttributes()));
189189

190190
return context;
191191
}
@@ -234,4 +234,19 @@ private SpanStatus mapOtelStatus(final @NotNull ReadableSpan otelSpan) {
234234
private boolean hasSentryBeenInitialized() {
235235
return Sentry.isEnabled();
236236
}
237+
238+
private @NotNull Map<String, Object> toMapWithStringKeys(final @Nullable Attributes attributes) {
239+
final @NotNull Map<String, Object> mapWithStringKeys = new HashMap<>();
240+
241+
if (attributes != null) {
242+
attributes.forEach(
243+
(key, value) -> {
244+
if (key != null) {
245+
mapWithStringKeys.put(key.getKey(), value);
246+
}
247+
});
248+
}
249+
250+
return mapWithStringKeys;
251+
}
237252
}

sentry/api/sentry.api

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,7 @@ public abstract interface class io/sentry/ISpan {
516516
}
517517

518518
public abstract interface class io/sentry/ITransaction : io/sentry/ISpan {
519+
public abstract fun getContexts ()Lio/sentry/protocol/Contexts;
519520
public abstract fun getEventId ()Lio/sentry/protocol/SentryId;
520521
public abstract fun getLatestActiveSpan ()Lio/sentry/Span;
521522
public abstract fun getName ()Ljava/lang/String;
@@ -525,6 +526,7 @@ public abstract interface class io/sentry/ITransaction : io/sentry/ISpan {
525526
public abstract fun isProfileSampled ()Ljava/lang/Boolean;
526527
public abstract fun isSampled ()Ljava/lang/Boolean;
527528
public abstract fun scheduleFinish ()V
529+
public abstract fun setContext (Ljava/lang/String;Ljava/lang/Object;)V
528530
public abstract fun setName (Ljava/lang/String;)V
529531
public abstract fun setName (Ljava/lang/String;Lio/sentry/protocol/TransactionNameSource;)V
530532
}
@@ -765,6 +767,7 @@ public final class io/sentry/NoOpTransaction : io/sentry/ITransaction {
765767
public fun finish ()V
766768
public fun finish (Lio/sentry/SpanStatus;)V
767769
public fun finish (Lio/sentry/SpanStatus;Ljava/util/Date;)V
770+
public fun getContexts ()Lio/sentry/protocol/Contexts;
768771
public fun getData (Ljava/lang/String;)Ljava/lang/Object;
769772
public fun getDescription ()Ljava/lang/String;
770773
public fun getEventId ()Lio/sentry/protocol/SentryId;
@@ -783,6 +786,7 @@ public final class io/sentry/NoOpTransaction : io/sentry/ITransaction {
783786
public fun isProfileSampled ()Ljava/lang/Boolean;
784787
public fun isSampled ()Ljava/lang/Boolean;
785788
public fun scheduleFinish ()V
789+
public fun setContext (Ljava/lang/String;Ljava/lang/Object;)V
786790
public fun setData (Ljava/lang/String;Ljava/lang/Object;)V
787791
public fun setDescription (Ljava/lang/String;)V
788792
public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;)V
@@ -1564,6 +1568,7 @@ public final class io/sentry/SentryTracer : io/sentry/ITransaction {
15641568
public fun finish (Lio/sentry/SpanStatus;)V
15651569
public fun finish (Lio/sentry/SpanStatus;Ljava/util/Date;)V
15661570
public fun getChildren ()Ljava/util/List;
1571+
public fun getContexts ()Lio/sentry/protocol/Contexts;
15671572
public fun getData ()Ljava/util/Map;
15681573
public fun getData (Ljava/lang/String;)Ljava/lang/Object;
15691574
public fun getDescription ()Ljava/lang/String;
@@ -1585,6 +1590,7 @@ public final class io/sentry/SentryTracer : io/sentry/ITransaction {
15851590
public fun isProfileSampled ()Ljava/lang/Boolean;
15861591
public fun isSampled ()Ljava/lang/Boolean;
15871592
public fun scheduleFinish ()V
1593+
public fun setContext (Ljava/lang/String;Ljava/lang/Object;)V
15881594
public fun setData (Ljava/lang/String;Ljava/lang/Object;)V
15891595
public fun setDescription (Ljava/lang/String;)V
15901596
public fun setMeasurement (Ljava/lang/String;Ljava/lang/Number;)V

sentry/src/main/java/io/sentry/ITransaction.java

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

3+
import io.sentry.protocol.Contexts;
34
import io.sentry.protocol.SentryId;
45
import io.sentry.protocol.TransactionNameSource;
56
import java.util.List;
@@ -77,4 +78,11 @@ public interface ITransaction extends ISpan {
7778

7879
/** Schedules when transaction should be automatically finished. */
7980
void scheduleFinish();
81+
82+
@ApiStatus.Internal
83+
void setContext(@NotNull String key, @NotNull Object context);
84+
85+
@ApiStatus.Internal
86+
@NotNull
87+
Contexts getContexts();
8088
}

sentry/src/main/java/io/sentry/NoOpTransaction.java

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

3+
import io.sentry.protocol.Contexts;
34
import io.sentry.protocol.SentryId;
45
import io.sentry.protocol.TransactionNameSource;
56
import java.util.Collections;
@@ -177,4 +178,14 @@ public void setMeasurement(@NotNull String name, @NotNull Number value) {}
177178
@Override
178179
public void setMeasurement(
179180
@NotNull String name, @NotNull Number value, @NotNull MeasurementUnit unit) {}
181+
182+
@ApiStatus.Internal
183+
@Override
184+
public void setContext(@NotNull String key, @NotNull Object context) {}
185+
186+
@ApiStatus.Internal
187+
@Override
188+
public @NotNull Contexts getContexts() {
189+
return new Contexts();
190+
}
180191
}

sentry/src/main/java/io/sentry/SentryTracer.java

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

3+
import io.sentry.protocol.Contexts;
34
import io.sentry.protocol.MeasurementValue;
45
import io.sentry.protocol.SentryId;
56
import io.sentry.protocol.SentryTransaction;
@@ -78,6 +79,7 @@ public final class SentryTracer implements ITransaction {
7879
private @NotNull TransactionNameSource transactionNameSource;
7980
private final @NotNull Map<String, MeasurementValue> measurements;
8081
private final @NotNull Instrumenter instrumenter;
82+
private final @NotNull Contexts contexts = new Contexts();
8183

8284
public SentryTracer(final @NotNull TransactionContext context, final @NotNull IHub hub) {
8385
this(context, hub, null);
@@ -661,6 +663,18 @@ Map<String, MeasurementValue> getMeasurements() {
661663
return measurements;
662664
}
663665

666+
@ApiStatus.Internal
667+
@Override
668+
public void setContext(final @NotNull String key, final @NotNull Object context) {
669+
contexts.put(key, context);
670+
}
671+
672+
@ApiStatus.Internal
673+
@Override
674+
public @NotNull Contexts getContexts() {
675+
return contexts;
676+
}
677+
664678
private static final class FinishStatus {
665679
static final FinishStatus NOT_FINISHED = FinishStatus.notFinished();
666680

sentry/src/main/java/io/sentry/protocol/SentryTransaction.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ public SentryTransaction(final @NotNull SentryTracer sentryTracer) {
6767
}
6868
}
6969
final Contexts contexts = this.getContexts();
70+
71+
contexts.putAll(sentryTracer.getContexts());
72+
7073
final SpanContext tracerContext = sentryTracer.getSpanContext();
7174
// tags must be placed on the root of the transaction instead of contexts.trace.tags
7275
contexts.setTrace(

sentry/src/test/java/io/sentry/SentryTracerTest.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,31 @@ class SentryTracerTest {
207207
)
208208
}
209209

210+
@Test
211+
fun `when transaction is finished, context is set`() {
212+
val tracer = fixture.getSut()
213+
val otelContext = mapOf(
214+
"attributes" to mapOf(
215+
"db.connection_string" to "hsqldb:mem:",
216+
"db.statement" to "CREATE TABLE person ( id INTEGER IDENTITY PRIMARY KEY, firstName VARCHAR(?) NOT NULL, lastName VARCHAR(?) NOT NULL )"
217+
),
218+
"resource" to mapOf(
219+
"process.runtime.version" to "17.0.4.1+1",
220+
"telemetry.auto.version" to "sentry-6.7.0-otel-1.19.2"
221+
)
222+
)
223+
tracer.setContext("otel", otelContext)
224+
tracer.finish()
225+
226+
verify(fixture.hub).captureTransaction(
227+
check {
228+
assertEquals(otelContext, it.contexts["otel"])
229+
},
230+
anyOrNull<TraceContext>(),
231+
anyOrNull()
232+
)
233+
}
234+
210235
@Test
211236
fun `returns sentry-trace header`() {
212237
val tracer = fixture.getSut()

0 commit comments

Comments
 (0)