Skip to content

Commit a4b6ca3

Browse files
committed
e2e tests; fix POTel feature flags
1 parent 9194849 commit a4b6ca3

File tree

25 files changed

+171
-35
lines changed

25 files changed

+171
-35
lines changed

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424
import io.sentry.SpanStatus;
2525
import io.sentry.TraceContext;
2626
import io.sentry.TracesSamplingDecision;
27-
import io.sentry.featureflags.IFeatureFlagBuffer;
28-
import io.sentry.featureflags.SpanFeatureFlagBuffer;
2927
import io.sentry.protocol.Contexts;
3028
import io.sentry.protocol.MeasurementValue;
3129
import io.sentry.protocol.SentryId;

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@
3333
import io.sentry.SpanStatus;
3434
import io.sentry.TransactionContext;
3535
import io.sentry.TransactionOptions;
36+
import io.sentry.featureflags.IFeatureFlagBuffer;
3637
import io.sentry.protocol.Contexts;
38+
import io.sentry.protocol.FeatureFlag;
39+
import io.sentry.protocol.FeatureFlags;
3740
import io.sentry.protocol.SentryId;
3841
import io.sentry.protocol.TransactionNameSource;
3942
import java.util.Arrays;
@@ -260,6 +263,16 @@ private void transferSpanDetails(
260263
targetSpan.setData(entry.getKey(), entry.getValue());
261264
}
262265

