Skip to content

Commit 2a9dc73

Browse files
Telemetry handler and its tests
1 parent 17181e9 commit 2a9dc73

File tree

9 files changed

+237
-0
lines changed

9 files changed

+237
-0
lines changed

src/main/java/com/microsoft/graph/httpcore/AuthenticationHandler.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.io.IOException;
44

55
import com.microsoft.graph.httpcore.middlewareoption.MiddlewareType;
6+
import com.microsoft.graph.httpcore.middlewareoption.TelemetryOptions;
67

78
import okhttp3.Interceptor;
89
import okhttp3.Request;
@@ -21,6 +22,11 @@ public AuthenticationHandler(ICoreAuthenticationProvider authProvider) {
2122
@Override
2223
public Response intercept(Chain chain) throws IOException {
2324
Request originalRequest = chain.request();
25+
26+
if(originalRequest.tag(TelemetryOptions.class) == null)
27+
originalRequest = originalRequest.newBuilder().tag(TelemetryOptions.class, new TelemetryOptions()).build();
28+
originalRequest.tag(TelemetryOptions.class).setFeatureUsage(TelemetryOptions.AUTH_HANDLER_ENABLED_FLAG);
29+
2430
Request authenticatedRequest = authProvider.authenticateRequest(originalRequest);
2531
return chain.proceed(authenticatedRequest);
2632
}

src/main/java/com/microsoft/graph/httpcore/HttpClients.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.microsoft.graph.httpcore;
22

3+
import okhttp3.Interceptor;
34
import okhttp3.OkHttpClient;
45
import okhttp3.OkHttpClient.Builder;
56

@@ -30,6 +31,22 @@ public static OkHttpClient createDefault(ICoreAuthenticationProvider auth) {
3031
.followRedirects(false)
3132
.addInterceptor(new RetryHandler())
3233
.addInterceptor(new RedirectHandler())
34+
.addInterceptor(new TelemetryHandler())
3335
.build();
3436
}
37+
38+
/**
39+
* Creates {@link OkHttpClient} instance with interceptors
40+
*
41+
* @param interceptors Use interceptors provided while constructing http client
42+
* @return OkHttpClient build with interceptors provided
43+
*/
44+
public static OkHttpClient createFromInterceptors(Interceptor[] interceptors) {
45+
OkHttpClient.Builder builder = new OkHttpClient.Builder();
46+
for(Interceptor interceptor : interceptors) {
47+
builder.addInterceptor(interceptor);
48+
}
49+
builder.addInterceptor(new TelemetryHandler());
50+
return builder.build();
51+
}
3552
}

src/main/java/com/microsoft/graph/httpcore/RedirectHandler.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import com.microsoft.graph.httpcore.middlewareoption.MiddlewareType;
1313
import com.microsoft.graph.httpcore.middlewareoption.RedirectOptions;
14+
import com.microsoft.graph.httpcore.middlewareoption.TelemetryOptions;
1415

1516
import okhttp3.HttpUrl;
1617
import okhttp3.Interceptor;
@@ -100,6 +101,11 @@ Request getRedirect(
100101
@Override
101102
public Response intercept(Chain chain) throws IOException {
102103
Request request = chain.request();
104+
105+
if(request.tag(TelemetryOptions.class) == null)
106+
request = request.newBuilder().tag(TelemetryOptions.class, new TelemetryOptions()).build();
107+
request.tag(TelemetryOptions.class).setFeatureUsage(TelemetryOptions.REDIRECT_HANDLER_ENABLED_FLAG);
108+
103109
Response response = null;
104110
int requestsCount = 1;
105111

src/main/java/com/microsoft/graph/httpcore/RetryHandler.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.microsoft.graph.httpcore.middlewareoption.IShouldRetry;
66
import com.microsoft.graph.httpcore.middlewareoption.MiddlewareType;
77
import com.microsoft.graph.httpcore.middlewareoption.RetryOptions;
8+
import com.microsoft.graph.httpcore.middlewareoption.TelemetryOptions;
89

910
import okhttp3.Interceptor;
1011
import okhttp3.Request;
@@ -124,6 +125,11 @@ boolean isBuffered(Response response, Request request) {
124125
@Override
125126
public Response intercept(Chain chain) throws IOException {
126127
Request request = chain.request();
128+
129+
if(request.tag(TelemetryOptions.class) == null)
130+
request = request.newBuilder().tag(TelemetryOptions.class, new TelemetryOptions()).build();
131+
request.tag(TelemetryOptions.class).setFeatureUsage(TelemetryOptions.RETRY_HANDLER_ENABLED_FLAG);
132+
127133
Response response = chain.proceed(request);
128134

129135
// Use should retry pass along with this request
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.microsoft.graph.httpcore;
2+
3+
import java.io.IOException;
4+
5+
import com.microsoft.graph.httpcore.middlewareoption.TelemetryOptions;
6+
7+
import okhttp3.Interceptor;
8+
import okhttp3.Request;
9+
import okhttp3.Response;
10+
11+
public class TelemetryHandler implements Interceptor{
12+
13+
public static final String SDK_VERSION = "SdkVersion";
14+
public static final String VERSION = "v0.1.0-SNAPSHOT";
15+
public static final String GRAPH_VERSION_PREFIX = "graph-java-core";
16+
public static final String CLIENT_REQUEST_ID = "client-request-id";
17+
18+
@Override
19+
public Response intercept(Chain chain) throws IOException {
20+
Request request = chain.request();
21+
Request.Builder telemetryAddedBuilder = request.newBuilder();
22+
23+
TelemetryOptions telemetryOptions = request.tag(TelemetryOptions.class);
24+
25+
if(telemetryOptions != null) {
26+
String featureUsage = "(featureUsage=" + telemetryOptions.getFeatureUsage() + ")";
27+
String sdkversion_value = GRAPH_VERSION_PREFIX + "/" + VERSION + " " + featureUsage;
28+
telemetryAddedBuilder.addHeader(SDK_VERSION, sdkversion_value);
29+
30+
if(request.header(CLIENT_REQUEST_ID) == null) {
31+
telemetryAddedBuilder.addHeader(CLIENT_REQUEST_ID, telemetryOptions.getClientRequestId());
32+
}
33+
}
34+
35+
return chain.proceed(telemetryAddedBuilder.build());
36+
}
37+
38+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.microsoft.graph.httpcore.middlewareoption;
2+
3+
import java.math.BigInteger;
4+
import java.util.UUID;
5+
6+
public class TelemetryOptions {
7+
8+
public static final String NONE_FLAG = "0x00000000";
9+
public static final String REDIRECT_HANDLER_ENABLED_FLAG = "0x00000001";
10+
public static final String RETRY_HANDLER_ENABLED_FLAG = "0x00000002";
11+
public static final String AUTH_HANDLER_ENABLED_FLAG = "0x00000004";
12+
public static final String DEFAULT_HTTPROVIDER_ENABLED_FLAG = "0x00000008";
13+
public static final String LOGGING_HANDLER_ENABLED_FLAG = "0x00000010";
14+
15+
private static final int RADIX = 16;
16+
private BigInteger featureUsage = new BigInteger(NONE_FLAG.substring(2), RADIX);
17+
private String clientRequestId;
18+
19+
public void setFeatureUsage(String flag) {
20+
featureUsage = featureUsage.or(new BigInteger(flag.substring(2), RADIX));
21+
}
22+
23+
public String getFeatureUsage() {
24+
return featureUsage.toString(RADIX);
25+
}
26+
27+
public void setClientRequestId(String clientRequestId) {
28+
this.clientRequestId = clientRequestId;
29+
}
30+
31+
public String getClientRequestId() {
32+
if(clientRequestId == null) {
33+
clientRequestId = UUID.randomUUID().toString();
34+
}
35+
return clientRequestId;
36+
}
37+
38+
}

src/test/java/com/microsoft/graph/httpcore/HttpClientsTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import org.junit.Test;
66

7+
import okhttp3.Interceptor;
78
import okhttp3.OkHttpClient;
89
import okhttp3.Request;
910

@@ -21,5 +22,18 @@ public Request authenticateRequest(Request request) {
2122
OkHttpClient httpclient = HttpClients.createDefault(authprovider);
2223
assertTrue(httpclient != null);
2324
}
25+
26+
@Test
27+
public void arrayInterceptorsTest() {
28+
AuthenticationHandler authenticationHandler = new AuthenticationHandler(new ICoreAuthenticationProvider() {
29+
@Override
30+
public Request authenticateRequest(Request request) {
31+
return request;
32+
}
33+
});
34+
Interceptor[] interceptors = {new RetryHandler(), new RedirectHandler(), authenticationHandler};
35+
OkHttpClient client = HttpClients.createFromInterceptors(interceptors);
36+
assertTrue(client.interceptors().size()==4);
37+
}
2438

2539
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.microsoft.graph.httpcore;
2+
3+
import static org.junit.Assert.assertNotNull;
4+
import static org.junit.Assert.assertTrue;
5+
6+
import java.io.IOException;
7+
8+
import org.junit.Ignore;
9+
import org.junit.Test;
10+
11+
import okhttp3.Interceptor;
12+
import okhttp3.OkHttpClient;
13+
import okhttp3.Request;
14+
import okhttp3.Response;
15+
16+
@Ignore
17+
public class TelemetryHandlerTest {
18+
@Test
19+
public void telemetryInitTest() {
20+
TelemetryHandler telemetryHandler = new TelemetryHandler();
21+
assertNotNull(telemetryHandler);
22+
}
23+
24+
@Test
25+
public void interceptTest() throws IOException {
26+
String expectedHeader = TelemetryHandler.SDK_VERSION + TelemetryHandler.GRAPH_VERSION_PREFIX +"/"
27+
+TelemetryHandler.VERSION;
28+
OkHttpClient client = HttpClients.createDefault(new ICoreAuthenticationProvider() {
29+
@Override
30+
public Request authenticateRequest(Request request) {
31+
return request;
32+
}
33+
});
34+
Request request = new Request.Builder().url("https://graph.microsoft.com/v1.0/users/").build();
35+
Response response = client.newCall(request).execute();
36+
assertNotNull(response);
37+
assertTrue(response.request().header("SdkVersion").contains(expectedHeader));
38+
}
39+
40+
@Test
41+
public void arrayInterceptorsTest() throws IOException {
42+
43+
AuthenticationHandler authenticationHandler = new AuthenticationHandler(new ICoreAuthenticationProvider() {
44+
45+
@Override
46+
public Request authenticateRequest(Request request) {
47+
return request;
48+
}
49+
});
50+
Interceptor[] interceptors = {new RetryHandler(), new RedirectHandler(), authenticationHandler};
51+
OkHttpClient client = HttpClients.createFromInterceptors(interceptors);
52+
String expectedHeader = TelemetryHandler.SDK_VERSION + TelemetryHandler.GRAPH_VERSION_PREFIX +"/"
53+
+TelemetryHandler.VERSION;
54+
Request request = new Request.Builder().url("https://graph.microsoft.com/v1.0/users/").build();
55+
Response response = client.newCall(request).execute();
56+
assertNotNull(response);
57+
assertTrue(response.request().header("SdkVersion").contains(expectedHeader));
58+
}
59+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.microsoft.graph.httpcore;
2+
3+
import static org.junit.Assert.assertNotNull;
4+
import static org.junit.Assert.assertTrue;
5+
6+
import org.junit.Test;
7+
8+
import com.microsoft.graph.httpcore.middlewareoption.TelemetryOptions;
9+
10+
public class TelemetryOptionsTest {
11+
12+
@Test
13+
public void createTelemetryOptionsTest() {
14+
TelemetryOptions telemetryOptions = new TelemetryOptions();
15+
assertNotNull(telemetryOptions);
16+
assertNotNull(telemetryOptions.getClientRequestId());
17+
}
18+
19+
@Test
20+
public void setFeatureUsageTest() {
21+
TelemetryOptions telemetryOptions = new TelemetryOptions();
22+
telemetryOptions.setFeatureUsage(TelemetryOptions.AUTH_HANDLER_ENABLED_FLAG);
23+
telemetryOptions.setFeatureUsage(TelemetryOptions.REDIRECT_HANDLER_ENABLED_FLAG);
24+
assertTrue(telemetryOptions.getFeatureUsage().compareTo("5")==0);
25+
}
26+
27+
@Test
28+
public void getFeatureUsageTest() {
29+
TelemetryOptions telemetryOptions = new TelemetryOptions();
30+
telemetryOptions.setFeatureUsage(TelemetryOptions.AUTH_HANDLER_ENABLED_FLAG);
31+
telemetryOptions.setFeatureUsage(TelemetryOptions.REDIRECT_HANDLER_ENABLED_FLAG);
32+
telemetryOptions.setFeatureUsage(TelemetryOptions.RETRY_HANDLER_ENABLED_FLAG);
33+
assertTrue(telemetryOptions.getFeatureUsage().compareTo("7")==0);
34+
}
35+
36+
@Test
37+
public void setClientRequestIdTest() {
38+
TelemetryOptions telemetryOptions = new TelemetryOptions();
39+
telemetryOptions.setClientRequestId("test id");
40+
assertTrue(telemetryOptions.getClientRequestId().compareTo("test id")==0);
41+
}
42+
43+
@Test
44+
public void getClientRequestIdTest() {
45+
TelemetryOptions telemetryOptions = new TelemetryOptions();
46+
assertNotNull(telemetryOptions.getClientRequestId());
47+
telemetryOptions.setClientRequestId("test id 1");
48+
assertTrue(telemetryOptions.getClientRequestId().compareTo("test id 1")==0);
49+
telemetryOptions.setClientRequestId("test id 2");
50+
assertTrue(telemetryOptions.getClientRequestId().compareTo("test id 2")==0);
51+
}
52+
53+
}

0 commit comments

Comments
 (0)