Skip to content

Commit ba038b5

Browse files
Merge branch 'telemetry' of github.com:splitio/java-client into telemetry-attach-services
2 parents 84fd4ca + 7e13192 commit ba038b5

File tree

10 files changed

+292
-153
lines changed

10 files changed

+292
-153
lines changed

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
import io.split.client.impressions.AsynchronousImpressionListener;
44
import io.split.client.impressions.ImpressionListener;
55
import io.split.client.impressions.ImpressionsManagerImpl;
6-
import io.split.client.interceptors.AddSplitHeadersFilter;
6+
import io.split.client.interceptors.AuthorizationInterceptorFilter;
7+
import io.split.client.interceptors.ClientKeyInterceptorFilter;
78
import io.split.client.interceptors.GzipDecoderResponseInterceptor;
89
import io.split.client.interceptors.GzipEncoderRequestInterceptor;
10+
import io.split.client.interceptors.SdkMetadataInterceptorFilter;
911
import io.split.client.metrics.HttpMetrics;
1012
import io.split.cache.InMemoryCacheImp;
1113
import io.split.cache.SplitCache;
@@ -53,6 +55,7 @@
5355
import java.io.IOException;
5456
import java.net.URI;
5557
import java.net.URISyntaxException;
58+
5659
import java.util.ArrayList;
5760
import java.util.List;
5861
import java.util.Random;
@@ -144,7 +147,7 @@ public SplitFactoryImpl(String apiToken, SplitClientConfig config) throws URISyn
144147
_eventClient = EventClientImpl.create(_httpclient, _eventsRootTarget, config.eventsQueueSize(), config.eventFlushIntervalInMillis(), config.waitBeforeShutdown(), _telemetryStorage);
145148

146149
// SyncManager
147-
_syncManager = SyncManagerImp.build(config.streamingEnabled(), _splitSynchronizationTask, _splitFetcher, _segmentSynchronizationTaskImp, _splitCache, config.authServiceURL(), _httpclient, config.streamingServiceURL(), config.authRetryBackoffBase(), buildSSEdHttpClient(config), _segmentCache, config.streamingRetryDelay(), _gates, _telemetryStorage);
150+
_syncManager = SyncManagerImp.build(config.streamingEnabled(), _splitSynchronizationTask, _splitFetcher, _segmentSynchronizationTaskImp, _splitCache, config.authServiceURL(), _httpclient, config.streamingServiceURL(), config.authRetryBackoffBase(), buildSSEdHttpClient(apiToken, config), _segmentCache, config.streamingRetryDelay(), _gates, _telemetryStorage));
148151
_syncManager.start();
149152

