Skip to content

Commit 125a6b3

Browse files
committed
Merge branch 'split-ratpack' into all-together
2 parents b84fecc + cd4d8cd commit 125a6b3

File tree

15 files changed

+606
-72
lines changed

15 files changed

+606
-72
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.ratpack.v1_7;
7+
8+
import io.opentelemetry.api.OpenTelemetry;
9+
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
10+
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.OpenTelemetryExecInitializer;
11+
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.OpenTelemetryHttpClient;
12+
import ratpack.http.client.HttpClient;
13+
import ratpack.http.client.HttpResponse;
14+
import ratpack.http.client.RequestSpec;
15+
import ratpack.registry.RegistrySpec;
16+
17+
/**
18+
* Entrypoint for instrumenting Ratpack http client.
19+
*
20+
* <p>To apply OpenTelemetry instrumentation to a http client, wrap the {@link HttpClient} using
21+
* {@link #instrument(HttpClient)}.
22+
*
23+
* <pre>{@code
24+
* RatpackClientTelemetry telemetry = RatpackClientTelemetry.create(OpenTelemetrySdk.builder()
25+
* ...
26+
* .build());
27+
* HttpClient instrumentedHttpClient = telemetry.instrument(httpClient);
28+
* }</pre>
29+
*/
30+
public final class RatpackClientTelemetry {
31+
32+
/**
33+
* Returns a new {@link RatpackClientTelemetry} configured with the given {@link OpenTelemetry}.
34+
*/
35+
public static RatpackClientTelemetry create(OpenTelemetry openTelemetry) {
36+
return builder(openTelemetry).build();
37+
}
38+
39+
/**
40+
* Returns a new {@link RatpackClientTelemetryBuilder} configured with the given {@link
41+
* OpenTelemetry}.
42+
*/
43+
public static RatpackClientTelemetryBuilder builder(OpenTelemetry openTelemetry) {
44+
return new RatpackClientTelemetryBuilder(openTelemetry);
45+
}
46+
47+
private final OpenTelemetryHttpClient httpClientInstrumenter;
48+
49+
RatpackClientTelemetry(Instrumenter<RequestSpec, HttpResponse> clientInstrumenter) {
50+
httpClientInstrumenter = new OpenTelemetryHttpClient(clientInstrumenter);
51+
}
52+
53+
/** Returns instrumented instance of {@link HttpClient} with OpenTelemetry. */
54+
public HttpClient instrument(HttpClient httpClient) throws Exception {
55+
return httpClientInstrumenter.instrument(httpClient);
56+
}
57+
58+
/** Configures the {@link RegistrySpec} with OpenTelemetry. */
59+
public void configureRegistry(RegistrySpec registry) {
60+
registry.add(OpenTelemetryExecInitializer.INSTANCE);
61+
}
62+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.ratpack.v1_7;
7+
8+
import com.google.errorprone.annotations.CanIgnoreReturnValue;
9+
import io.opentelemetry.api.OpenTelemetry;
10+
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder;
11+
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
12+
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
13+
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
14+
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.Experimental;
15+
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.RatpackClientInstrumenterBuilderFactory;
16+
import java.util.List;
17+
import java.util.Set;
18+
import java.util.function.Function;
19+
import ratpack.http.client.HttpResponse;
20+
import ratpack.http.client.RequestSpec;
21+
22+
/** A builder for {@link RatpackClientTelemetry}. */
23+
public final class RatpackClientTelemetryBuilder {
24+
25+
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.ratpack-1.7";
26+
27+
private final DefaultHttpClientInstrumenterBuilder<RequestSpec, HttpResponse> builder;
28+
29+
RatpackClientTelemetryBuilder(OpenTelemetry openTelemetry) {
30+
builder = RatpackClientInstrumenterBuilderFactory.create(INSTRUMENTATION_NAME, openTelemetry);
31+
}
32+
33+
@CanIgnoreReturnValue
34+
public RatpackClientTelemetryBuilder addAttributesExtractor(
35+
AttributesExtractor<? super RequestSpec, ? super HttpResponse> attributesExtractor) {
36+
builder.addAttributeExtractor(attributesExtractor);
37+
return this;
38+
}
39+
40+
/**
41+
* Configures the HTTP client request headers that will be captured as span attributes.
42+
*
43+
* @param requestHeaders A list of HTTP header names.
44+
*/
45+
@CanIgnoreReturnValue
46+
public RatpackClientTelemetryBuilder setCapturedRequestHeaders(List<String> requestHeaders) {
47+
builder.setCapturedRequestHeaders(requestHeaders);
48+
return this;
49+
}
50+
51+
/**
52+
* Configures the HTTP client response headers that will be captured as span attributes.
53+
*
54+
* @param responseHeaders A list of HTTP header names.
55+
*/
56+
@CanIgnoreReturnValue
57+
public RatpackClientTelemetryBuilder setCapturedResponseHeaders(List<String> responseHeaders) {
58+
builder.setCapturedResponseHeaders(responseHeaders);
59+
return this;
60+
}
61+
62+
/**
63+
* Configures the instrumentation to recognize an alternative set of HTTP request methods.
64+
*
65+
* <p>By default, this instrumentation defines "known" methods as the ones listed in <a
66+
* href="https://www.rfc-editor.org/rfc/rfc9110.html#name-methods">RFC9110</a> and the PATCH
67+
* method defined in <a href="https://www.rfc-editor.org/rfc/rfc5789.html">RFC5789</a>.
68+
*
69+
* <p>Note: calling this method <b>overrides</b> the default known method sets completely; it does
70+
* not supplement it.
71+
*
72+
* @param knownMethods A set of recognized HTTP request methods.
73+
* @see HttpClientAttributesExtractorBuilder#setKnownMethods(Set)
74+
*/
75+
@CanIgnoreReturnValue
76+
public RatpackClientTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
77+
builder.setKnownMethods(knownMethods);
78+
return this;
79+
}
80+
81+
/** Sets custom client {@link SpanNameExtractor} via transform function. */
82+
@CanIgnoreReturnValue
83+
public RatpackClientTelemetryBuilder setSpanNameExtractor(
84+
Function<
85+
SpanNameExtractor<? super RequestSpec>,
86+
? extends SpanNameExtractor<? super RequestSpec>>
87+
clientSpanNameExtractor) {
88+
builder.setSpanNameExtractor(clientSpanNameExtractor);
89+
return this;
90+
}
91+
92+
/**
93+
* Can be used via the unstable method {@link
94+
* Experimental#setEmitExperimentalTelemetry(RatpackClientTelemetryBuilder, boolean)}.
95+
*/
96+
void setEmitExperimentalHttpClientMetrics(boolean emitExperimentalHttpClientMetrics) {
97+
builder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics);
98+
}
99+
100+
/** Returns a new {@link RatpackClientTelemetry} with the configuration of this builder. */
101+
public RatpackClientTelemetry build() {
102+
return new RatpackClientTelemetry(builder.build());
103+
}
104+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.ratpack.v1_7;
7+
8+
import io.opentelemetry.api.OpenTelemetry;
9+
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
10+
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.OpenTelemetryExecInitializer;
11+
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.OpenTelemetryExecInterceptor;
12+
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.OpenTelemetryServerHandler;
13+
import ratpack.exec.ExecInitializer;
14+
import ratpack.exec.ExecInterceptor;
15+
import ratpack.handling.Handler;
16+
import ratpack.handling.HandlerDecorator;
17+
import ratpack.http.Request;
18+
import ratpack.http.Response;
19+
import ratpack.registry.RegistrySpec;
20+
21+
/**
22+
* Entrypoint for instrumenting Ratpack server.
23+
*
24+
* <p>To apply OpenTelemetry instrumentation to a server, configure the {@link RegistrySpec} using
25+
* {@link #configureRegistry(RegistrySpec)}.
26+
*
27+
* <pre>{@code
28+
* RatpackServerTelemetry telemetry = RatpackServerTelemetry.create(OpenTelemetrySdk.builder()
29+
* ...
30+
* .build());
31+
* RatpackServer.start(server -> {
32+
* server.registryOf(telemetry::configureRegistry);
33+
* server.handlers(chain -> ...);
34+
* });
35+
* }</pre>
36+
*/
37+
public final class RatpackServerTelemetry {
38+
39+
/**
40+
* Returns a new {@link RatpackServerTelemetry} configured with the given {@link OpenTelemetry}.
41+
*/
42+
public static RatpackServerTelemetry create(OpenTelemetry openTelemetry) {
43+
return builder(openTelemetry).build();
44+
}
45+
46+
/**
47+
* Returns a new {@link RatpackServerTelemetryBuilder} configured with the given {@link
48+
* OpenTelemetry}.
49+
*/
50+
public static RatpackServerTelemetryBuilder builder(OpenTelemetry openTelemetry) {
51+
return new RatpackServerTelemetryBuilder(openTelemetry);
52+
}
53+
54+
private final OpenTelemetryServerHandler serverHandler;
55+
56+
RatpackServerTelemetry(Instrumenter<Request, Response> serverInstrumenter) {
57+
serverHandler = new OpenTelemetryServerHandler(serverInstrumenter);
58+
}
59+
60+
/** Returns a {@link Handler} to support Ratpack Registry binding. */
61+
public Handler getHandler() {
62+
return serverHandler;
63+
}
64+
65+
/** Returns instance of {@link ExecInterceptor} to support Ratpack Registry binding. */
66+
public ExecInterceptor getExecInterceptor() {
67+
return OpenTelemetryExecInterceptor.INSTANCE;
68+
}
69+
70+
/** Returns instance of {@link ExecInitializer} to support Ratpack Registry binding. */
71+
public ExecInitializer getExecInitializer() {
72+
return OpenTelemetryExecInitializer.INSTANCE;
73+
}
74+
75+
/** Configures the {@link RegistrySpec} with OpenTelemetry. */
76+
public void configureRegistry(RegistrySpec registry) {
77+
registry.add(HandlerDecorator.prepend(serverHandler));
78+
registry.add(OpenTelemetryExecInterceptor.INSTANCE);
79+
}
80+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.ratpack.v1_7;
7+
8+
import com.google.errorprone.annotations.CanIgnoreReturnValue;
9+
import io.opentelemetry.api.OpenTelemetry;
10+
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder;
11+
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
12+
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
13+
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder;
14+
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.Experimental;
15+
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.RatpackServerInstrumenterBuilderFactory;
16+
import java.util.List;
17+
import java.util.Set;
18+
import java.util.function.Function;
19+
import ratpack.http.Request;
20+
import ratpack.http.Response;
21+
22+
/** A builder for {@link RatpackServerTelemetry}. */
23+
public final class RatpackServerTelemetryBuilder {
24+
25+
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.ratpack-1.7";
26+
27+
private final DefaultHttpServerInstrumenterBuilder<Request, Response> builder;
28+
29+
RatpackServerTelemetryBuilder(OpenTelemetry openTelemetry) {
30+
builder = RatpackServerInstrumenterBuilderFactory.create(INSTRUMENTATION_NAME, openTelemetry);
31+
}
32+
33+
/**
34+
* Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented
35+
* items. The {@link AttributesExtractor} will be executed after all default extractors.
36+
*/
37+
@CanIgnoreReturnValue
38+
public RatpackServerTelemetryBuilder addAttributesExtractor(
39+
AttributesExtractor<? super Request, ? super Response> attributesExtractor) {
40+
builder.addAttributesExtractor(attributesExtractor);
41+
return this;
42+
}
43+
44+
/**
45+
* Configures the HTTP server request headers that will be captured as span attributes.
46+
*
47+
* @param requestHeaders A list of HTTP header names.
48+
*/
49+
@CanIgnoreReturnValue
50+
public RatpackServerTelemetryBuilder setCapturedRequestHeaders(List<String> requestHeaders) {
51+
builder.setCapturedRequestHeaders(requestHeaders);
52+
return this;
53+
}
54+
55+
/**
56+
* Configures the HTTP server response headers that will be captured as span attributes.
57+
*
58+
* @param responseHeaders A list of HTTP header names.
59+
*/
60+
@CanIgnoreReturnValue
61+
public RatpackServerTelemetryBuilder setCapturedResponseHeaders(List<String> responseHeaders) {
62+
builder.setCapturedResponseHeaders(responseHeaders);
63+
return this;
64+
}
65+
66+
/**
67+
* Configures the instrumentation to recognize an alternative set of HTTP request methods.
68+
*
69+
* <p>By default, this instrumentation defines "known" methods as the ones listed in <a
70+
* href="https://www.rfc-editor.org/rfc/rfc9110.html#name-methods">RFC9110</a> and the PATCH
71+
* method defined in <a href="https://www.rfc-editor.org/rfc/rfc5789.html">RFC5789</a>.
72+
*
73+
* <p>Note: calling this method <b>overrides</b> the default known method sets completely; it does
74+
* not supplement it.
75+
*
76+
* @param knownMethods A set of recognized HTTP request methods.
77+
* @see HttpServerAttributesExtractorBuilder#setKnownMethods(Set)
78+
*/
79+
@CanIgnoreReturnValue
80+
public RatpackServerTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
81+
builder.setKnownMethods(knownMethods);
82+
return this;
83+
}
84+
85+
/** Sets custom server {@link SpanNameExtractor} via transform function. */
86+
@CanIgnoreReturnValue
87+
public RatpackServerTelemetryBuilder setSpanNameExtractor(
88+
Function<SpanNameExtractor<? super Request>, ? extends SpanNameExtractor<? super Request>>
89+
serverSpanNameExtractor) {
90+
builder.setSpanNameExtractor(serverSpanNameExtractor);
91+
return this;
92+
}
93+
94+
/**
95+
* Can be used via the unstable method {@link
96+
* Experimental#setEmitExperimentalTelemetry(RatpackServerTelemetryBuilder, boolean)}.
97+
*/
98+
void setEmitExperimentalHttpServerMetrics(boolean emitExperimentalHttpServerMetrics) {
99+
builder.setEmitExperimentalHttpServerMetrics(emitExperimentalHttpServerMetrics);
100+
}
101+
102+
/** Returns a new {@link RatpackServerTelemetry} with the configuration of this builder. */
103+
public RatpackServerTelemetry build() {
104+
return new RatpackServerTelemetry(builder.build());
105+
}
106+
}

0 commit comments

Comments
 (0)