Skip to content

Commit f08d604

Browse files
committed
feat: temp work
1 parent 28c836e commit f08d604

File tree

12 files changed

+126
-44
lines changed

12 files changed

+126
-44
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,6 @@ dependency-reduced-pom.xml
2727
# mvn release
2828
pom.xml.releaseBackup
2929
release.properties
30+
31+
# macOS
32+
.DS_Store

pom.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
<organization>
3030
<name>Spotify AB</name>
31-
<url>http://www.spotify.com</url>
31+
<url>https://www.spotify.com</url>
3232
</organization>
3333

3434
<distributionManagement>
@@ -183,6 +183,11 @@
183183
<groupId>io.opentelemetry</groupId>
184184
<artifactId>opentelemetry-sdk-testing</artifactId>
185185
</dependency>
186+
<dependency>
187+
<groupId>io.opentelemetry.instrumentation</groupId>
188+
<artifactId>opentelemetry-okhttp-3.0</artifactId>
189+
<version>2.8.0-alpha</version>
190+
</dependency>
186191
<dependency>
187192
<groupId>commons-io</groupId>
188193
<artifactId>commons-io</artifactId>

src/main/java/com/spotify/github/tracing/BaseTracer.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,23 @@ public Span span(final String path, final String method) {
3737

3838
@Override
3939
public Span span(final Request request) {
40-
return internalSpan(request.url().toString(), request.method(), null);
40+
return internalSpan(request, null);
41+
}
42+
43+
@Override
44+
public Span span(final Request request, final CompletionStage<?> future) {
45+
return internalSpan(request, future);
4146
}
4247

4348
protected abstract Span internalSpan(
4449
String path,
4550
String method,
4651
CompletionStage<?> future);
4752

53+
protected abstract Span internalSpan(
54+
Request request,
55+
CompletionStage<?> future);
56+
4857
@Override
4958
public void attachSpanToFuture(final Span span, final CompletionStage<?> future) {
5059
future.whenComplete(

src/main/java/com/spotify/github/tracing/Span.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@
2020

2121
package com.spotify.github.tracing;
2222

23-
import okhttp3.Request;
24-
2523
public interface Span extends AutoCloseable {
2624

2725
Span success();
@@ -31,7 +29,5 @@ public interface Span extends AutoCloseable {
3129
/** Close span. Must be called for any opened span. */
3230
@Override
3331
void close();
34-
35-
Request decorateRequest(Request request);
3632
}
3733

src/main/java/com/spotify/github/tracing/Tracer.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
package com.spotify.github.tracing;
2222

23+
import okhttp3.Call;
24+
import okhttp3.OkHttpClient;
2325
import okhttp3.Request;
2426

2527
import java.util.concurrent.CompletionStage;
@@ -38,6 +40,11 @@ Span span(
3840
Span span(
3941
Request request);
4042

43+
Span span(
44+
Request request, CompletionStage<?> future);
45+
4146
void attachSpanToFuture(Span span, CompletionStage<?> future);
47+
48+
Call.Factory createTracedClient(OkHttpClient client);
4249
}
4350

src/main/java/com/spotify/github/tracing/opencensus/OpenCensusSpan.java

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,12 @@
2020

2121
package com.spotify.github.tracing.opencensus;
2222

23-
import static java.util.Objects.requireNonNull;
24-
2523
import com.spotify.github.tracing.Span;
26-
import com.spotify.github.tracing.TraceHelper;
2724
import com.spotify.github.v3.exceptions.RequestNotOkException;
2825
import io.opencensus.trace.AttributeValue;
2926
import io.opencensus.trace.Status;
30-
import okhttp3.Request;
27+
28+
import static java.util.Objects.requireNonNull;
3129

3230
public class OpenCensusSpan implements Span {
3331

@@ -63,14 +61,5 @@ public Span failure(final Throwable t) {
6361
public void close() {
6462
span.end();
6563
}
66-
67-
@Override
68-
public Request decorateRequest(final Request request) {
69-
return request.newBuilder()
70-
.header(TraceHelper.HEADER_CLOUD_TRACE_CONTEXT, span.getContext().getTraceId().toString())
71-
.header(TraceHelper.HEADER_TRACE_PARENT, span.getContext().getTraceId().toString())
72-
.header(TraceHelper.HEADER_TRACE_STATE, span.getContext().getTracestate().toString())
73-
.build();
74-
}
7564
}
7665

src/main/java/com/spotify/github/tracing/opencensus/OpenCensusTracer.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
import com.spotify.github.tracing.BaseTracer;
2424
import com.spotify.github.tracing.Span;
2525
import io.opencensus.trace.Tracing;
26+
import okhttp3.Call;
27+
import okhttp3.OkHttpClient;
28+
import okhttp3.Request;
29+
import org.jetbrains.annotations.NotNull;
2630

2731
import java.util.concurrent.CompletionStage;
2832

@@ -56,4 +60,21 @@ protected Span internalSpan(
5660

5761
return span;
5862
}
63+
64+
@Override
65+
protected Span internalSpan(final Request request, final CompletionStage<?> future) {
66+
requireNonNull(request);
67+
return internalSpan(request.url().toString(), request.method(), future);
68+
}
69+
70+
@Override
71+
public Call.Factory createTracedClient(final OkHttpClient client) {
72+
return new Call.Factory() {
73+
@NotNull
74+
@Override
75+
public Call newCall(@NotNull final Request request) {
76+
return client.newCall(request);
77+
}
78+
};
79+
}
5980
}

src/main/java/com/spotify/github/tracing/opentelemetry/OpenTelemetrySpan.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,9 @@
2020

2121
package com.spotify.github.tracing.opentelemetry;
2222

23-
import com.spotify.github.tracing.TraceHelper;
24-
import com.spotify.github.v3.exceptions.RequestNotOkException;
2523
import com.spotify.github.tracing.Span;
24+
import com.spotify.github.v3.exceptions.RequestNotOkException;
2625
import io.opentelemetry.api.trace.StatusCode;
27-
import okhttp3.Request;
2826

2927
import static java.util.Objects.requireNonNull;
3028

@@ -62,13 +60,4 @@ public Span failure(final Throwable t) {
6260
public void close() {
6361
span.end();
6462
}
65-
66-
@Override
67-
public Request decorateRequest(final Request request) {
68-
return request.newBuilder()
69-
.header(TraceHelper.HEADER_CLOUD_TRACE_CONTEXT, span.getSpanContext().getTraceId())
70-
.header(TraceHelper.HEADER_TRACE_PARENT, span.getSpanContext().getTraceId())
71-
.header(TraceHelper.HEADER_TRACE_STATE, span.getSpanContext().getTraceState().toString())
72-
.build();
73-
}
7463
}

src/main/java/com/spotify/github/tracing/opentelemetry/OpenTelemetryTracer.java

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,15 @@
2525
import io.opentelemetry.api.GlobalOpenTelemetry;
2626
import io.opentelemetry.api.OpenTelemetry;
2727
import io.opentelemetry.api.trace.SpanKind;
28+
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
2829
import io.opentelemetry.context.Context;
30+
import io.opentelemetry.context.propagation.TextMapGetter;
31+
import io.opentelemetry.instrumentation.okhttp.v3_0.OkHttpTelemetry;
32+
import okhttp3.Call;
33+
import okhttp3.OkHttpClient;
34+
import okhttp3.Request;
35+
import org.jetbrains.annotations.NotNull;
36+
import org.jetbrains.annotations.Nullable;
2937

3038
import java.util.concurrent.CompletionStage;
3139

@@ -38,6 +46,7 @@ public class OpenTelemetryTracer extends BaseTracer {
3846
public OpenTelemetryTracer(final OpenTelemetry openTelemetry) {
3947
this.openTelemetry = openTelemetry;
4048
this.tracer = openTelemetry.getTracer("github-java-client");
49+
4150
}
4251

4352
public OpenTelemetryTracer() {
@@ -51,9 +60,11 @@ protected Span internalSpan(
5160
final CompletionStage<?> future) {
5261
requireNonNull(path);
5362

63+
Context context = Context.current();
64+
5465
final io.opentelemetry.api.trace.Span otSpan =
5566
tracer.spanBuilder("GitHub Request")
56-
.setParent(Context.current())
67+
.setParent(context)
5768
.setSpanKind(SpanKind.CLIENT).startSpan();
5869

5970
otSpan.setAttribute("component", "github-api-client");
@@ -69,4 +80,31 @@ protected Span internalSpan(
6980
}
7081
return span;
7182
}
83+
84+
@Override
85+
protected Span internalSpan(final Request request, final CompletionStage<?> future) {
86+
requireNonNull(request);
87+
Context context = W3CTraceContextPropagator.getInstance().extract(Context.current(), request, new TextMapGetter<>() {
88+
@Override
89+
public Iterable<String> keys(@NotNull final Request carrier) {
90+
return carrier.headers().names();
91+
}
92+
93+
@Nullable
94+
@Override
95+
public String get(@Nullable final Request carrier, @NotNull final String key) {
96+
if (carrier == null) {
97+
return null;
98+
}
99+
return carrier.header(key);
100+
}
101+
});
102+
context.makeCurrent();
103+
return internalSpan(request.url().toString(), request.method(), future);
104+
}
105+
106+
@Override
107+
public Call.Factory createTracedClient(final OkHttpClient client) {
108+
return OkHttpTelemetry.builder(openTelemetry).build().newCallFactory(client);
109+
}
72110
}

src/main/java/com/spotify/github/v3/clients/GitHubClient.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@
2121
package com.spotify.github.v3.clients;
2222

2323
import com.fasterxml.jackson.core.type.TypeReference;
24-
import com.spotify.github.tracing.Span;
25-
import com.spotify.github.tracing.Tracer;
2624
import com.spotify.github.async.Async;
2725
import com.spotify.github.jackson.Json;
26+
import com.spotify.github.tracing.Span;
27+
import com.spotify.github.tracing.Tracer;
2828
import com.spotify.github.v3.Team;
2929
import com.spotify.github.v3.User;
3030
import com.spotify.github.v3.checks.AccessToken;
@@ -40,6 +40,7 @@
4040
import com.spotify.github.v3.repos.*;
4141
import okhttp3.*;
4242
import org.apache.commons.io.FileUtils;
43+
import org.jetbrains.annotations.NotNull;
4344
import org.slf4j.Logger;
4445
import org.slf4j.LoggerFactory;
4546

@@ -137,6 +138,7 @@ public class GitHubClient {
137138
private final Optional<URI> graphqlUrl;
138139
private final Json json = Json.create();
139140
private final OkHttpClient client;
141+
private Call.Factory callFactory;
140142
private final String token;
141143

142144
private final byte[] privateKey;
@@ -909,8 +911,10 @@ private AccessToken generateInstallationToken(final String jwtToken, final int i
909911

910912
private CompletableFuture<Response> call(final Request request) {
911913
try (Span span = tracer.span(request)) {
912-
Request tracedRequest = span.decorateRequest(request);
913-
final Call call = client.newCall(tracedRequest);
914+
if (this.callFactory == null) {
915+
this.callFactory = this.tracer.createTracedClient(this.client);
916+
}
917+
final Call call = this.callFactory.newCall(request);
914918

915919
final CompletableFuture<Response> future = new CompletableFuture<>();
916920

@@ -920,12 +924,12 @@ private CompletableFuture<Response> call(final Request request) {
920924
call.enqueue(
921925
new Callback() {
922926
@Override
923-
public void onFailure(final Call call, final IOException e) {
927+
public void onFailure(@NotNull final Call call, final IOException e) {
924928
future.completeExceptionally(e);
925929
}
926930

927931
@Override
928-
public void onResponse(final Call call, final Response response) {
932+
public void onResponse(@NotNull final Call call, final Response response) {
929933
processPossibleRedirects(response, redirected)
930934
.handle(
931935
(res, ex) -> {

0 commit comments

Comments
 (0)