Skip to content

Commit 2320147

Browse files
Fixing PR Comments
1 parent 8559aba commit 2320147

25 files changed

+262
-75
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ public SplitFactoryImpl(String apiToken, SplitClientConfig config) throws URISyn
124124
// Cache Initialisations
125125
_segmentCache = new SegmentCacheInMemoryImpl();
126126
_splitCache = new InMemoryCacheImp();
127-
_telemetrySynchronizer = new SynchronizerMemory(_httpclient, URI.create(config.get_telemetryURL()), _telemetryStorage, _splitCache, _segmentCache);
127+
_telemetrySynchronizer = new SynchronizerMemory(_httpclient, URI.create(config.get_telemetryURL()), _telemetryStorage, _splitCache, _segmentCache, _telemetryStorage);
128128
_telemetrySyncTask = new TelemetrySyncTask(config.get_telemetryRefreshRate(), _telemetrySynchronizer);
129129

130130
// Segments
@@ -185,14 +185,14 @@ public synchronized void destroy() {
185185
_log.info("Successful shutdown of splits");
186186
_impressionsManager.close();
187187
_log.info("Successful shutdown of impressions manager");
188-
_httpclient.close();
189-
_log.info("Successful shutdown of httpclient");
190188
_eventClient.close();
191189
_log.info("Successful shutdown of eventClient");
192190
_syncManager.shutdown();
193191
_log.info("Successful shutdown of syncManager");
194192
_telemetryStorage.recordSessionLength(System.currentTimeMillis() - _startTime);
195193
_telemetrySyncTask.stopScheduledTask();
194+
_httpclient.close();
195+
_log.info("Successful shutdown of httpclient");
196196
} catch (IOException e) {
197197
_log.error("We could not shutdown split", e);
198198
}

client/src/main/java/io/split/engine/common/PushManagerImp.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import io.split.engine.sse.workers.SplitsWorkerImp;
1717
import io.split.engine.sse.workers.Worker;
1818

