Skip to content

Commit 747ca31

Browse files
authored
Merge pull request #523 from splitio/impression-toggle
Impression toggle
2 parents 37d53ad + 18d050c commit 747ca31

32 files changed

+998
-276
lines changed

CHANGES.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
4.14.0 (Dec X, 2024)
2+
- Added support for Impression Toggle in feature flags
3+
14
4.13.1 (Dec 5, 2024)
25
- Updated `org.apache.httpcomponents.client5` dependency to 5.4.1 to fix vulnerabilities.
36
- Updated `redis.clients` dependency to 4.4.8 to fix vulnerabilities.

client/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
<parent>
66
<groupId>io.split.client</groupId>
77
<artifactId>java-client-parent</artifactId>
8-
<version>4.13.1</version>
8+
<version>4.14.0-rc1</version>
99
</parent>
10-
<version>4.13.1</version>
10+
<version>4.14.0-rc1</version>
1111
<artifactId>java-client</artifactId>
1212
<packaging>jar</packaging>
1313
<name>Java Client</name>

client/src/main/java/io/split/client/CacheUpdaterService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void updateCache(Map<SplitAndKey, LocalhostSplit> map) {
5252
String treatment = conditions.size() > 0 ? Treatments.CONTROL : localhostSplit.treatment;
5353
configurations.put(localhostSplit.treatment, localhostSplit.config);
5454

55-
split = new ParsedSplit(splitName, 0, false, treatment,conditions, LOCALHOST, 0, 100, 0, 0, configurations, new HashSet<>());
55+
split = new ParsedSplit(splitName, 0, false, treatment,conditions, LOCALHOST, 0, 100, 0, 0, configurations, new HashSet<>(), true);
5656
parsedSplits.removeIf(parsedSplit -> parsedSplit.feature().equals(splitName));
5757
parsedSplits.add(split);
5858
}