150153
// Evaluator
@@ -232,7 +235,8 @@ private static CloseableHttpClient buildHttpClient(String apiToken, SplitClientC
232235
HttpClientBuilder httpClientbuilder = HttpClients.custom()
233236
.setConnectionManager(cm)
234237
.setDefaultRequestConfig(requestConfig)
235-
.addRequestInterceptorLast(AddSplitHeadersFilter.instance(apiToken, config.ipAddressEnabled()))
238+
.addRequestInterceptorLast(AuthorizationInterceptorFilter.instance(apiToken))
239+
.addRequestInterceptorLast(SdkMetadataInterceptorFilter.instance(config.ipAddressEnabled(), SplitClientConfig.splitSdkVersion))
236240
.addRequestInterceptorLast(new GzipEncoderRequestInterceptor())
237241
.addResponseInterceptorLast((new GzipDecoderResponseInterceptor()));
238242

@@ -244,7 +248,7 @@ private static CloseableHttpClient buildHttpClient(String apiToken, SplitClientC
244248
return httpClientbuilder.build();
245249
}
246250

247-
private static CloseableHttpClient buildSSEdHttpClient(SplitClientConfig config) {
251+
private static CloseableHttpClient buildSSEdHttpClient(String apiToken, SplitClientConfig config) {
248252
RequestConfig requestConfig = RequestConfig.custom()
249253
.setConnectTimeout(Timeout.ofMilliseconds(SSE_CONNECT_TIMEOUT))
250254
.build();
@@ -265,7 +269,9 @@ private static CloseableHttpClient buildSSEdHttpClient(SplitClientConfig config)
265269

266270
HttpClientBuilder httpClientbuilder = HttpClients.custom()
267271
.setConnectionManager(cm)
268-
.setDefaultRequestConfig(requestConfig);
272+
.setDefaultRequestConfig(requestConfig)
273+
.addRequestInterceptorLast(SdkMetadataInterceptorFilter.instance(config.ipAddressEnabled(), SplitClientConfig.splitSdkVersion))
274+
.addRequestInterceptorLast(ClientKeyInterceptorFilter.instance(apiToken));
269275

270276
// Set up proxy is it exists
271277
if (config.proxy() != null) {
@@ -329,5 +335,4 @@ private ImpressionsManagerImpl buildImpressionsManager(SplitClientConfig config)
329335

330336
return ImpressionsManagerImpl.instance(_httpclient, config, impressionListeners, _telemetryStorage);
331337
}
332-
333338
}

client/src/main/java/io/split/client/interceptors/AddSplitHeadersFilter.java

Lines changed: 0 additions & 73 deletions
This file was deleted.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.split.client.interceptors;
2+
3+
import org.apache.hc.core5.http.EntityDetails;
4+
import org.apache.hc.core5.http.HttpException;
5+
import org.apache.hc.core5.http.HttpRequest;
6+
import org.apache.hc.core5.http.HttpRequestInterceptor;
7+
import org.apache.hc.core5.http.protocol.HttpContext;
8+
9+
import java.io.IOException;
10+
11+
import static com.google.common.base.Preconditions.checkNotNull;
12+
13+
public class AuthorizationInterceptorFilter implements HttpRequestInterceptor {
14+
static final String AUTHORIZATION_HEADER = "Authorization";
15+
16+
private final String _apiTokenBearer;
17+
18+
public static AuthorizationInterceptorFilter instance(String apiToken) {
19+
return new AuthorizationInterceptorFilter(apiToken);
20+
}
21+
22+
private AuthorizationInterceptorFilter(String apiToken) {
23+
_apiTokenBearer = "Bearer " + checkNotNull(apiToken);
24+
}
25+
26+
@Override
27+
public void process(HttpRequest httpRequest, EntityDetails entityDetails, HttpContext httpContext) throws HttpException, IOException {
28+
httpRequest.addHeader(AUTHORIZATION_HEADER, _apiTokenBearer);
29+
}
30+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.split.client.interceptors;
2+
3+
import org.apache.hc.core5.http.EntityDetails;
4+
import org.apache.hc.core5.http.HttpException;
5+
import org.apache.hc.core5.http.HttpRequest;
6+
import org.apache.hc.core5.http.HttpRequestInterceptor;
7+
import org.apache.hc.core5.http.protocol.HttpContext;
8+
9+
import java.io.IOException;
10+
11+
public class ClientKeyInterceptorFilter implements HttpRequestInterceptor {
12+
static final String CLIENT_KEY = "SplitSDKClientKey";
13+
14+
private final String _clientKey;
15+
16+
public static ClientKeyInterceptorFilter instance(String apiToken) {
17+
return new ClientKeyInterceptorFilter(apiToken.substring(apiToken.length() - 4));
18+
}
19+
20+
private ClientKeyInterceptorFilter(String clientKey) {
21+
_clientKey = clientKey;
22+
}
23+
24+
@Override
25+
public void process(HttpRequest httpRequest, EntityDetails entityDetails, HttpContext httpContext) throws HttpException, IOException {
26+
httpRequest.addHeader(CLIENT_KEY, _clientKey);
27+
}
28+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package io.split.client.interceptors;
2+
3+
import io.split.client.SplitClientConfig;
4+
import org.apache.hc.core5.http.EntityDetails;
5+
import org.apache.hc.core5.http.HttpException;
6+
import org.apache.hc.core5.http.HttpRequest;
7+
import org.apache.hc.core5.http.HttpRequestInterceptor;
8+
import org.apache.hc.core5.http.protocol.HttpContext;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
11+
12+
import java.io.IOException;
13+
import java.net.InetAddress;
14+
15+
public class SdkMetadataInterceptorFilter implements HttpRequestInterceptor {
16+
private static final Logger _log = LoggerFactory.getLogger(SdkMetadataInterceptorFilter.class);
17+
18+
static final String CLIENT_MACHINE_NAME_HEADER = "SplitSDKMachineName";
19+
static final String CLIENT_MACHINE_IP_HEADER = "SplitSDKMachineIP";
20+
static final String CLIENT_VERSION = "SplitSDKVersion";
21+
22+
private final String _hostname;
23+
private final String _ip;
24+
private final String _sdkVersion;
25+
26+
public static SdkMetadataInterceptorFilter instance(boolean ipAddressEnabled, String sdkVersion) {
27+
String hostName = null;
28+
String ip = null;
29+
30+
if (ipAddressEnabled) {
31+
try {
32+
InetAddress localHost = InetAddress.getLocalHost();
33+
hostName = localHost.getHostName();
34+
ip = localHost.getHostAddress();
35+
} catch (Exception e) {
36+
_log.error("Could not resolve InetAddress", e);
37+
}
38+
}
39+
40+
return new SdkMetadataInterceptorFilter(hostName, ip, sdkVersion);
41+
}
42+
43+
private SdkMetadataInterceptorFilter(String hostName, String ip, String sdkVersion) {
44+
_sdkVersion = sdkVersion;
45+
_hostname = hostName;
46+
_ip = ip;
47+
}
48+
49+
@Override
50+
public void process(HttpRequest httpRequest, EntityDetails entityDetails, HttpContext httpContext) throws HttpException, IOException {
51+
httpRequest.addHeader(CLIENT_VERSION, SplitClientConfig.splitSdkVersion);
52+
53+
if (_hostname != null) {
54+
httpRequest.addHeader(CLIENT_MACHINE_NAME_HEADER, _hostname);
55+
}
56+
57+
if (_ip != null) {
58+
httpRequest.addHeader(CLIENT_MACHINE_IP_HEADER, _ip);
59+
}
60+
}
61+
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ private void connectAndLoop(URI uri, CountDownLatch signal) {
156156
}
157157

158158
private boolean establishConnection(URI uri, CountDownLatch signal) {
159-
160159
_ongoingRequest.set(new HttpGet(uri));
161160

162161
try {

client/src/test/java/io/split/client/interceptors/AddSplitHeadersFilterTest.java

Lines changed: 0 additions & 73 deletions
This file was deleted.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package io.split.client.interceptors;
2+
3+
import org.apache.hc.core5.http.HttpException;
4+
import org.apache.hc.core5.http.HttpRequest;
5+
import org.apache.hc.core5.http.protocol.HttpContext;
6+
import org.junit.Test;
7+
import org.junit.runner.RunWith;
8+
import org.mockito.ArgumentCaptor;
9+
import org.mockito.Captor;
10+
import org.mockito.Mockito;
11+
import org.mockito.runners.MockitoJUnitRunner;
12+
13+
import java.io.IOException;
14+
import java.util.List;
15+
16+
import static org.hamcrest.Matchers.contains;
17+
import static org.junit.Assert.*;
18+
19+
@RunWith(MockitoJUnitRunner.class)
20+
public class AuthorizationInterceptorFilterTest {
21+
22+
@Captor
23+
private ArgumentCaptor<String> headerNameCaptor;
24+
25+
@Captor
26+
private ArgumentCaptor<String> headerValueCaptor;
27+
28+
@Test
29+
public void authorizationInterceptorWithValue() throws IOException, HttpException {
30+
AuthorizationInterceptorFilter filter = AuthorizationInterceptorFilter.instance("api-token-test");
31+
HttpRequest req = Mockito.mock(HttpRequest.class);
32+
HttpContext ctx = Mockito.mock(HttpContext.class);
33+
34+
filter.process(req, null, ctx);
35+
Mockito.verify(req, Mockito.times(1)).addHeader(headerNameCaptor.capture(), headerValueCaptor.capture());
36+
37+
List<String> headerNames = headerNameCaptor.getAllValues();
38+
List<String> headerValues = headerValueCaptor.getAllValues();
39+
40+
assertEquals(1, headerNames.size());
41+
assertEquals(1, headerValues.size());
42+
43+
assertThat(headerNames, contains(AuthorizationInterceptorFilter.AUTHORIZATION_HEADER));
44+
assertThat(headerValues, contains("Bearer api-token-test"));
45+
}
46+
47+
@Test(expected = Exception.class)
48+
public void authorizationInterceptorWithoutValue() {
49+
AuthorizationInterceptorFilter filter = AuthorizationInterceptorFilter.instance(null);
50+
}
51+
}

0 commit comments

Comments
 (0)