Skip to content

Commit 3bbfaeb

Browse files
authored
Merge pull request #531 from splitio/development
Release 4.14.0
2 parents 3c7925c + 1a7805c commit 3bbfaeb

32 files changed

+1003
-277
lines changed

CHANGES.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
4.14.0 (Jan 17, 2025)
2+
- Added support for the new impressions tracking toggle available on feature flags, both respecting the setting and including the new field being returned on SplitView type objects. Read more in our docs.
3+
- Cleaned unused imports to fix a collision issue.
4+
15
4.13.1 (Dec 5, 2024)
26
- Updated `org.apache.httpcomponents.client5` dependency to 5.4.1 to fix vulnerabilities.
37
- Updated `redis.clients` dependency to 4.4.8 to fix vulnerabilities.

client/pom.xml

Lines changed: 4 additions & 3 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</version>
99
</parent>
10-
<version>4.13.1</version>
10+
<version>4.14.0</version>
1111
<artifactId>java-client</artifactId>
1212
<packaging>jar</packaging>
1313
<name>Java Client</name>
@@ -66,7 +66,8 @@
6666
<include>io.codigo.grammar:*</include>
6767
<include>org.apache.httpcomponents.*</include>
6868
<include>org.apache.hc.*</include>
69-
<include>com.google.*</include>
69+
<include>com.google.code.gson:gson</include>
70+
<include>com.google.guava:guava</include>
7071
<include>org.yaml:snakeyaml:*</include>
7172

7273
<!-- Transitive dependency of guava -->

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 impressionsDisabled;
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.impressionsDisabled = parsedSplit.impressionsDisabled();
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 disabled;
8+
9+
public DecoratedImpression(Impression impression, boolean disabled) {
10+
this.impression = impression;
11+
this.disabled = disabled;
12+
}
13+
14+
public Impression impression() { return this.impression;}
15+
16+
public boolean disabled() { return this.disabled;}
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 impressionsDisabled = 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)