client/src/main/java/io/split/client/HttpSplitChangeFetcher.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ public SplitChange fetch(long since, FetchOptions options) {
8282
String.format("Could not retrieve splitChanges since %s; http return code %s", since, response.statusCode())
8383
);
8484
}
85-
8685
return Json.fromJson(response.body(), SplitChange.class);
8786
} catch (Exception e) {
8887
throw new IllegalStateException(String.format("Problem fetching splitChanges since %s: %s", since, e), e);

client/src/main/java/io/split/client/SplitClientImpl.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.split.client.api.Key;
44
import io.split.client.api.SplitResult;
5+
import io.split.client.dtos.DecoratedImpression;
56
import io.split.client.dtos.Event;
67
import io.split.client.events.EventsStorageProducer;
78
import io.split.client.impressions.Impression;
@@ -356,7 +357,8 @@ private SplitResult getTreatmentWithConfigInternal(String matchingKey, String bu
356357
String.format("sdk.%s", methodEnum.getMethod()),
357358
_config.labelsEnabled() ? result.label : null,
358359
result.changeNumber,
359-
attributes
360+
attributes,
361+
result.track
360362
);
361363
_telemetryEvaluationProducer.recordLatency(methodEnum, System.currentTimeMillis() - initTime);
362364
return new SplitResult(result.treatment, result.configurations);
@@ -435,7 +437,7 @@ private Map<String, SplitResult> getTreatmentsBySetsWithConfigInternal(String ma
435437
private Map<String, SplitResult> processEvaluatorResult(Map<String, EvaluatorImp.TreatmentLabelAndChangeNumber> evaluatorResult,
436438
MethodEnum methodEnum, String matchingKey, String bucketingKey, Map<String,
437439
Object> attributes, long initTime){
438-
List<Impression> impressions = new ArrayList<>();
440+
List<DecoratedImpression> decoratedImpressions = new ArrayList<>();
439441
Map<String, SplitResult> result = new HashMap<>();
440442
evaluatorResult.keySet().forEach(t -> {
441443
if (evaluatorResult.get(t).treatment.equals(Treatments.CONTROL) && evaluatorResult.get(t).label.
@@ -445,13 +447,16 @@ private Map<String, SplitResult> processEvaluatorResult(Map<String, EvaluatorImp
445447
result.put(t, SPLIT_RESULT_CONTROL);
446448
} else {
447449
result.put(t, new SplitResult(evaluatorResult.get(t).treatment, evaluatorResult.get(t).configurations));
448-
impressions.add(new Impression(matchingKey, bucketingKey, t, evaluatorResult.get(t).treatment, System.currentTimeMillis(),
449-
evaluatorResult.get(t).label, evaluatorResult.get(t).changeNumber, attributes));
450+
decoratedImpressions.add(
451+
new DecoratedImpression(
452+
new Impression(matchingKey, bucketingKey, t, evaluatorResult.get(t).treatment, System.currentTimeMillis(),
453+
evaluatorResult.get(t).label, evaluatorResult.get(t).changeNumber, attributes),
454+
evaluatorResult.get(t).track));
450455
}
451456
});
452457
_telemetryEvaluationProducer.recordLatency(methodEnum, System.currentTimeMillis() - initTime);
453-
if (impressions.size() > 0) {
454-
_impressionManager.track(impressions);
458+
if (!decoratedImpressions.isEmpty()) {
459+
_impressionManager.track(decoratedImpressions);
455460
}
456461
return result;
457462
}
@@ -501,10 +506,13 @@ private Set<String> filterSetsAreInConfig(Set<String> sets, MethodEnum methodEnu
501506
return setsToReturn;
502507
}
503508
private void recordStats(String matchingKey, String bucketingKey, String featureFlagName, long start, String result,
504-
String operation, String label, Long changeNumber, Map<String, Object> attributes) {
509+
String operation, String label, Long changeNumber, Map<String, Object> attributes, boolean track) {
505510
try {
506-
_impressionManager.track(Stream.of(new Impression(matchingKey, bucketingKey, featureFlagName, result, System.currentTimeMillis(),
507-
label, changeNumber, attributes)).collect(Collectors.toList()));
511+
_impressionManager.track(Stream.of(
512+
new DecoratedImpression(
513+
new Impression(matchingKey, bucketingKey, featureFlagName, result, System.currentTimeMillis(),
514+
label, changeNumber, attributes),
515+
track)).collect(Collectors.toList()));
508516
} catch (Throwable t) {
509517
_log.error("Exception", t);
510518
}

client/src/main/java/io/split/client/SplitFactoryImpl.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -630,13 +630,14 @@ private ImpressionsManagerImpl buildImpressionsManager(SplitClientConfig config,
630630
.collect(Collectors.toCollection(() -> impressionListeners));
631631
}
632632
ProcessImpressionStrategy processImpressionStrategy = null;
633-
ImpressionCounter counter = null;
633+
ImpressionCounter counter = new ImpressionCounter();
634634
ImpressionListener listener = !impressionListeners.isEmpty()
635635
? new ImpressionListener.FederatedImpressionListener(impressionListeners)
636636
: null;
637+
ProcessImpressionNone processImpressionNone = new ProcessImpressionNone(listener != null, _uniqueKeysTracker, counter);
638+
637639
switch (config.impressionsMode()) {
638640
case OPTIMIZED:
639-
counter = new ImpressionCounter();
640641
ImpressionObserver impressionObserver = new ImpressionObserver(config.getLastSeenCacheSize());
641642
processImpressionStrategy = new ProcessImpressionOptimized(listener != null, impressionObserver,
642643
counter, _telemetryStorageProducer);
@@ -646,13 +647,12 @@ private ImpressionsManagerImpl buildImpressionsManager(SplitClientConfig config,
646647
processImpressionStrategy = new ProcessImpressionDebug(listener != null, impressionObserver);
647648
break;
648649
case NONE:
649-
counter = new ImpressionCounter();
650-
processImpressionStrategy = new ProcessImpressionNone(listener != null, _uniqueKeysTracker, counter);
650+
processImpressionStrategy = processImpressionNone;
651651
break;
652652
}
653653
return ImpressionsManagerImpl.instance(config, _telemetryStorageProducer, impressionsStorageConsumer,
654654
impressionsStorageProducer,
655-
_impressionsSender, processImpressionStrategy, counter, listener);
655+
_impressionsSender, processImpressionNone, processImpressionStrategy, counter, listener);
656656
}
657657

658658
private SDKMetadata createSdkMetadata(boolean ipAddressEnabled, String splitSdkVersion) {
@@ -690,15 +690,12 @@ private void manageSdkReady(SplitClientConfig config) {
690690
}
691691

692692
private UniqueKeysTracker createUniqueKeysTracker(SplitClientConfig config) {
693-
if (config.impressionsMode().equals(ImpressionsManager.Mode.NONE)) {
694-
int uniqueKeysRefreshRate = config.operationMode().equals(OperationMode.STANDALONE)
695-
? config.uniqueKeysRefreshRateInMemory()
696-
: config.uniqueKeysRefreshRateRedis();
697-
return new UniqueKeysTrackerImp(_telemetrySynchronizer, uniqueKeysRefreshRate,
698-
config.filterUniqueKeysRefreshRate(),
699-
config.getThreadFactory());
700-
}
701-
return null;
693+
int uniqueKeysRefreshRate = config.operationMode().equals(OperationMode.STANDALONE)
694+
? config.uniqueKeysRefreshRateInMemory()
695+
: config.uniqueKeysRefreshRateRedis();
696+
return new UniqueKeysTrackerImp(_telemetrySynchronizer, uniqueKeysRefreshRate,
697+
config.filterUniqueKeysRefreshRate(),
698+
config.getThreadFactory());
702699
}
703700

704701
private SplitChangeFetcher createSplitChangeFetcher(SplitClientConfig splitClientConfig) {

client/src/main/java/io/split/client/api/SplitView.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public class SplitView {
2626
public Map<String, String> configs;
2727
public List<String> sets;
2828
public String defaultTreatment;
29+
public boolean trackImpression;
2930

3031
public static SplitView fromParsedSplit(ParsedSplit parsedSplit) {
3132
SplitView splitView = new SplitView();
@@ -46,6 +47,7 @@ public static SplitView fromParsedSplit(ParsedSplit parsedSplit) {
4647

4748
splitView.treatments = new ArrayList<String>(treatments);
4849
splitView.configs = parsedSplit.configurations() == null? Collections.<String, String>emptyMap() : parsedSplit.configurations() ;
50+
splitView.trackImpression = parsedSplit.trackImpression();
4951

5052
return splitView;
5153
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.split.client.dtos;
2+
3+
import io.split.client.impressions.Impression;
4+
5+
public class DecoratedImpression {
6+
private Impression impression;
7+
private boolean track;
8+
9+
public DecoratedImpression(Impression impression, boolean track) {
10+
this.impression = impression;
11+
this.track = track;
12+
}
13+
14+
public Impression impression() { return this.impression;}
15+
16+
public boolean track() { return this.track;}
17+
}
18+

client/src/main/java/io/split/client/dtos/Split.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public class Split {
1818
public int algo;
1919
public Map<String, String> configurations;
2020
public HashSet<String> sets;
21+
public Boolean trackImpression = null;
2122

2223
@Override
2324
public String toString() {

client/src/main/java/io/split/client/impressions/HttpImpressionsSender.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,6 @@ public void postImpressionsBulk(List<TestImpressions> impressions) {
9191
@Override
9292
public void postCounters(HashMap<ImpressionCounter.Key, Integer> raw) {
9393
long initTime = System.currentTimeMillis();
94-
if (_mode.equals(ImpressionsManager.Mode.DEBUG)) {
95-
_logger.warn("Attempted to submit counters in impressions debugging mode. Ignoring");
96-
return;
97-
}
98-
9994
try {
10095

10196
Map<String, List<String>> additionalHeaders = new HashMap<>();

0 commit comments

Comments
 (0)