266+
final @NotNull SpanContext spanContext = sourceSpan.getSpanContext();
267+
final @NotNull IFeatureFlagBuffer featureFlagBuffer = spanContext.getFeatureFlagBuffer();
268+
final @Nullable FeatureFlags featureFlags = featureFlagBuffer.getFeatureFlags();
269+
if (featureFlags != null) {
270+
for (FeatureFlag featureFlag : featureFlags.getValues()) {
271+
targetSpan.setData(
272+
FeatureFlag.DATA_PREFIX + featureFlag.getFlag(), featureFlag.getResult());
273+
}
274+
}
275+
263276
final @NotNull Map<String, String> tags = sourceSpan.getTags();
264277
for (Map.Entry<String, String> entry : tags.entrySet()) {
265278
targetSpan.setTag(entry.getKey(), entry.getValue());

sentry-samples/sentry-samples-spring-boot-4-opentelemetry-noagent/src/main/java/io/sentry/samples/spring/boot4/PersonController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,13 @@ public PersonController(PersonService personService, Tracer tracer) {
3131
@GetMapping("{id}")
3232
@WithSpan("personSpanThroughOtelAnnotation")
3333
Person person(@PathVariable Long id) {
34+
Sentry.addFeatureFlag("outer-feature-flag", true);
3435
Span span = tracer.spanBuilder("spanCreatedThroughOtelApi").startSpan();
3536
try (final @NotNull Scope spanScope = span.makeCurrent()) {
3637
Sentry.logger().warn("warn Sentry logging");
3738
Sentry.logger().error("error Sentry logging");
3839
Sentry.logger().info("hello %s %s", "there", "world!");
39-
Sentry.addFeatureFlag("my-feature-flag", true);
40+
Sentry.addFeatureFlag("inner-feature-flag", true);
4041
ISpan currentSpan = Sentry.getSpan();
4142
ISpan sentrySpan = currentSpan.startChild("spanCreatedThroughSentryApi");
4243
try {

sentry-samples/sentry-samples-spring-boot-4-opentelemetry-noagent/src/test/kotlin/io/sentry/systemtest/PersonSystemTest.kt

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

3+
import io.sentry.protocol.FeatureFlag
34
import io.sentry.systemtest.util.TestHelper
45
import kotlin.test.Test
56
import kotlin.test.assertEquals
@@ -22,17 +23,31 @@ class PersonSystemTest {
2223

2324
testHelper.ensureErrorReceived { event ->
2425
event.message?.formatted == "Trying person with id=1" &&
25-
testHelper.doesEventHaveFlag(event, "my-feature-flag", true)
26+
testHelper.doesEventHaveFlag(event, "inner-feature-flag", true)
2627
}
2728

2829
testHelper.ensureErrorReceived { event ->
2930
testHelper.doesEventHaveExceptionMessage(event, "Something went wrong [id=1]") &&
30-
testHelper.doesEventHaveFlag(event, "my-feature-flag", true)
31+
testHelper.doesEventHaveFlag(event, "inner-feature-flag", true)
3132
}
3233

3334
testHelper.ensureTransactionReceived { transaction, envelopeHeader ->
34-
testHelper.doesTransactionContainSpanWithOp(transaction, "spanCreatedThroughOtelApi") &&
35-
testHelper.doesTransactionContainSpanWithOp(transaction, "spanCreatedThroughSentryApi")
35+
testHelper.doesTransactionHave(transaction, op = "http.server") &&
36+
testHelper.doesTransactionHaveSpanWith(
37+
transaction,
38+
op = "personSpanThroughOtelAnnotation",
39+
featureFlag = FeatureFlag("flag.evaluation.outer-feature-flag", true),
40+
) &&
41+
testHelper.doesTransactionHaveSpanWith(
42+
transaction,
43+
op = "spanCreatedThroughOtelApi",
44+
featureFlag = FeatureFlag("flag.evaluation.inner-feature-flag", true),
45+
) &&
46+
testHelper.doesTransactionHaveSpanWith(
47+
transaction,
48+
op = "spanCreatedThroughSentryApi",
49+
noFeatureFlags = true,
50+
)
3651
}
3752

3853
Thread.sleep(10000)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public PersonController(PersonService personService, Tracer tracer) {
2929

3030
@GetMapping("{id}")
3131
Person person(@PathVariable Long id) {
32+
Sentry.addFeatureFlag("transaction-feature-flag", true);
3233
Span span = tracer.spanBuilder("spanCreatedThroughOtelApi").startSpan();
3334
try (final @NotNull Scope spanScope = span.makeCurrent()) {
3435
Sentry.logger().warn("warn Sentry logging");

sentry-samples/sentry-samples-spring-boot-4-opentelemetry/src/test/kotlin/io/sentry/systemtest/PersonSystemTest.kt

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

3+
import io.sentry.protocol.FeatureFlag
34
import io.sentry.systemtest.util.TestHelper
45
import kotlin.test.Test
56
import kotlin.test.assertEquals
@@ -31,8 +32,17 @@ class PersonSystemTest {
3132
}
3233

3334
testHelper.ensureTransactionReceived { transaction, envelopeHeader ->
34-
testHelper.doesTransactionContainSpanWithOp(transaction, "spanCreatedThroughOtelApi") &&
35-
testHelper.doesTransactionContainSpanWithOp(transaction, "spanCreatedThroughSentryApi")
35+
testHelper.doesTransactionHave(
36+
transaction,
37+
op = "http.server",
38+
featureFlag = FeatureFlag("flag.evaluation.transaction-feature-flag", true),
39+
) &&
40+
testHelper.doesTransactionHaveSpanWith(
41+
transaction,
42+
op = "spanCreatedThroughOtelApi",
43+
featureFlag = FeatureFlag("flag.evaluation.my-feature-flag", true),
44+
)
45+
testHelper.doesTransactionHaveSpanWith(transaction, op = "spanCreatedThroughSentryApi")
3646
}
3747

3848
Thread.sleep(10000)

sentry-samples/sentry-samples-spring-boot-4/src/main/java/io/sentry/samples/spring/boot4/PersonController.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public PersonController(PersonService personService) {
2323

2424
@GetMapping("{id}")
2525
Person person(@PathVariable Long id) {
26+
Sentry.addFeatureFlag("transaction-feature-flag", true);
2627
ISpan currentSpan = Sentry.getSpan();
2728
ISpan sentrySpan = currentSpan.startChild("spanCreatedThroughSentryApi");
2829
try {

sentry-samples/sentry-samples-spring-boot-4/src/test/kotlin/io/sentry/systemtest/PersonSystemTest.kt

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

3+
import io.sentry.protocol.FeatureFlag
34
import io.sentry.systemtest.util.TestHelper
45
import kotlin.test.Test
56
import kotlin.test.assertEquals
@@ -31,7 +32,16 @@ class PersonSystemTest {
3132
}
3233

3334
testHelper.ensureTransactionReceived { transaction, envelopeHeader ->
34-
testHelper.doesTransactionHaveOp(transaction, "http.server")
35+
testHelper.doesTransactionHave(
36+
transaction,
37+
op = "http.server",
38+
featureFlag = FeatureFlag("flag.evaluation.transaction-feature-flag", true),
39+
) &&
40+
testHelper.doesTransactionHaveSpanWith(
41+
transaction,
42+
op = "spanCreatedThroughSentryApi",
43+
featureFlag = FeatureFlag("flag.evaluation.my-feature-flag", true),
44+
)
3545
}
3646

3747
Thread.sleep(10000)

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,13 @@ public PersonController(PersonService personService, Tracer tracer) {
3131
@GetMapping("{id}")
3232
@WithSpan("personSpanThroughOtelAnnotation")
3333
Person person(@PathVariable Long id) {
34+
Sentry.addFeatureFlag("outer-feature-flag", true);
3435
Span span = tracer.spanBuilder("spanCreatedThroughOtelApi").startSpan();
3536
try (final @NotNull Scope spanScope = span.makeCurrent()) {
3637
Sentry.logger().warn("warn Sentry logging");
3738
Sentry.logger().error("error Sentry logging");
3839
Sentry.logger().info("hello %s %s", "there", "world!");
39-
Sentry.addFeatureFlag("my-feature-flag", true);
40+
Sentry.addFeatureFlag("inner-feature-flag", true);
4041
ISpan currentSpan = Sentry.getSpan();
4142
ISpan sentrySpan = currentSpan.startChild("spanCreatedThroughSentryApi");
4243
try {

sentry-samples/sentry-samples-spring-boot-jakarta-opentelemetry-noagent/src/test/kotlin/io/sentry/systemtest/PersonSystemTest.kt

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

3+
import io.sentry.protocol.FeatureFlag
34
import io.sentry.systemtest.util.TestHelper
45
import kotlin.test.Test
56
import kotlin.test.assertEquals
@@ -22,17 +23,31 @@ class PersonSystemTest {
2223

2324
testHelper.ensureErrorReceived { event ->
2425
event.message?.formatted == "Trying person with id=1" &&
25-
testHelper.doesEventHaveFlag(event, "my-feature-flag", true)
26+
testHelper.doesEventHaveFlag(event, "inner-feature-flag", true)
2627
}
2728

2829
testHelper.ensureErrorReceived { event ->
2930
testHelper.doesEventHaveExceptionMessage(event, "Something went wrong [id=1]") &&
30-
testHelper.doesEventHaveFlag(event, "my-feature-flag", true)
31+
testHelper.doesEventHaveFlag(event, "inner-feature-flag", true)
3132
}
3233

3334
testHelper.ensureTransactionReceived { transaction, envelopeHeader ->
34-
testHelper.doesTransactionContainSpanWithOp(transaction, "spanCreatedThroughOtelApi") &&
35-
testHelper.doesTransactionContainSpanWithOp(transaction, "spanCreatedThroughSentryApi")
35+
testHelper.doesTransactionHave(transaction, op = "http.server") &&
36+
testHelper.doesTransactionHaveSpanWith(
37+
transaction,
38+
op = "personSpanThroughOtelAnnotation",
39+
featureFlag = FeatureFlag("flag.evaluation.outer-feature-flag", true),
40+
) &&
41+
testHelper.doesTransactionHaveSpanWith(
42+
transaction,
43+
op = "spanCreatedThroughOtelApi",
44+
featureFlag = FeatureFlag("flag.evaluation.inner-feature-flag", true),
45+
) &&
46+
testHelper.doesTransactionHaveSpanWith(
47+
transaction,
48+
op = "spanCreatedThroughSentryApi",
49+
noFeatureFlags = true,
50+
)
3651
}
3752

3853
Thread.sleep(10000)

0 commit comments

Comments
 (0)