From 64674aeca7d93bb5a54a2301f749b5b7d0a9a8e3 Mon Sep 17 00:00:00 2001 From: "christian.lutnik" Date: Tue, 13 May 2025 16:44:08 +0200 Subject: [PATCH 1/5] NOISSUE add logging on provider state transitions Signed-off-by: christian.lutnik --- .../sdk/FeatureProviderStateManager.java | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/src/main/java/dev/openfeature/sdk/FeatureProviderStateManager.java b/src/main/java/dev/openfeature/sdk/FeatureProviderStateManager.java index 2c39ece6b..53bb3b8a0 100644 --- a/src/main/java/dev/openfeature/sdk/FeatureProviderStateManager.java +++ b/src/main/java/dev/openfeature/sdk/FeatureProviderStateManager.java @@ -2,14 +2,14 @@ import dev.openfeature.sdk.exceptions.OpenFeatureError; import java.util.concurrent.atomic.AtomicBoolean; -import lombok.Getter; +import java.util.concurrent.atomic.AtomicReference; +import lombok.extern.slf4j.Slf4j; +@Slf4j class FeatureProviderStateManager implements EventProviderListener { private final FeatureProvider delegate; private final AtomicBoolean isInitialized = new AtomicBoolean(); - - @Getter - private ProviderState state = ProviderState.NOT_READY; + private final AtomicReference state = new AtomicReference<>(ProviderState.NOT_READY); public FeatureProviderStateManager(FeatureProvider delegate) { this.delegate = delegate; @@ -24,17 +24,17 @@ public void initialize(EvaluationContext evaluationContext) throws Exception { } try { delegate.initialize(evaluationContext); - state = ProviderState.READY; + setState(ProviderState.READY); } catch (OpenFeatureError openFeatureError) { if (ErrorCode.PROVIDER_FATAL.equals(openFeatureError.getErrorCode())) { - state = ProviderState.FATAL; + setState(ProviderState.FATAL); } else { - state = ProviderState.ERROR; + setState(ProviderState.ERROR); } isInitialized.set(false); throw openFeatureError; } catch (Exception e) { - state = ProviderState.ERROR; + setState(ProviderState.ERROR); isInitialized.set(false); throw e; } @@ -42,7 +42,7 @@ public void initialize(EvaluationContext evaluationContext) throws Exception { public void shutdown() { delegate.shutdown(); - state = ProviderState.NOT_READY; + setState(ProviderState.NOT_READY); isInitialized.set(false); } @@ -50,17 +50,32 @@ public void shutdown() { public void onEmit(ProviderEvent event, ProviderEventDetails details) { if (ProviderEvent.PROVIDER_ERROR.equals(event)) { if (details != null && details.getErrorCode() == ErrorCode.PROVIDER_FATAL) { - state = ProviderState.FATAL; + setState(ProviderState.FATAL); } else { - state = ProviderState.ERROR; + setState(ProviderState.ERROR); } } else if (ProviderEvent.PROVIDER_STALE.equals(event)) { - state = ProviderState.STALE; + setState(ProviderState.STALE); } else if (ProviderEvent.PROVIDER_READY.equals(event)) { - state = ProviderState.READY; + setState(ProviderState.READY); + } + } + + private void setState(ProviderState state) { + ProviderState oldState = this.state.getAndSet(state); + if (oldState != state) { + log.info( + "Provider {} transitioned from state {} to state {}", + delegate.getMetadata().getName(), + oldState, + state); } } + public ProviderState getState() { + return state.get(); + } + FeatureProvider getProvider() { return delegate; } From 766ce104a3baee1b7130af7523486cad01453d1f Mon Sep 17 00:00:00 2001 From: "christian.lutnik" Date: Tue, 13 May 2025 16:53:41 +0200 Subject: [PATCH 2/5] fix npe Signed-off-by: christian.lutnik --- .../dev/openfeature/sdk/FeatureProviderStateManager.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/openfeature/sdk/FeatureProviderStateManager.java b/src/main/java/dev/openfeature/sdk/FeatureProviderStateManager.java index 53bb3b8a0..639e94c5c 100644 --- a/src/main/java/dev/openfeature/sdk/FeatureProviderStateManager.java +++ b/src/main/java/dev/openfeature/sdk/FeatureProviderStateManager.java @@ -64,9 +64,15 @@ public void onEmit(ProviderEvent event, ProviderEventDetails details) { private void setState(ProviderState state) { ProviderState oldState = this.state.getAndSet(state); if (oldState != state) { + String providerName; + if (delegate.getMetadata() == null || delegate.getMetadata().getName() == null) { + providerName = "unknown"; + } else { + providerName = delegate.getMetadata().getName(); + } log.info( "Provider {} transitioned from state {} to state {}", - delegate.getMetadata().getName(), + providerName, oldState, state); } From a462dbef6a6d3564b1b32d1ba9ab60d8c6a7802a Mon Sep 17 00:00:00 2001 From: "christian.lutnik" Date: Tue, 13 May 2025 17:01:03 +0200 Subject: [PATCH 3/5] fix failing test Signed-off-by: christian.lutnik --- .../dev/openfeature/sdk/FeatureProviderStateManager.java | 6 +----- src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java | 3 ++- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/dev/openfeature/sdk/FeatureProviderStateManager.java b/src/main/java/dev/openfeature/sdk/FeatureProviderStateManager.java index 639e94c5c..5fd70221b 100644 --- a/src/main/java/dev/openfeature/sdk/FeatureProviderStateManager.java +++ b/src/main/java/dev/openfeature/sdk/FeatureProviderStateManager.java @@ -70,11 +70,7 @@ private void setState(ProviderState state) { } else { providerName = delegate.getMetadata().getName(); } - log.info( - "Provider {} transitioned from state {} to state {}", - providerName, - oldState, - state); + log.info("Provider {} transitioned from state {} to state {}", providerName, oldState, state); } } diff --git a/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java b/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java index e8e8b27b0..18d2bed2f 100644 --- a/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java +++ b/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java @@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.assertThatCode; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -112,7 +113,7 @@ void featureProviderTrackIsCalled() throws Exception { api.getClient().track("track-event", new ImmutableContext(), new MutableTrackingEventDetails(22.2f)); verify(featureProvider).initialize(any()); - verify(featureProvider).getMetadata(); + verify(featureProvider, atLeastOnce()).getMetadata(); verify(featureProvider).track(any(), any(), any()); } } From eafc87bf5444e73387769da00cf68943b57aa662 Mon Sep 17 00:00:00 2001 From: "christian.lutnik" Date: Tue, 13 May 2025 17:01:37 +0200 Subject: [PATCH 4/5] fix failing test Signed-off-by: christian.lutnik --- src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java b/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java index 18d2bed2f..c533df08c 100644 --- a/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java +++ b/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java @@ -6,6 +6,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import dev.openfeature.sdk.providers.memory.InMemoryProvider; @@ -113,7 +114,7 @@ void featureProviderTrackIsCalled() throws Exception { api.getClient().track("track-event", new ImmutableContext(), new MutableTrackingEventDetails(22.2f)); verify(featureProvider).initialize(any()); - verify(featureProvider, atLeastOnce()).getMetadata(); + verify(featureProvider, times(2)).getMetadata(); verify(featureProvider).track(any(), any(), any()); } } From d43d0b9543056e3e883eab5e715f73a13730544e Mon Sep 17 00:00:00 2001 From: "christian.lutnik" Date: Wed, 14 May 2025 08:41:25 +0200 Subject: [PATCH 5/5] format Signed-off-by: christian.lutnik --- src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java b/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java index c533df08c..66fd06d55 100644 --- a/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java +++ b/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java @@ -4,7 +4,6 @@ import static org.assertj.core.api.Assertions.assertThatCode; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify;