Skip to content

Commit e2813b2

Browse files
chrfwowaepfli
andauthored
feat: add logging on provider state transitions (#1444)
* NOISSUE add logging on provider state transitions Signed-off-by: christian.lutnik <[email protected]> * fix npe Signed-off-by: christian.lutnik <[email protected]> * fix failing test Signed-off-by: christian.lutnik <[email protected]> * fix failing test Signed-off-by: christian.lutnik <[email protected]> * format Signed-off-by: christian.lutnik <[email protected]> --------- Signed-off-by: christian.lutnik <[email protected]> Co-authored-by: Simon Schrottner <[email protected]>
1 parent bc10bac commit e2813b2

File tree

2 files changed

+32
-14
lines changed

2 files changed

+32
-14
lines changed

src/main/java/dev/openfeature/sdk/FeatureProviderStateManager.java

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22

33
import dev.openfeature.sdk.exceptions.OpenFeatureError;
44
import java.util.concurrent.atomic.AtomicBoolean;
5-
import lombok.Getter;
5+
import java.util.concurrent.atomic.AtomicReference;
6+
import lombok.extern.slf4j.Slf4j;
67

8+
@Slf4j
79
class FeatureProviderStateManager implements EventProviderListener {
810
private final FeatureProvider delegate;
911
private final AtomicBoolean isInitialized = new AtomicBoolean();
10-
11-
@Getter
12-
private ProviderState state = ProviderState.NOT_READY;
12+
private final AtomicReference<ProviderState> state = new AtomicReference<>(ProviderState.NOT_READY);
1313

1414
public FeatureProviderStateManager(FeatureProvider delegate) {
1515
this.delegate = delegate;
@@ -24,43 +24,60 @@ public void initialize(EvaluationContext evaluationContext) throws Exception {
2424
}
2525
try {
2626
delegate.initialize(evaluationContext);
27-
state = ProviderState.READY;
27+
setState(ProviderState.READY);
2828
} catch (OpenFeatureError openFeatureError) {
2929
if (ErrorCode.PROVIDER_FATAL.equals(openFeatureError.getErrorCode())) {
30-
state = ProviderState.FATAL;
30+
setState(ProviderState.FATAL);
3131
} else {
32-
state = ProviderState.ERROR;
32+
setState(ProviderState.ERROR);
3333
}
3434
isInitialized.set(false);
3535
throw openFeatureError;
3636
} catch (Exception e) {
37-
state = ProviderState.ERROR;
37+
setState(ProviderState.ERROR);
3838
isInitialized.set(false);
3939
throw e;
4040
}
4141
}
4242

4343
public void shutdown() {
4444
delegate.shutdown();
45-
state = ProviderState.NOT_READY;
45+
setState(ProviderState.NOT_READY);
4646
isInitialized.set(false);
4747
}
4848

4949
@Override
5050
public void onEmit(ProviderEvent event, ProviderEventDetails details) {
5151
if (ProviderEvent.PROVIDER_ERROR.equals(event)) {
5252
if (details != null && details.getErrorCode() == ErrorCode.PROVIDER_FATAL) {
53-
state = ProviderState.FATAL;
53+
setState(ProviderState.FATAL);
5454
} else {
55-
state = ProviderState.ERROR;
55+
setState(ProviderState.ERROR);
5656
}
5757
} else if (ProviderEvent.PROVIDER_STALE.equals(event)) {
58-
state = ProviderState.STALE;
58+
setState(ProviderState.STALE);
5959
} else if (ProviderEvent.PROVIDER_READY.equals(event)) {
60-
state = ProviderState.READY;
60+
setState(ProviderState.READY);
61+
}
62+
}
63+
64+
private void setState(ProviderState state) {
65+
ProviderState oldState = this.state.getAndSet(state);
66+
if (oldState != state) {
67+
String providerName;
68+
if (delegate.getMetadata() == null || delegate.getMetadata().getName() == null) {
69+
providerName = "unknown";
70+
} else {
71+
providerName = delegate.getMetadata().getName();
72+
}
73+
log.info("Provider {} transitioned from state {} to state {}", providerName, oldState, state);
6174
}
6275
}
6376

77+
public ProviderState getState() {
78+
return state.get();
79+
}
80+
6481
FeatureProvider getProvider() {
6582
return delegate;
6683
}

src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import static org.junit.jupiter.api.Assertions.assertEquals;
66
import static org.mockito.ArgumentMatchers.any;
77
import static org.mockito.Mockito.mock;
8+
import static org.mockito.Mockito.times;
89
import static org.mockito.Mockito.verify;
910

1011
import dev.openfeature.sdk.providers.memory.InMemoryProvider;
@@ -112,7 +113,7 @@ void featureProviderTrackIsCalled() throws Exception {
112113
api.getClient().track("track-event", new ImmutableContext(), new MutableTrackingEventDetails(22.2f));
113114

114115
verify(featureProvider).initialize(any());
115-
verify(featureProvider).getMetadata();
116+
verify(featureProvider, times(2)).getMetadata();
116117
verify(featureProvider).track(any(), any(), any());
117118
}
118119
}

0 commit comments

Comments
 (0)