19+
import io.split.telemetry.domain.StreamingEvent;
20+
import io.split.telemetry.domain.enums.StreamEventsEnum;
1921
import io.split.telemetry.storage.TelemetryRuntimeProducer;
2022
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
2123
import org.slf4j.Logger;
@@ -42,13 +44,15 @@ public class PushManagerImp implements PushManager {
4244
private Future<?> _nextTokenRefreshTask;
4345
private final ScheduledExecutorService _scheduledExecutorService;
4446
private AtomicLong _expirationTime;
47+
private final TelemetryRuntimeProducer _telemetryRuntimeProducer;
4548

4649
@VisibleForTesting
4750
/* package private */ PushManagerImp(AuthApiClient authApiClient,
4851
EventSourceClient eventSourceClient,
4952
SplitsWorker splitsWorker,
5053
Worker<SegmentQueueDto> segmentWorker,
51-
PushStatusTracker pushStatusTracker) {
54+
PushStatusTracker pushStatusTracker,
55+
TelemetryRuntimeProducer telemetryRuntimeProducer) {
5256

5357
_authApiClient = checkNotNull(authApiClient);
5458
_eventSourceClient = checkNotNull(eventSourceClient);
@@ -60,6 +64,7 @@ public class PushManagerImp implements PushManager {
6064
.setDaemon(true)
6165
.setNameFormat("Split-SSERefreshToken-%d")
6266
.build());
67+
_telemetryRuntimeProducer = checkNotNull(telemetryRuntimeProducer);
6368
}
6469

6570
public static PushManagerImp build(Synchronizer synchronizer,
@@ -71,12 +76,12 @@ public static PushManagerImp build(Synchronizer synchronizer,
7176
TelemetryRuntimeProducer telemetryRuntimeProducer) {
7277
SplitsWorker splitsWorker = new SplitsWorkerImp(synchronizer);
7378
Worker<SegmentQueueDto> segmentWorker = new SegmentsWorkerImp(synchronizer);
74-
PushStatusTracker pushStatusTracker = new PushStatusTrackerImp(statusMessages);
79+
PushStatusTracker pushStatusTracker = new PushStatusTrackerImp(statusMessages, telemetryRuntimeProducer);
7580
return new PushManagerImp(new AuthApiClientImp(authUrl, httpClient, telemetryRuntimeProducer),
76-
EventSourceClientImp.build(streamingUrl, splitsWorker, segmentWorker, pushStatusTracker, sseHttpClient),
81+
EventSourceClientImp.build(streamingUrl, splitsWorker, segmentWorker, pushStatusTracker, sseHttpClient, telemetryRuntimeProducer),
7782
splitsWorker,
7883
segmentWorker,
79-
pushStatusTracker);
84+
pushStatusTracker, telemetryRuntimeProducer);
8085
}
8186

8287
@Override
@@ -85,6 +90,7 @@ public synchronized void start() {
8590
_log.debug(String.format("Auth service response pushEnabled: %s", response.isPushEnabled()));
8691
if (response.isPushEnabled() && startSse(response.getToken(), response.getChannels())) {
8792
_expirationTime.set(response.getExpiration());
93+
_telemetryRuntimeProducer.recordStreamingEvents(new StreamingEvent(StreamEventsEnum.TOKEN_REFRESH.get_type(), response.getExpiration(), System.currentTimeMillis()));
8894
return;
8995
}
9096

client/src/main/java/io/split/engine/common/SyncManagerImp.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import io.split.engine.experiments.SplitFetcher;
99
import io.split.engine.experiments.SplitSynchronizationTask;
1010
import io.split.engine.segments.SegmentSynchronizationTaskImp;
11+
import io.split.telemetry.domain.StreamingEvent;
12+
import io.split.telemetry.domain.enums.StreamEventsEnum;
1113
import io.split.telemetry.storage.TelemetryRuntimeProducer;
1214
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
1315
import org.slf4j.Logger;
@@ -23,6 +25,8 @@
2325

2426
public class SyncManagerImp implements SyncManager {
2527
private static final Logger _log = LoggerFactory.getLogger(SyncManager.class);
28+
private static final int STREAMING_STREAMING_EVENT = 0;
29+
private static final int POLLING_STREAMING_EVENT = 1;
2630

2731
private final AtomicBoolean _streamingEnabledConfig;
2832
private final Synchronizer _synchronizer;
@@ -34,14 +38,15 @@ public class SyncManagerImp implements SyncManager {
3438
private final SDKReadinessGates _gates;
3539
private Future<?> _pushStatusMonitorTask;
3640
private Backoff _backoff;
41+
private final TelemetryRuntimeProducer _telemetryRuntimeProducer;
3742

3843
@VisibleForTesting
3944
/* package private */ SyncManagerImp(boolean streamingEnabledConfig,
4045
Synchronizer synchronizer,
4146
PushManager pushManager,
4247
LinkedBlockingQueue<PushManager.Status> pushMessages,
4348
int authRetryBackOffBase,
44-
SDKReadinessGates gates) {
49+
SDKReadinessGates gates, TelemetryRuntimeProducer telemetryRuntimeProducer) {
4550
_streamingEnabledConfig = new AtomicBoolean(streamingEnabledConfig);
4651
_synchronizer = checkNotNull(synchronizer);
4752
_pushManager = checkNotNull(pushManager);
@@ -57,6 +62,7 @@ public class SyncManagerImp implements SyncManager {
5762
.build());
5863
_backoff = new Backoff(authRetryBackOffBase);
5964
_gates = checkNotNull(gates);
65+
_telemetryRuntimeProducer = checkNotNull(telemetryRuntimeProducer);
6066
}
6167

6268
public static SyncManagerImp build(boolean streamingEnabledConfig,
@@ -76,13 +82,12 @@ public static SyncManagerImp build(boolean streamingEnabledConfig,
7682
LinkedBlockingQueue<PushManager.Status> pushMessages = new LinkedBlockingQueue<>();
7783
Synchronizer synchronizer = new SynchronizerImp(splitSynchronizationTask, splitFetcher, segmentSynchronizationTaskImp, splitCache, segmentCache, streamingRetryDelay, gates);
7884
PushManager pushManager = PushManagerImp.build(synchronizer, streamingServiceUrl, authUrl, httpClient, pushMessages, sseHttpClient, telemetryRuntimeProducer);
79-
return new SyncManagerImp(streamingEnabledConfig, synchronizer, pushManager, pushMessages, authRetryBackOffBase, gates);
85+
return new SyncManagerImp(streamingEnabledConfig, synchronizer, pushManager, pushMessages, authRetryBackOffBase, gates, telemetryRuntimeProducer);
8086
}
8187

8288
@Override
8389
public void start() {
8490
_synchronizer.syncAll();
85-
8691
if (_streamingEnabledConfig.get()) {
8792
startStreamingMode();
8893
} else {
@@ -103,6 +108,7 @@ private void startStreamingMode() {
103108
_pushStatusMonitorTask = _executorService.submit(this::incomingPushStatusHandler);
104109
}
105110
_pushManager.start();
111+
_telemetryRuntimeProducer.recordStreamingEvents(new StreamingEvent(StreamEventsEnum.SYNC_MODE_UPDATE.get_type(), STREAMING_STREAMING_EVENT, System.currentTimeMillis()));
106112
}
107113

108114
private void startPollingMode() {
@@ -114,6 +120,7 @@ private void startPollingMode() {
114120

115121
_log.debug("Starting in polling mode ...");
116122
_synchronizer.startPeriodicFetching();
123+
_telemetryRuntimeProducer.recordStreamingEvents(new StreamingEvent(StreamEventsEnum.SYNC_MODE_UPDATE.get_type(), POLLING_STREAMING_EVENT, System.currentTimeMillis()));
117124
}
118125

119126
@VisibleForTesting

client/src/main/java/io/split/engine/sse/EventSourceClientImp.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import io.split.engine.sse.exceptions.EventParsingException;
88
import io.split.engine.sse.workers.SplitsWorker;
99
import io.split.engine.sse.workers.Worker;
10+
import io.split.telemetry.storage.TelemetryRuntimeProducer;
1011
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
1112
import org.apache.hc.core5.net.URIBuilder;
1213
import org.slf4j.Logger;
@@ -35,7 +36,8 @@ public class EventSourceClientImp implements EventSourceClient {
3536
NotificationParser notificationParser,
3637
NotificationProcessor notificationProcessor,
3738
PushStatusTracker pushStatusTracker,
38-
CloseableHttpClient sseHttpClient) {
39+
CloseableHttpClient sseHttpClient,
40+
TelemetryRuntimeProducer telemetryRuntimeProducer) {
3941
_baseStreamingUrl = checkNotNull(baseStreamingUrl);
4042
_notificationParser = checkNotNull(notificationParser);
4143
_notificationProcessor = checkNotNull(notificationProcessor);
@@ -44,20 +46,21 @@ public class EventSourceClientImp implements EventSourceClient {
4446
_sseClient = new SSEClient(
4547
inboundEvent -> { onMessage(inboundEvent); return null; },
4648
status -> { _pushStatusTracker.handleSseStatus(status); return null; },
47-
sseHttpClient);
49+
sseHttpClient, telemetryRuntimeProducer);
4850
_firstEvent = new AtomicBoolean();
4951
}
5052

5153
public static EventSourceClientImp build(String baseStreamingUrl,
5254
SplitsWorker splitsWorker,
5355
Worker<SegmentQueueDto> segmentWorker,
5456
PushStatusTracker pushStatusTracker,
55-
CloseableHttpClient sseHttpClient) {
57+
CloseableHttpClient sseHttpClient, TelemetryRuntimeProducer telemetryRuntimeProducer) {
5658
return new EventSourceClientImp(baseStreamingUrl,
5759
new NotificationParserImp(),
5860
NotificationProcessorImp.build(splitsWorker, segmentWorker, pushStatusTracker),
5961
pushStatusTracker,
60-
sseHttpClient);
62+
sseHttpClient,
63+
telemetryRuntimeProducer);
6164
}
6265

6366
@Override

client/src/main/java/io/split/engine/sse/PushStatusTrackerImp.java

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,39 @@
77
import io.split.engine.sse.dtos.ControlType;
88
import io.split.engine.sse.dtos.ErrorNotification;
99
import io.split.engine.sse.dtos.OccupancyNotification;
10+
import io.split.telemetry.domain.StreamingEvent;
11+
import io.split.telemetry.domain.enums.StreamEventsEnum;
12+
import io.split.telemetry.storage.TelemetryRuntimeProducer;
1013
import org.slf4j.Logger;
1114
import org.slf4j.LoggerFactory;
1215

16+
import java.util.TimeZone;
1317
import java.util.concurrent.ConcurrentMap;
1418
import java.util.concurrent.LinkedBlockingQueue;
1519
import java.util.concurrent.atomic.AtomicBoolean;
1620
import java.util.concurrent.atomic.AtomicReference;
1721

22+
import static com.google.common.base.Preconditions.checkNotNull;
23+
1824
public class PushStatusTrackerImp implements PushStatusTracker {
1925
private static final Logger _log = LoggerFactory.getLogger(PushStatusTracker.class);
26+
private static final String CONTROL_PRI_CHANNEL = "control_pri";
27+
private static final String CONTROL_SEC_CHANNEL = "control_sec";
28+
private static final int STREAMING_DISABLED = 0;
29+
private static final int STREAMING_ENABLED = 1;
30+
private static final int STREAMING_PAUSED = 2;
2031

2132
private final AtomicBoolean _publishersOnline = new AtomicBoolean(true);
2233
private final AtomicReference<SSEClient.StatusMessage> _sseStatus = new AtomicReference<>(SSEClient.StatusMessage.INITIALIZATION_IN_PROGRESS);
2334
private final AtomicReference<ControlType> _backendStatus = new AtomicReference<>(ControlType.STREAMING_RESUMED);
2435
private final LinkedBlockingQueue<PushManager.Status> _statusMessages;
2536
private final ConcurrentMap<String, Integer> regions = Maps.newConcurrentMap();
2637

27-
public PushStatusTrackerImp(LinkedBlockingQueue<PushManager.Status> statusMessages) {
38+
private final TelemetryRuntimeProducer _telemetryRuntimeProducer;
39+
40+
public PushStatusTrackerImp(LinkedBlockingQueue<PushManager.Status> statusMessages, TelemetryRuntimeProducer telemetryRuntimeProducer) {
2841
_statusMessages = statusMessages;
42+
_telemetryRuntimeProducer = checkNotNull(telemetryRuntimeProducer);
2943
}
3044

3145
private synchronized void reset() {
@@ -42,6 +56,8 @@ public void handleSseStatus(SSEClient.StatusMessage newStatus) {
4256
case FIRST_EVENT:
4357
if (SSEClient.StatusMessage.CONNECTED.equals(_sseStatus.get())) {
4458
_statusMessages.offer(PushManager.Status.STREAMING_READY);
59+
_telemetryRuntimeProducer.recordStreamingEvents(new StreamingEvent(StreamEventsEnum.STREAMING_STATUS.get_type(), STREAMING_ENABLED, System.currentTimeMillis()));
60+
_telemetryRuntimeProducer.recordStreamingEvents(new StreamingEvent(StreamEventsEnum.CONNECTION_ESTABLISHED.get_type(),0l, System.currentTimeMillis()));
4561
}
4662
case CONNECTED:
4763
_sseStatus.compareAndSet(SSEClient.StatusMessage.INITIALIZATION_IN_PROGRESS, SSEClient.StatusMessage.CONNECTED);
@@ -85,12 +101,14 @@ public void handleIncomingControlEvent(ControlNotification controlNotification)
85101
}
86102
break;
87103
case STREAMING_PAUSED:
104+
_telemetryRuntimeProducer.recordStreamingEvents(new StreamingEvent(StreamEventsEnum.STREAMING_STATUS.get_type(), STREAMING_PAUSED, System.currentTimeMillis()));
88105
if (_backendStatus.compareAndSet(ControlType.STREAMING_RESUMED, ControlType.STREAMING_PAUSED) && _publishersOnline.get()) {
89106
// If there are no publishers online, the STREAMING_DOWN message should have already been sent
90107
_statusMessages.offer(PushManager.Status.STREAMING_DOWN);
91108
}
92109
break;
93110
case STREAMING_DISABLED:
111+
_telemetryRuntimeProducer.recordStreamingEvents(new StreamingEvent(StreamEventsEnum.STREAMING_STATUS.get_type(), STREAMING_DISABLED, System.currentTimeMillis()));
94112
_backendStatus.set(ControlType.STREAMING_DISABLED);
95113
_statusMessages.offer(PushManager.Status.STREAMING_OFF);
96114
break;
@@ -102,6 +120,7 @@ public void handleIncomingOccupancyEvent(OccupancyNotification occupancyNotifica
102120
_log.debug(String.format("handleIncomingOccupancyEvent: publishers=%d", occupancyNotification.getMetrics().getPublishers()));
103121

104122
int publishers = occupancyNotification.getMetrics().getPublishers();
123+
recordTelemetryOcuppancy(occupancyNotification, publishers);
105124
regions.put(occupancyNotification.getChannel(), publishers);
106125
boolean isPublishers = isPublishers();
107126
if (!isPublishers && _publishersOnline.compareAndSet(true, false) && _backendStatus.get().equals(ControlType.STREAMING_RESUMED)) {
@@ -114,7 +133,7 @@ public void handleIncomingOccupancyEvent(OccupancyNotification occupancyNotifica
114133
@Override
115134
public void handleIncomingAblyError(ErrorNotification notification) {
116135
_log.debug(String.format("handleIncomingAblyError: %s", notification.getMessage()));
117-
136+
_telemetryRuntimeProducer.recordStreamingEvents(new StreamingEvent(StreamEventsEnum.ABLY_ERROR.get_type(), notification.getCode(), System.currentTimeMillis()));
118137
if (_backendStatus.get().equals(ControlType.STREAMING_DISABLED)) {
119138
return; // Ignore
120139
}
@@ -145,4 +164,14 @@ private boolean isPublishers() {
145164
}
146165
return false;
147166
}
167+
168+
private void recordTelemetryOcuppancy(OccupancyNotification occupancyNotification, int publishers) {
169+
if (CONTROL_PRI_CHANNEL.equals(occupancyNotification.getChannel())) {
170+
_telemetryRuntimeProducer.recordStreamingEvents(new StreamingEvent(StreamEventsEnum.OCCUPANCY_PRI.get_type(), publishers, System.currentTimeMillis()));
171+
}
172+
else if (CONTROL_SEC_CHANNEL.equals(occupancyNotification.getChannel())){
173+
_telemetryRuntimeProducer.recordStreamingEvents(new StreamingEvent(StreamEventsEnum.OCCUPANCY_SEC.get_type(), publishers, System.currentTimeMillis()));
174+
}
175+
176+
}
148177
}

0 commit comments

Comments
 (0)