Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

### Features

- Add API to clear feature flags from scopes ([#5426](https://github.com/getsentry/sentry-java/pull/5426))
- Add support to configure reporting historical ANRs via `AndroidManifest.xml` using the `io.sentry.anr.report-historical` attribute ([#5387](https://github.com/getsentry/sentry-java/pull/5387))

## 8.41.0
Expand Down
8 changes: 8 additions & 0 deletions sentry/api/sentry.api
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,7 @@ public final class io/sentry/CombinedScopeView : io/sentry/IScope {
public fun clear ()V
public fun clearAttachments ()V
public fun clearBreadcrumbs ()V
public fun clearFeatureFlags ()V
public fun clearSession ()V
public fun clearTransaction ()V
public fun clone ()Lio/sentry/IScope;
Expand Down Expand Up @@ -901,6 +902,7 @@ public abstract interface class io/sentry/IScope {
public abstract fun clear ()V
public abstract fun clearAttachments ()V
public abstract fun clearBreadcrumbs ()V
public abstract fun clearFeatureFlags ()V
public abstract fun clearSession ()V
public abstract fun clearTransaction ()V
public abstract fun clone ()Lio/sentry/IScope;
Expand Down Expand Up @@ -1715,6 +1717,7 @@ public final class io/sentry/NoOpScope : io/sentry/IScope {
public fun clear ()V
public fun clearAttachments ()V
public fun clearBreadcrumbs ()V
public fun clearFeatureFlags ()V
public fun clearSession ()V
public fun clearTransaction ()V
public fun clone ()Lio/sentry/IScope;
Expand Down Expand Up @@ -2401,6 +2404,7 @@ public final class io/sentry/Scope : io/sentry/IScope {
public fun clear ()V
public fun clearAttachments ()V
public fun clearBreadcrumbs ()V
public fun clearFeatureFlags ()V
public fun clearSession ()V
public fun clearTransaction ()V
public fun clone ()Lio/sentry/IScope;
Expand Down Expand Up @@ -5039,6 +5043,7 @@ public final class io/sentry/exception/SentryHttpClientException : java/lang/Exc

public final class io/sentry/featureflags/FeatureFlagBuffer : io/sentry/featureflags/IFeatureFlagBuffer {
public fun add (Ljava/lang/String;Ljava/lang/Boolean;)V
public fun clear ()V
public fun clone ()Lio/sentry/featureflags/IFeatureFlagBuffer;
public synthetic fun clone ()Ljava/lang/Object;
public static fun create (Lio/sentry/SentryOptions;)Lio/sentry/featureflags/IFeatureFlagBuffer;
Expand All @@ -5048,13 +5053,15 @@ public final class io/sentry/featureflags/FeatureFlagBuffer : io/sentry/featuref

public abstract interface class io/sentry/featureflags/IFeatureFlagBuffer {
public abstract fun add (Ljava/lang/String;Ljava/lang/Boolean;)V
public abstract fun clear ()V
public abstract fun clone ()Lio/sentry/featureflags/IFeatureFlagBuffer;
public abstract fun getFeatureFlags ()Lio/sentry/protocol/FeatureFlags;
}

public final class io/sentry/featureflags/NoOpFeatureFlagBuffer : io/sentry/featureflags/IFeatureFlagBuffer {
public fun <init> ()V
public fun add (Ljava/lang/String;Ljava/lang/Boolean;)V
public fun clear ()V
public fun clone ()Lio/sentry/featureflags/IFeatureFlagBuffer;
public synthetic fun clone ()Ljava/lang/Object;
public fun getFeatureFlags ()Lio/sentry/protocol/FeatureFlags;
Expand All @@ -5063,6 +5070,7 @@ public final class io/sentry/featureflags/NoOpFeatureFlagBuffer : io/sentry/feat

public final class io/sentry/featureflags/SpanFeatureFlagBuffer : io/sentry/featureflags/IFeatureFlagBuffer {
public fun add (Ljava/lang/String;Ljava/lang/Boolean;)V
public fun clear ()V
public fun clone ()Lio/sentry/featureflags/IFeatureFlagBuffer;
public synthetic fun clone ()Ljava/lang/Object;
public static fun create ()Lio/sentry/featureflags/IFeatureFlagBuffer;
Expand Down
5 changes: 5 additions & 0 deletions sentry/src/main/java/io/sentry/CombinedScopeView.java
Original file line number Diff line number Diff line change
Expand Up @@ -549,6 +549,11 @@ public void addFeatureFlag(final @Nullable String flag, final @Nullable Boolean
}
}

@Override
public void clearFeatureFlags() {
getDefaultWriteScope().clearFeatureFlags();
}

@Override
public @Nullable FeatureFlags getFeatureFlags() {
return getFeatureFlagBuffer().getFeatureFlags();
Expand Down
2 changes: 2 additions & 0 deletions sentry/src/main/java/io/sentry/IScope.java
Original file line number Diff line number Diff line change
Expand Up @@ -465,6 +465,8 @@ void setSpanContext(

void addFeatureFlag(final @Nullable String flag, final @Nullable Boolean result);

void clearFeatureFlags();

@ApiStatus.Internal
@Nullable
FeatureFlags getFeatureFlags();
Expand Down
3 changes: 3 additions & 0 deletions sentry/src/main/java/io/sentry/NoOpScope.java
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,9 @@ public void removeAttribute(@Nullable String key) {}
@Override
public void addFeatureFlag(final @Nullable String flag, final @Nullable Boolean result) {}

@Override
public void clearFeatureFlags() {}

@Override
public @Nullable FeatureFlags getFeatureFlags() {
return null;
Expand Down
6 changes: 6 additions & 0 deletions sentry/src/main/java/io/sentry/Scope.java
Original file line number Diff line number Diff line change
Expand Up @@ -574,6 +574,7 @@ public void clear() {
eventProcessors.clear();
clearTransaction();
clearAttachments();
clearFeatureFlags();
}

/**
Expand Down Expand Up @@ -1211,6 +1212,11 @@ public void addFeatureFlag(final @Nullable String flag, final @Nullable Boolean
featureFlags.add(flag, result);
}

@Override
public void clearFeatureFlags() {
featureFlags.clear();
}

@Override
public @Nullable FeatureFlags getFeatureFlags() {
return featureFlags.getFeatureFlags();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,13 @@ public void add(final @Nullable String flag, final @Nullable Boolean result) {
}
}

@Override
public void clear() {
try (final @NotNull ISentryLifecycleToken ignored = lock.acquire()) {
flags.clear();
}
}

@Override
public @Nullable FeatureFlags getFeatureFlags() {
List<FeatureFlag> featureFlags = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
public interface IFeatureFlagBuffer {
void add(final @Nullable String flag, final @Nullable Boolean result);

void clear();

@Nullable
FeatureFlags getFeatureFlags();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ public static NoOpFeatureFlagBuffer getInstance() {
@Override
public void add(final @Nullable String flag, final @Nullable Boolean result) {}

@Override
public void clear() {}

@Override
public @Nullable FeatureFlags getFeatureFlags() {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,13 @@ public void add(final @Nullable String flag, final @Nullable Boolean result) {
}
}

@Override
public void clear() {
try (final @NotNull ISentryLifecycleToken ignored = lock.acquire()) {
flags = null;
}
}

@Override
public @Nullable FeatureFlags getFeatureFlags() {
try (final @NotNull ISentryLifecycleToken ignored = lock.acquire()) {
Expand Down
14 changes: 14 additions & 0 deletions sentry/src/test/java/io/sentry/ScopeTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,7 @@ class ScopeTest {
scope.setAttribute("some", "attribute")
scope.addEventProcessor(eventProcessor())
scope.addAttachment(Attachment("path"))
scope.addFeatureFlag("flag", true)

scope.clear()

Expand All @@ -309,6 +310,7 @@ class ScopeTest {
assertEquals(0, scope.extras.size)
assertEquals(0, scope.eventProcessors.size)
assertEquals(0, scope.attachments.size)
assertEquals(0, scope.featureFlags!!.values.size)
}

@Test
Expand Down Expand Up @@ -1155,6 +1157,18 @@ class ScopeTest {
assertEquals(0, flags.values.size)
}

@Test
fun `feature flags can be cleared`() {
val scope = Scope(SentryOptions.empty())

scope.addFeatureFlag("flag1", true)
scope.clearFeatureFlags()

val flags = scope.featureFlags
assertNotNull(flags)
assertEquals(0, flags.values.size)
}

@Test
fun `setAttribute stores attribute on scope`() {
val scope = Scope(SentryOptions())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,19 @@ class FeatureFlagBufferTest {
assertFalse(featureFlagValues[1]!!.result)
}

@Test
fun `clears values`() {
val buffer = FeatureFlagBuffer.create(SentryOptions().also { it.maxFeatureFlags = 2 })
buffer.add("a", true)
buffer.add("b", false)

buffer.clear()

val featureFlags = buffer.featureFlags
assertNotNull(featureFlags)
assertEquals(0, featureFlags.values.size)
}

@Test
fun `drops oldest entry when limit is reached`() {
val buffer = FeatureFlagBuffer.create(SentryOptions().also { it.maxFeatureFlags = 2 })
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertFalse
import kotlin.test.assertNotNull
import kotlin.test.assertNull
import kotlin.test.assertTrue

class SpanFeatureFlagBufferTest {
Expand All @@ -26,6 +27,17 @@ class SpanFeatureFlagBufferTest {
assertFalse(featureFlagValues[1]!!.result)
}

@Test
fun `clears values`() {
val buffer = SpanFeatureFlagBuffer.create()
buffer.add("a", true)
buffer.add("b", false)

buffer.clear()

assertNull(buffer.featureFlags)
}

@Test
fun `rejects new entries when limit is reached`() {
val buffer = SpanFeatureFlagBuffer.create()
Expand Down
Loading