Split ratpack into client and server (#12853)
This commit is contained in:
parent
cb353117ad
commit
b178439ada
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.instrumentation.ratpack.v1_7;
|
||||||
|
|
||||||
|
import io.opentelemetry.api.OpenTelemetry;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
|
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.OpenTelemetryHttpClient;
|
||||||
|
import ratpack.http.client.HttpClient;
|
||||||
|
import ratpack.http.client.HttpResponse;
|
||||||
|
import ratpack.http.client.RequestSpec;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Entrypoint for instrumenting Ratpack http client.
|
||||||
|
*
|
||||||
|
* <p>To apply OpenTelemetry instrumentation to a http client, wrap the {@link HttpClient} using
|
||||||
|
* {@link #instrument(HttpClient)}.
|
||||||
|
*
|
||||||
|
* <pre>{@code
|
||||||
|
* RatpackClientTelemetry telemetry = RatpackClientTelemetry.create(OpenTelemetrySdk.builder()
|
||||||
|
* ...
|
||||||
|
* .build());
|
||||||
|
* HttpClient instrumentedHttpClient = telemetry.instrument(httpClient);
|
||||||
|
* }</pre>
|
||||||
|
*/
|
||||||
|
public final class RatpackClientTelemetry {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new {@link RatpackClientTelemetry} configured with the given {@link OpenTelemetry}.
|
||||||
|
*/
|
||||||
|
public static RatpackClientTelemetry create(OpenTelemetry openTelemetry) {
|
||||||
|
return builder(openTelemetry).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new {@link RatpackClientTelemetryBuilder} configured with the given {@link
|
||||||
|
* OpenTelemetry}.
|
||||||
|
*/
|
||||||
|
public static RatpackClientTelemetryBuilder builder(OpenTelemetry openTelemetry) {
|
||||||
|
return new RatpackClientTelemetryBuilder(openTelemetry);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final OpenTelemetryHttpClient httpClientInstrumenter;
|
||||||
|
|
||||||
|
RatpackClientTelemetry(Instrumenter<RequestSpec, HttpResponse> clientInstrumenter) {
|
||||||
|
httpClientInstrumenter = new OpenTelemetryHttpClient(clientInstrumenter);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns instrumented instance of {@link HttpClient} with OpenTelemetry. */
|
||||||
|
public HttpClient instrument(HttpClient httpClient) throws Exception {
|
||||||
|
return httpClientInstrumenter.instrument(httpClient);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,101 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.instrumentation.ratpack.v1_7;
|
||||||
|
|
||||||
|
import com.google.errorprone.annotations.CanIgnoreReturnValue;
|
||||||
|
import io.opentelemetry.api.OpenTelemetry;
|
||||||
|
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
|
||||||
|
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
|
||||||
|
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.Experimental;
|
||||||
|
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.RatpackClientInstrumenterBuilderFactory;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import ratpack.http.client.HttpResponse;
|
||||||
|
import ratpack.http.client.RequestSpec;
|
||||||
|
|
||||||
|
/** A builder for {@link RatpackClientTelemetry}. */
|
||||||
|
public final class RatpackClientTelemetryBuilder {
|
||||||
|
|
||||||
|
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.ratpack-1.7";
|
||||||
|
|
||||||
|
private final DefaultHttpClientInstrumenterBuilder<RequestSpec, HttpResponse> builder;
|
||||||
|
|
||||||
|
static {
|
||||||
|
Experimental.setSetEmitExperimentalClientTelemetry(
|
||||||
|
(builder, emit) -> builder.builder.setEmitExperimentalHttpClientMetrics(emit));
|
||||||
|
}
|
||||||
|
|
||||||
|
RatpackClientTelemetryBuilder(OpenTelemetry openTelemetry) {
|
||||||
|
builder = RatpackClientInstrumenterBuilderFactory.create(INSTRUMENTATION_NAME, openTelemetry);
|
||||||
|
}
|
||||||
|
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public RatpackClientTelemetryBuilder addAttributesExtractor(
|
||||||
|
AttributesExtractor<? super RequestSpec, ? super HttpResponse> attributesExtractor) {
|
||||||
|
builder.addAttributesExtractor(attributesExtractor);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the HTTP client request headers that will be captured as span attributes.
|
||||||
|
*
|
||||||
|
* @param requestHeaders A list of HTTP header names.
|
||||||
|
*/
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public RatpackClientTelemetryBuilder setCapturedRequestHeaders(List<String> requestHeaders) {
|
||||||
|
builder.setCapturedRequestHeaders(requestHeaders);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the HTTP client response headers that will be captured as span attributes.
|
||||||
|
*
|
||||||
|
* @param responseHeaders A list of HTTP header names.
|
||||||
|
*/
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public RatpackClientTelemetryBuilder setCapturedResponseHeaders(List<String> responseHeaders) {
|
||||||
|
builder.setCapturedResponseHeaders(responseHeaders);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the instrumentation to recognize an alternative set of HTTP request methods.
|
||||||
|
*
|
||||||
|
* <p>By default, this instrumentation defines "known" methods as the ones listed in <a
|
||||||
|
* href="https://www.rfc-editor.org/rfc/rfc9110.html#name-methods">RFC9110</a> and the PATCH
|
||||||
|
* method defined in <a href="https://www.rfc-editor.org/rfc/rfc5789.html">RFC5789</a>.
|
||||||
|
*
|
||||||
|
* <p>Note: calling this method <b>overrides</b> the default known method sets completely; it does
|
||||||
|
* not supplement it.
|
||||||
|
*
|
||||||
|
* @param knownMethods A set of recognized HTTP request methods.
|
||||||
|
* @see HttpClientAttributesExtractorBuilder#setKnownMethods(Set)
|
||||||
|
*/
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public RatpackClientTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
|
||||||
|
builder.setKnownMethods(knownMethods);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Sets custom client {@link SpanNameExtractor} via transform function. */
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public RatpackClientTelemetryBuilder setSpanNameExtractor(
|
||||||
|
Function<
|
||||||
|
SpanNameExtractor<? super RequestSpec>,
|
||||||
|
? extends SpanNameExtractor<? super RequestSpec>>
|
||||||
|
clientSpanNameExtractor) {
|
||||||
|
builder.setSpanNameExtractor(clientSpanNameExtractor);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns a new {@link RatpackClientTelemetry} with the configuration of this builder. */
|
||||||
|
public RatpackClientTelemetry build() {
|
||||||
|
return new RatpackClientTelemetry(builder.build());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.instrumentation.ratpack.v1_7;
|
||||||
|
|
||||||
|
import io.opentelemetry.api.OpenTelemetry;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
|
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.OpenTelemetryExecInitializer;
|
||||||
|
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.OpenTelemetryExecInterceptor;
|
||||||
|
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.OpenTelemetryServerHandler;
|
||||||
|
import ratpack.exec.ExecInitializer;
|
||||||
|
import ratpack.exec.ExecInterceptor;
|
||||||
|
import ratpack.handling.Handler;
|
||||||
|
import ratpack.handling.HandlerDecorator;
|
||||||
|
import ratpack.http.Request;
|
||||||
|
import ratpack.http.Response;
|
||||||
|
import ratpack.registry.RegistrySpec;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Entrypoint for instrumenting Ratpack server.
|
||||||
|
*
|
||||||
|
* <p>To apply OpenTelemetry instrumentation to a server, configure the {@link RegistrySpec} using
|
||||||
|
* {@link #configureRegistry(RegistrySpec)}.
|
||||||
|
*
|
||||||
|
* <pre>{@code
|
||||||
|
* RatpackServerTelemetry telemetry = RatpackServerTelemetry.create(OpenTelemetrySdk.builder()
|
||||||
|
* ...
|
||||||
|
* .build());
|
||||||
|
* RatpackServer.start(server -> {
|
||||||
|
* server.registryOf(telemetry::configureRegistry);
|
||||||
|
* server.handlers(chain -> ...);
|
||||||
|
* });
|
||||||
|
* }</pre>
|
||||||
|
*/
|
||||||
|
public final class RatpackServerTelemetry {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new {@link RatpackServerTelemetry} configured with the given {@link OpenTelemetry}.
|
||||||
|
*/
|
||||||
|
public static RatpackServerTelemetry create(OpenTelemetry openTelemetry) {
|
||||||
|
return builder(openTelemetry).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new {@link RatpackServerTelemetryBuilder} configured with the given {@link
|
||||||
|
* OpenTelemetry}.
|
||||||
|
*/
|
||||||
|
public static RatpackServerTelemetryBuilder builder(OpenTelemetry openTelemetry) {
|
||||||
|
return new RatpackServerTelemetryBuilder(openTelemetry);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final OpenTelemetryServerHandler serverHandler;
|
||||||
|
|
||||||
|
RatpackServerTelemetry(Instrumenter<Request, Response> serverInstrumenter) {
|
||||||
|
serverHandler = new OpenTelemetryServerHandler(serverInstrumenter);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns a {@link Handler} to support Ratpack Registry binding. */
|
||||||
|
public Handler getHandler() {
|
||||||
|
return serverHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns instance of {@link ExecInterceptor} to support Ratpack Registry binding. */
|
||||||
|
public ExecInterceptor getExecInterceptor() {
|
||||||
|
return OpenTelemetryExecInterceptor.INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns instance of {@link ExecInitializer} to support Ratpack Registry binding. */
|
||||||
|
public ExecInitializer getExecInitializer() {
|
||||||
|
return OpenTelemetryExecInitializer.INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Configures the {@link RegistrySpec} with OpenTelemetry. */
|
||||||
|
public void configureRegistry(RegistrySpec registry) {
|
||||||
|
registry.add(HandlerDecorator.prepend(serverHandler));
|
||||||
|
registry.add(OpenTelemetryExecInterceptor.INSTANCE);
|
||||||
|
registry.add(OpenTelemetryExecInitializer.INSTANCE);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,103 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.instrumentation.ratpack.v1_7;
|
||||||
|
|
||||||
|
import com.google.errorprone.annotations.CanIgnoreReturnValue;
|
||||||
|
import io.opentelemetry.api.OpenTelemetry;
|
||||||
|
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
|
||||||
|
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder;
|
||||||
|
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.Experimental;
|
||||||
|
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.RatpackServerInstrumenterBuilderFactory;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import ratpack.http.Request;
|
||||||
|
import ratpack.http.Response;
|
||||||
|
|
||||||
|
/** A builder for {@link RatpackServerTelemetry}. */
|
||||||
|
public final class RatpackServerTelemetryBuilder {
|
||||||
|
|
||||||
|
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.ratpack-1.7";
|
||||||
|
|
||||||
|
private final DefaultHttpServerInstrumenterBuilder<Request, Response> builder;
|
||||||
|
|
||||||
|
static {
|
||||||
|
Experimental.setSetEmitExperimentalServerTelemetry(
|
||||||
|
(builder, emit) -> builder.builder.setEmitExperimentalHttpServerMetrics(emit));
|
||||||
|
}
|
||||||
|
|
||||||
|
RatpackServerTelemetryBuilder(OpenTelemetry openTelemetry) {
|
||||||
|
builder = RatpackServerInstrumenterBuilderFactory.create(INSTRUMENTATION_NAME, openTelemetry);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented
|
||||||
|
* items. The {@link AttributesExtractor} will be executed after all default extractors.
|
||||||
|
*/
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public RatpackServerTelemetryBuilder addAttributesExtractor(
|
||||||
|
AttributesExtractor<? super Request, ? super Response> attributesExtractor) {
|
||||||
|
builder.addAttributesExtractor(attributesExtractor);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the HTTP server request headers that will be captured as span attributes.
|
||||||
|
*
|
||||||
|
* @param requestHeaders A list of HTTP header names.
|
||||||
|
*/
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public RatpackServerTelemetryBuilder setCapturedRequestHeaders(List<String> requestHeaders) {
|
||||||
|
builder.setCapturedRequestHeaders(requestHeaders);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the HTTP server response headers that will be captured as span attributes.
|
||||||
|
*
|
||||||
|
* @param responseHeaders A list of HTTP header names.
|
||||||
|
*/
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public RatpackServerTelemetryBuilder setCapturedResponseHeaders(List<String> responseHeaders) {
|
||||||
|
builder.setCapturedResponseHeaders(responseHeaders);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the instrumentation to recognize an alternative set of HTTP request methods.
|
||||||
|
*
|
||||||
|
* <p>By default, this instrumentation defines "known" methods as the ones listed in <a
|
||||||
|
* href="https://www.rfc-editor.org/rfc/rfc9110.html#name-methods">RFC9110</a> and the PATCH
|
||||||
|
* method defined in <a href="https://www.rfc-editor.org/rfc/rfc5789.html">RFC5789</a>.
|
||||||
|
*
|
||||||
|
* <p>Note: calling this method <b>overrides</b> the default known method sets completely; it does
|
||||||
|
* not supplement it.
|
||||||
|
*
|
||||||
|
* @param knownMethods A set of recognized HTTP request methods.
|
||||||
|
* @see HttpServerAttributesExtractorBuilder#setKnownMethods(Set)
|
||||||
|
*/
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public RatpackServerTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
|
||||||
|
builder.setKnownMethods(knownMethods);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Sets custom server {@link SpanNameExtractor} via transform function. */
|
||||||
|
@CanIgnoreReturnValue
|
||||||
|
public RatpackServerTelemetryBuilder setSpanNameExtractor(
|
||||||
|
Function<SpanNameExtractor<? super Request>, ? extends SpanNameExtractor<? super Request>>
|
||||||
|
serverSpanNameExtractor) {
|
||||||
|
builder.setSpanNameExtractor(serverSpanNameExtractor);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns a new {@link RatpackServerTelemetry} with the configuration of this builder. */
|
||||||
|
public RatpackServerTelemetry build() {
|
||||||
|
return new RatpackServerTelemetry(builder.build());
|
||||||
|
}
|
||||||
|
}
|
|
@ -46,17 +46,30 @@ import ratpack.registry.RegistrySpec;
|
||||||
* .build());
|
* .build());
|
||||||
* HttpClient instrumentedHttpClient = telemetry.instrumentHttpClient(httpClient);
|
* HttpClient instrumentedHttpClient = telemetry.instrumentHttpClient(httpClient);
|
||||||
* }</pre>
|
* }</pre>
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link RatpackClientTelemetry} and {@link RatpackServerTelemetry} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public final class RatpackTelemetry {
|
public final class RatpackTelemetry {
|
||||||
|
|
||||||
/** Returns a new {@link RatpackTelemetry} configured with the given {@link OpenTelemetry}. */
|
/**
|
||||||
|
* Returns a new {@link RatpackTelemetry} configured with the given {@link OpenTelemetry}.
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link RatpackClientTelemetry#create(OpenTelemetry)} and {@link
|
||||||
|
* RatpackServerTelemetry#create(OpenTelemetry)} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public static RatpackTelemetry create(OpenTelemetry openTelemetry) {
|
public static RatpackTelemetry create(OpenTelemetry openTelemetry) {
|
||||||
return builder(openTelemetry).build();
|
return builder(openTelemetry).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a new {@link RatpackTelemetryBuilder} configured with the given {@link OpenTelemetry}.
|
* Returns a new {@link RatpackTelemetryBuilder} configured with the given {@link OpenTelemetry}.
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link RatpackClientTelemetry#builder(OpenTelemetry)} and {@link
|
||||||
|
* RatpackServerTelemetry#builder(OpenTelemetry)} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public static RatpackTelemetryBuilder builder(OpenTelemetry openTelemetry) {
|
public static RatpackTelemetryBuilder builder(OpenTelemetry openTelemetry) {
|
||||||
return new RatpackTelemetryBuilder(openTelemetry);
|
return new RatpackTelemetryBuilder(openTelemetry);
|
||||||
}
|
}
|
||||||
|
@ -71,29 +84,54 @@ public final class RatpackTelemetry {
|
||||||
httpClientInstrumenter = new OpenTelemetryHttpClient(clientInstrumenter);
|
httpClientInstrumenter = new OpenTelemetryHttpClient(clientInstrumenter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns instance of {@link OpenTelemetryServerHandler} to support Ratpack Registry binding. */
|
/**
|
||||||
|
* Returns instance of {@link OpenTelemetryServerHandler} to support Ratpack Registry binding.
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link RatpackServerTelemetry#getHandler()} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public OpenTelemetryServerHandler getOpenTelemetryServerHandler() {
|
public OpenTelemetryServerHandler getOpenTelemetryServerHandler() {
|
||||||
return serverHandler;
|
return serverHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns instance of {@link ExecInterceptor} to support Ratpack Registry binding. */
|
/**
|
||||||
|
* Returns instance of {@link ExecInterceptor} to support Ratpack Registry binding.
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link RatpackServerTelemetry#getExecInterceptor()} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public ExecInterceptor getOpenTelemetryExecInterceptor() {
|
public ExecInterceptor getOpenTelemetryExecInterceptor() {
|
||||||
return OpenTelemetryExecInterceptor.INSTANCE;
|
return OpenTelemetryExecInterceptor.INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns instance of {@link ExecInitializer} to support Ratpack Registry binding. */
|
/**
|
||||||
|
* Returns instance of {@link ExecInitializer} to support Ratpack Registry binding.
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link RatpackServerTelemetry#getExecInitializer()} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public ExecInitializer getOpenTelemetryExecInitializer() {
|
public ExecInitializer getOpenTelemetryExecInitializer() {
|
||||||
return OpenTelemetryExecInitializer.INSTANCE;
|
return OpenTelemetryExecInitializer.INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Configures the {@link RegistrySpec} with OpenTelemetry. */
|
/**
|
||||||
|
* Configures the {@link RegistrySpec} with OpenTelemetry.
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link RatpackServerTelemetry#configureRegistry(RegistrySpec)} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public void configureServerRegistry(RegistrySpec registry) {
|
public void configureServerRegistry(RegistrySpec registry) {
|
||||||
registry.add(HandlerDecorator.prepend(serverHandler));
|
registry.add(HandlerDecorator.prepend(serverHandler));
|
||||||
registry.add(OpenTelemetryExecInterceptor.INSTANCE);
|
registry.add(OpenTelemetryExecInterceptor.INSTANCE);
|
||||||
registry.add(OpenTelemetryExecInitializer.INSTANCE);
|
registry.add(OpenTelemetryExecInitializer.INSTANCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns instrumented instance of {@link HttpClient} with OpenTelemetry. */
|
/**
|
||||||
|
* Returns instrumented instance of {@link HttpClient} with OpenTelemetry.
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link RatpackClientTelemetry#instrument(HttpClient)} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public HttpClient instrumentHttpClient(HttpClient httpClient) throws Exception {
|
public HttpClient instrumentHttpClient(HttpClient httpClient) throws Exception {
|
||||||
return httpClientInstrumenter.instrument(httpClient);
|
return httpClientInstrumenter.instrument(httpClient);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
|
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
|
||||||
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder;
|
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder;
|
||||||
|
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.Experimental;
|
||||||
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.RatpackClientInstrumenterBuilderFactory;
|
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.RatpackClientInstrumenterBuilderFactory;
|
||||||
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.RatpackServerInstrumenterBuilderFactory;
|
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.RatpackServerInstrumenterBuilderFactory;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -23,7 +24,13 @@ import ratpack.http.Response;
|
||||||
import ratpack.http.client.HttpResponse;
|
import ratpack.http.client.HttpResponse;
|
||||||
import ratpack.http.client.RequestSpec;
|
import ratpack.http.client.RequestSpec;
|
||||||
|
|
||||||
/** A builder for {@link RatpackTelemetry}. */
|
/**
|
||||||
|
* A builder for {@link RatpackTelemetry}.
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link RatpackClientTelemetryBuilder} and {@link RatpackServerTelemetryBuilder}
|
||||||
|
* instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public final class RatpackTelemetryBuilder {
|
public final class RatpackTelemetryBuilder {
|
||||||
|
|
||||||
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.ratpack-1.7";
|
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.ratpack-1.7";
|
||||||
|
@ -41,7 +48,11 @@ public final class RatpackTelemetryBuilder {
|
||||||
/**
|
/**
|
||||||
* Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented
|
* Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented
|
||||||
* items. The {@link AttributesExtractor} will be executed after all default extractors.
|
* items. The {@link AttributesExtractor} will be executed after all default extractors.
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link
|
||||||
|
* RatpackServerTelemetryBuilder#addAttributesExtractor(AttributesExtractor)} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
@CanIgnoreReturnValue
|
@CanIgnoreReturnValue
|
||||||
public RatpackTelemetryBuilder addAttributeExtractor(
|
public RatpackTelemetryBuilder addAttributeExtractor(
|
||||||
AttributesExtractor<? super Request, ? super Response> attributesExtractor) {
|
AttributesExtractor<? super Request, ? super Response> attributesExtractor) {
|
||||||
|
@ -49,6 +60,11 @@ public final class RatpackTelemetryBuilder {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use {@link
|
||||||
|
* RatpackClientTelemetryBuilder#addAttributesExtractor(AttributesExtractor)} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
@CanIgnoreReturnValue
|
@CanIgnoreReturnValue
|
||||||
public RatpackTelemetryBuilder addClientAttributeExtractor(
|
public RatpackTelemetryBuilder addClientAttributeExtractor(
|
||||||
AttributesExtractor<? super RequestSpec, ? super HttpResponse> attributesExtractor) {
|
AttributesExtractor<? super RequestSpec, ? super HttpResponse> attributesExtractor) {
|
||||||
|
@ -60,7 +76,9 @@ public final class RatpackTelemetryBuilder {
|
||||||
* Configures the HTTP server request headers that will be captured as span attributes.
|
* Configures the HTTP server request headers that will be captured as span attributes.
|
||||||
*
|
*
|
||||||
* @param requestHeaders A list of HTTP header names.
|
* @param requestHeaders A list of HTTP header names.
|
||||||
|
* @deprecated Use {@link RatpackServerTelemetryBuilder#setCapturedRequestHeaders(List)} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
@CanIgnoreReturnValue
|
@CanIgnoreReturnValue
|
||||||
public RatpackTelemetryBuilder setCapturedServerRequestHeaders(List<String> requestHeaders) {
|
public RatpackTelemetryBuilder setCapturedServerRequestHeaders(List<String> requestHeaders) {
|
||||||
serverBuilder.setCapturedRequestHeaders(requestHeaders);
|
serverBuilder.setCapturedRequestHeaders(requestHeaders);
|
||||||
|
@ -71,7 +89,9 @@ public final class RatpackTelemetryBuilder {
|
||||||
* Configures the HTTP server response headers that will be captured as span attributes.
|
* Configures the HTTP server response headers that will be captured as span attributes.
|
||||||
*
|
*
|
||||||
* @param responseHeaders A list of HTTP header names.
|
* @param responseHeaders A list of HTTP header names.
|
||||||
|
* @deprecated Use {@link RatpackServerTelemetryBuilder#setCapturedResponseHeaders(List)} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
@CanIgnoreReturnValue
|
@CanIgnoreReturnValue
|
||||||
public RatpackTelemetryBuilder setCapturedServerResponseHeaders(List<String> responseHeaders) {
|
public RatpackTelemetryBuilder setCapturedServerResponseHeaders(List<String> responseHeaders) {
|
||||||
serverBuilder.setCapturedResponseHeaders(responseHeaders);
|
serverBuilder.setCapturedResponseHeaders(responseHeaders);
|
||||||
|
@ -82,7 +102,9 @@ public final class RatpackTelemetryBuilder {
|
||||||
* Configures the HTTP client request headers that will be captured as span attributes.
|
* Configures the HTTP client request headers that will be captured as span attributes.
|
||||||
*
|
*
|
||||||
* @param requestHeaders A list of HTTP header names.
|
* @param requestHeaders A list of HTTP header names.
|
||||||
|
* @deprecated Use {@link RatpackClientTelemetryBuilder#setCapturedRequestHeaders(List)} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
@CanIgnoreReturnValue
|
@CanIgnoreReturnValue
|
||||||
public RatpackTelemetryBuilder setCapturedClientRequestHeaders(List<String> requestHeaders) {
|
public RatpackTelemetryBuilder setCapturedClientRequestHeaders(List<String> requestHeaders) {
|
||||||
clientBuilder.setCapturedRequestHeaders(requestHeaders);
|
clientBuilder.setCapturedRequestHeaders(requestHeaders);
|
||||||
|
@ -93,7 +115,9 @@ public final class RatpackTelemetryBuilder {
|
||||||
* Configures the HTTP client response headers that will be captured as span attributes.
|
* Configures the HTTP client response headers that will be captured as span attributes.
|
||||||
*
|
*
|
||||||
* @param responseHeaders A list of HTTP header names.
|
* @param responseHeaders A list of HTTP header names.
|
||||||
|
* @deprecated Use {@link RatpackClientTelemetryBuilder#setCapturedResponseHeaders(List)} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
@CanIgnoreReturnValue
|
@CanIgnoreReturnValue
|
||||||
public RatpackTelemetryBuilder setCapturedClientResponseHeaders(List<String> responseHeaders) {
|
public RatpackTelemetryBuilder setCapturedClientResponseHeaders(List<String> responseHeaders) {
|
||||||
clientBuilder.setCapturedResponseHeaders(responseHeaders);
|
clientBuilder.setCapturedResponseHeaders(responseHeaders);
|
||||||
|
@ -113,7 +137,10 @@ public final class RatpackTelemetryBuilder {
|
||||||
* @param knownMethods A set of recognized HTTP request methods.
|
* @param knownMethods A set of recognized HTTP request methods.
|
||||||
* @see HttpClientAttributesExtractorBuilder#setKnownMethods(Set)
|
* @see HttpClientAttributesExtractorBuilder#setKnownMethods(Set)
|
||||||
* @see HttpServerAttributesExtractorBuilder#setKnownMethods(Set)
|
* @see HttpServerAttributesExtractorBuilder#setKnownMethods(Set)
|
||||||
|
* @deprecated Use {@link RatpackServerTelemetryBuilder#setKnownMethods(Set)} and {@link
|
||||||
|
* RatpackClientTelemetryBuilder#setKnownMethods(Set)} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
@CanIgnoreReturnValue
|
@CanIgnoreReturnValue
|
||||||
public RatpackTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
|
public RatpackTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
|
||||||
clientBuilder.setKnownMethods(knownMethods);
|
clientBuilder.setKnownMethods(knownMethods);
|
||||||
|
@ -126,7 +153,10 @@ public final class RatpackTelemetryBuilder {
|
||||||
*
|
*
|
||||||
* @param emitExperimentalHttpClientMetrics {@code true} if the experimental HTTP client metrics
|
* @param emitExperimentalHttpClientMetrics {@code true} if the experimental HTTP client metrics
|
||||||
* are to be emitted.
|
* are to be emitted.
|
||||||
|
* @deprecated Use {@link Experimental#setEmitExperimentalTelemetry(RatpackClientTelemetryBuilder,
|
||||||
|
* boolean)} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
@CanIgnoreReturnValue
|
@CanIgnoreReturnValue
|
||||||
public RatpackTelemetryBuilder setEmitExperimentalHttpClientMetrics(
|
public RatpackTelemetryBuilder setEmitExperimentalHttpClientMetrics(
|
||||||
boolean emitExperimentalHttpClientMetrics) {
|
boolean emitExperimentalHttpClientMetrics) {
|
||||||
|
@ -139,7 +169,10 @@ public final class RatpackTelemetryBuilder {
|
||||||
*
|
*
|
||||||
* @param emitExperimentalHttpServerMetrics {@code true} if the experimental HTTP server metrics
|
* @param emitExperimentalHttpServerMetrics {@code true} if the experimental HTTP server metrics
|
||||||
* are to be emitted.
|
* are to be emitted.
|
||||||
|
* @deprecated Use {@link Experimental#setEmitExperimentalTelemetry(RatpackServerTelemetryBuilder,
|
||||||
|
* boolean)} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
@CanIgnoreReturnValue
|
@CanIgnoreReturnValue
|
||||||
public RatpackTelemetryBuilder setEmitExperimentalHttpServerMetrics(
|
public RatpackTelemetryBuilder setEmitExperimentalHttpServerMetrics(
|
||||||
boolean emitExperimentalHttpServerMetrics) {
|
boolean emitExperimentalHttpServerMetrics) {
|
||||||
|
@ -147,7 +180,12 @@ public final class RatpackTelemetryBuilder {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sets custom client {@link SpanNameExtractor} via transform function. */
|
/**
|
||||||
|
* Sets custom client {@link SpanNameExtractor} via transform function.
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link RatpackClientTelemetryBuilder#setSpanNameExtractor(Function)} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
@CanIgnoreReturnValue
|
@CanIgnoreReturnValue
|
||||||
public RatpackTelemetryBuilder setClientSpanNameExtractor(
|
public RatpackTelemetryBuilder setClientSpanNameExtractor(
|
||||||
Function<
|
Function<
|
||||||
|
@ -158,7 +196,12 @@ public final class RatpackTelemetryBuilder {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sets custom server {@link SpanNameExtractor} via transform function. */
|
/**
|
||||||
|
* Sets custom server {@link SpanNameExtractor} via transform function.
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link RatpackServerTelemetryBuilder#setSpanNameExtractor(Function)} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
@CanIgnoreReturnValue
|
@CanIgnoreReturnValue
|
||||||
public RatpackTelemetryBuilder setServerSpanNameExtractor(
|
public RatpackTelemetryBuilder setServerSpanNameExtractor(
|
||||||
Function<SpanNameExtractor<? super Request>, ? extends SpanNameExtractor<? super Request>>
|
Function<SpanNameExtractor<? super Request>, ? extends SpanNameExtractor<? super Request>>
|
||||||
|
@ -167,7 +210,13 @@ public final class RatpackTelemetryBuilder {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns a new {@link RatpackTelemetry} with the configuration of this builder. */
|
/**
|
||||||
|
* Returns a new {@link RatpackTelemetry} with the configuration of this builder.
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link RatpackClientTelemetryBuilder#build()} and {@link
|
||||||
|
* RatpackServerTelemetryBuilder#build()} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public RatpackTelemetry build() {
|
public RatpackTelemetry build() {
|
||||||
return new RatpackTelemetry(serverBuilder.build(), clientBuilder.build());
|
return new RatpackTelemetry(serverBuilder.build(), clientBuilder.build());
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.instrumentation.ratpack.v1_7.internal;
|
||||||
|
|
||||||
|
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackClientTelemetryBuilder;
|
||||||
|
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackServerTelemetryBuilder;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is internal and experimental. Its APIs are unstable and can change at any time. Its
|
||||||
|
* APIs (or a version of them) may be promoted to the public stable API in the future, but no
|
||||||
|
* guarantees are made.
|
||||||
|
*/
|
||||||
|
public final class Experimental {
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static volatile BiConsumer<RatpackClientTelemetryBuilder, Boolean>
|
||||||
|
setEmitExperimentalClientTelemetry;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static volatile BiConsumer<RatpackServerTelemetryBuilder, Boolean>
|
||||||
|
setEmitExperimentalServerTelemetry;
|
||||||
|
|
||||||
|
public static void setEmitExperimentalTelemetry(
|
||||||
|
RatpackClientTelemetryBuilder builder, boolean emitExperimentalTelemetry) {
|
||||||
|
if (setEmitExperimentalClientTelemetry != null) {
|
||||||
|
setEmitExperimentalClientTelemetry.accept(builder, emitExperimentalTelemetry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setEmitExperimentalTelemetry(
|
||||||
|
RatpackServerTelemetryBuilder builder, boolean emitExperimentalTelemetry) {
|
||||||
|
if (setEmitExperimentalServerTelemetry != null) {
|
||||||
|
setEmitExperimentalServerTelemetry.accept(builder, emitExperimentalTelemetry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setSetEmitExperimentalClientTelemetry(
|
||||||
|
BiConsumer<RatpackClientTelemetryBuilder, Boolean> setEmitExperimentalClientTelemetry) {
|
||||||
|
Experimental.setEmitExperimentalClientTelemetry = setEmitExperimentalClientTelemetry;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setSetEmitExperimentalServerTelemetry(
|
||||||
|
BiConsumer<RatpackServerTelemetryBuilder, Boolean> setEmitExperimentalServerTelemetry) {
|
||||||
|
Experimental.setEmitExperimentalServerTelemetry = setEmitExperimentalServerTelemetry;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Experimental() {}
|
||||||
|
}
|
|
@ -11,7 +11,8 @@ import io.opentelemetry.api.trace.Tracer
|
||||||
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator
|
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator
|
||||||
import io.opentelemetry.context.Context
|
import io.opentelemetry.context.Context
|
||||||
import io.opentelemetry.context.propagation.ContextPropagators
|
import io.opentelemetry.context.propagation.ContextPropagators
|
||||||
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackTelemetry
|
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackClientTelemetry
|
||||||
|
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackServerTelemetry
|
||||||
import io.opentelemetry.sdk.OpenTelemetrySdk
|
import io.opentelemetry.sdk.OpenTelemetrySdk
|
||||||
import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter
|
import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter
|
||||||
import io.opentelemetry.sdk.trace.SdkTracerProvider
|
import io.opentelemetry.sdk.trace.SdkTracerProvider
|
||||||
|
@ -34,22 +35,21 @@ import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
import static io.opentelemetry.api.trace.SpanKind.CLIENT
|
import static io.opentelemetry.api.trace.SpanKind.CLIENT
|
||||||
import static io.opentelemetry.api.trace.SpanKind.SERVER
|
import static io.opentelemetry.api.trace.SpanKind.SERVER
|
||||||
import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD
|
import static io.opentelemetry.semconv.HttpAttributes.*
|
||||||
import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE
|
|
||||||
import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE
|
|
||||||
|
|
||||||
class InstrumentedHttpClientTest extends Specification {
|
class InstrumentedHttpClientTest extends Specification {
|
||||||
|
|
||||||
def spanExporter = InMemorySpanExporter.create()
|
def spanExporter = InMemorySpanExporter.create()
|
||||||
def tracerProvider = SdkTracerProvider.builder()
|
def tracerProvider = SdkTracerProvider.builder()
|
||||||
.addSpanProcessor(SimpleSpanProcessor.create(spanExporter))
|
.addSpanProcessor(SimpleSpanProcessor.create(spanExporter))
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
def openTelemetry = OpenTelemetrySdk.builder()
|
def openTelemetry = OpenTelemetrySdk.builder()
|
||||||
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
|
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
|
||||||
.setTracerProvider(tracerProvider).build()
|
.setTracerProvider(tracerProvider).build()
|
||||||
|
|
||||||
RatpackTelemetry telemetry = RatpackTelemetry.create(openTelemetry)
|
RatpackClientTelemetry telemetry = RatpackClientTelemetry.create(openTelemetry)
|
||||||
|
RatpackServerTelemetry serverTelemetry = RatpackServerTelemetry.create(openTelemetry)
|
||||||
|
|
||||||
def cleanup() {
|
def cleanup() {
|
||||||
spanExporter.reset()
|
spanExporter.reset()
|
||||||
|
@ -59,9 +59,9 @@ class InstrumentedHttpClientTest extends Specification {
|
||||||
expect:
|
expect:
|
||||||
def otherApp = EmbeddedApp.of { spec ->
|
def otherApp = EmbeddedApp.of { spec ->
|
||||||
spec.registry(
|
spec.registry(
|
||||||
Guice.registry { bindings ->
|
Guice.registry { bindings ->
|
||||||
telemetry.configureServerRegistry(bindings)
|
serverTelemetry.configureRegistry(bindings)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
spec.handlers {
|
spec.handlers {
|
||||||
it.get("bar") { ctx -> ctx.render("foo") }
|
it.get("bar") { ctx -> ctx.render("foo") }
|
||||||
|
@ -70,17 +70,17 @@ class InstrumentedHttpClientTest extends Specification {
|
||||||
|
|
||||||
def app = EmbeddedApp.of { spec ->
|
def app = EmbeddedApp.of { spec ->
|
||||||
spec.registry(
|
spec.registry(
|
||||||
Guice.registry { bindings ->
|
Guice.registry { bindings ->
|
||||||
telemetry.configureServerRegistry(bindings)
|
serverTelemetry.configureRegistry(bindings)
|
||||||
bindings.bindInstance(HttpClient, telemetry.instrumentHttpClient(HttpClient.of(Action.noop())))
|
bindings.bindInstance(HttpClient, telemetry.instrument(HttpClient.of(Action.noop())))
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
spec.handlers { chain ->
|
spec.handlers { chain ->
|
||||||
chain.get("foo") { ctx ->
|
chain.get("foo") { ctx ->
|
||||||
HttpClient instrumentedHttpClient = ctx.get(HttpClient)
|
HttpClient instrumentedHttpClient = ctx.get(HttpClient)
|
||||||
instrumentedHttpClient.get(new URI("${otherApp.address}bar"))
|
instrumentedHttpClient.get(new URI("${otherApp.address}bar"))
|
||||||
.then { ctx.render("bar") }
|
.then { ctx.render("bar") }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -131,10 +131,10 @@ class InstrumentedHttpClientTest extends Specification {
|
||||||
|
|
||||||
def app = EmbeddedApp.of { spec ->
|
def app = EmbeddedApp.of { spec ->
|
||||||
spec.registry(
|
spec.registry(
|
||||||
Guice.registry { bindings ->
|
Guice.registry { bindings ->
|
||||||
telemetry.configureServerRegistry(bindings)
|
serverTelemetry.configureRegistry(bindings)
|
||||||
bindings.bindInstance(HttpClient, telemetry.instrumentHttpClient(HttpClient.of(Action.noop())))
|
bindings.bindInstance(HttpClient, telemetry.instrument(HttpClient.of(Action.noop())))
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
spec.handlers { chain ->
|
spec.handlers { chain ->
|
||||||
|
@ -189,27 +189,27 @@ class InstrumentedHttpClientTest extends Specification {
|
||||||
spec.handlers {
|
spec.handlers {
|
||||||
it.get("foo") { ctx ->
|
it.get("foo") { ctx ->
|
||||||
Promise.value("bar").defer(Duration.ofSeconds(1L))
|
Promise.value("bar").defer(Duration.ofSeconds(1L))
|
||||||
.then { ctx.render("bar") }
|
.then { ctx.render("bar") }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def app = EmbeddedApp.of { spec ->
|
def app = EmbeddedApp.of { spec ->
|
||||||
spec.registry(
|
spec.registry(
|
||||||
Guice.registry { bindings ->
|
Guice.registry { bindings ->
|
||||||
telemetry.configureServerRegistry(bindings)
|
serverTelemetry.configureRegistry(bindings)
|
||||||
bindings.bindInstance(HttpClient, telemetry.instrumentHttpClient(
|
bindings.bindInstance(HttpClient, telemetry.instrument(
|
||||||
HttpClient.of { s -> s.readTimeout(Duration.ofMillis(10)) })
|
HttpClient.of { s -> s.readTimeout(Duration.ofMillis(10)) })
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
spec.handlers { chain ->
|
spec.handlers { chain ->
|
||||||
chain.get("path-name") { ctx ->
|
chain.get("path-name") { ctx ->
|
||||||
def instrumentedHttpClient = ctx.get(HttpClient)
|
def instrumentedHttpClient = ctx.get(HttpClient)
|
||||||
instrumentedHttpClient.get(new URI("${otherApp.address}foo"))
|
instrumentedHttpClient.get(new URI("${otherApp.address}foo"))
|
||||||
.onError { ctx.render("error") }
|
.onError { ctx.render("error") }
|
||||||
.then { ctx.render("hello") }
|
.then { ctx.render("hello") }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -253,11 +253,11 @@ class InstrumentedHttpClientTest extends Specification {
|
||||||
|
|
||||||
def app = EmbeddedApp.of { spec ->
|
def app = EmbeddedApp.of { spec ->
|
||||||
spec.registry(
|
spec.registry(
|
||||||
Guice.registry { bindings ->
|
Guice.registry { bindings ->
|
||||||
telemetry.configureServerRegistry(bindings)
|
serverTelemetry.configureRegistry(bindings)
|
||||||
bindings.bindInstance(HttpClient, telemetry.instrumentHttpClient(HttpClient.of(Action.noop())))
|
bindings.bindInstance(HttpClient, telemetry.instrument(HttpClient.of(Action.noop())))
|
||||||
bindings.bindInstance(new BarService(latch, "${otherApp.address}foo", openTelemetry))
|
bindings.bindInstance(new BarService(latch, "${otherApp.address}foo", openTelemetry))
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
spec.handlers { chain ->
|
spec.handlers { chain ->
|
||||||
chain.get("foo") { ctx -> ctx.render("bar") }
|
chain.get("foo") { ctx -> ctx.render("bar") }
|
||||||
|
@ -286,11 +286,11 @@ class InstrumentedHttpClientTest extends Specification {
|
||||||
|
|
||||||
def app = EmbeddedApp.of { spec ->
|
def app = EmbeddedApp.of { spec ->
|
||||||
spec.registry(
|
spec.registry(
|
||||||
Guice.registry { bindings ->
|
Guice.registry { bindings ->
|
||||||
telemetry.configureServerRegistry(bindings)
|
serverTelemetry.configureRegistry(bindings)
|
||||||
bindings.bindInstance(HttpClient, telemetry.instrumentHttpClient(HttpClient.of(Action.noop())))
|
bindings.bindInstance(HttpClient, telemetry.instrument(HttpClient.of(Action.noop())))
|
||||||
bindings.bindInstance(new BarForkService(latch, "${otherApp.address}foo", openTelemetry))
|
bindings.bindInstance(new BarForkService(latch, "${otherApp.address}foo", openTelemetry))
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
spec.handlers { chain ->
|
spec.handlers { chain ->
|
||||||
chain.get("foo") { ctx -> ctx.render("bar") }
|
chain.get("foo") { ctx -> ctx.render("bar") }
|
||||||
|
@ -324,24 +324,23 @@ class BarService implements Service {
|
||||||
void onStart(StartEvent event) {
|
void onStart(StartEvent event) {
|
||||||
def parentContext = Context.current()
|
def parentContext = Context.current()
|
||||||
def span = tracer.spanBuilder("a-span")
|
def span = tracer.spanBuilder("a-span")
|
||||||
.setParent(parentContext)
|
.setParent(parentContext)
|
||||||
.startSpan()
|
.startSpan()
|
||||||
|
|
||||||
Context otelContext = parentContext.with(span)
|
Context otelContext = parentContext.with(span)
|
||||||
otelContext.makeCurrent().withCloseable {
|
otelContext.makeCurrent().withCloseable {
|
||||||
Execution.current().add(Context, otelContext)
|
Execution.current().add(Context, otelContext)
|
||||||
def httpClient = event.registry.get(HttpClient)
|
def httpClient = event.registry.get(HttpClient)
|
||||||
httpClient.get(new URI(url))
|
httpClient.get(new URI(url))
|
||||||
.flatMap { httpClient.get(new URI(url)) }
|
.flatMap { httpClient.get(new URI(url)) }
|
||||||
.then {
|
.then {
|
||||||
span.end()
|
span.end()
|
||||||
latch.countDown()
|
latch.countDown()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class BarForkService implements Service {
|
class BarForkService implements Service {
|
||||||
private final String url
|
private final String url
|
||||||
private final CountDownLatch latch
|
private final CountDownLatch latch
|
||||||
|
@ -359,19 +358,19 @@ class BarForkService implements Service {
|
||||||
Execution.fork().start {
|
Execution.fork().start {
|
||||||
def parentContext = Context.current()
|
def parentContext = Context.current()
|
||||||
def span = tracer.spanBuilder("a-span")
|
def span = tracer.spanBuilder("a-span")
|
||||||
.setParent(parentContext)
|
.setParent(parentContext)
|
||||||
.startSpan()
|
.startSpan()
|
||||||
|
|
||||||
Context otelContext = parentContext.with(span)
|
Context otelContext = parentContext.with(span)
|
||||||
otelContext.makeCurrent().withCloseable {
|
otelContext.makeCurrent().withCloseable {
|
||||||
Execution.current().add(Context, otelContext)
|
Execution.current().add(Context, otelContext)
|
||||||
def httpClient = event.registry.get(HttpClient)
|
def httpClient = event.registry.get(HttpClient)
|
||||||
httpClient.get(new URI(url))
|
httpClient.get(new URI(url))
|
||||||
.flatMap { httpClient.get(new URI(url)) }
|
.flatMap { httpClient.get(new URI(url)) }
|
||||||
.then {
|
.then {
|
||||||
span.end()
|
span.end()
|
||||||
latch.countDown()
|
latch.countDown()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,9 +10,9 @@ import com.google.inject.Provides
|
||||||
import groovy.transform.CompileStatic
|
import groovy.transform.CompileStatic
|
||||||
import io.opentelemetry.api.OpenTelemetry
|
import io.opentelemetry.api.OpenTelemetry
|
||||||
import io.opentelemetry.api.trace.SpanKind
|
import io.opentelemetry.api.trace.SpanKind
|
||||||
import io.opentelemetry.instrumentation.ratpack.v1_7.internal.OpenTelemetryServerHandler
|
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackClientTelemetry
|
||||||
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackFunctionalTest
|
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackFunctionalTest
|
||||||
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackTelemetry
|
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackServerTelemetry
|
||||||
import io.opentelemetry.sdk.OpenTelemetrySdk
|
import io.opentelemetry.sdk.OpenTelemetrySdk
|
||||||
import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter
|
import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter
|
||||||
import io.opentelemetry.sdk.trace.SdkTracerProvider
|
import io.opentelemetry.sdk.trace.SdkTracerProvider
|
||||||
|
@ -21,6 +21,7 @@ import io.opentelemetry.sdk.trace.export.SpanExporter
|
||||||
import ratpack.exec.ExecInitializer
|
import ratpack.exec.ExecInitializer
|
||||||
import ratpack.exec.ExecInterceptor
|
import ratpack.exec.ExecInterceptor
|
||||||
import ratpack.guice.Guice
|
import ratpack.guice.Guice
|
||||||
|
import ratpack.handling.Handler
|
||||||
import ratpack.http.client.HttpClient
|
import ratpack.http.client.HttpClient
|
||||||
import ratpack.server.RatpackServer
|
import ratpack.server.RatpackServer
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
@ -28,9 +29,7 @@ import spock.util.concurrent.PollingConditions
|
||||||
|
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD
|
import static io.opentelemetry.semconv.HttpAttributes.*
|
||||||
import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE
|
|
||||||
import static io.opentelemetry.semconv.HttpAttributes.HTTP_ROUTE
|
|
||||||
import static io.opentelemetry.semconv.UrlAttributes.URL_PATH
|
import static io.opentelemetry.semconv.UrlAttributes.URL_PATH
|
||||||
|
|
||||||
class RatpackServerApplicationTest extends Specification {
|
class RatpackServerApplicationTest extends Specification {
|
||||||
|
@ -104,20 +103,26 @@ class OpenTelemetryModule extends AbstractModule {
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
RatpackTelemetry ratpackTracing(OpenTelemetry openTelemetry) {
|
RatpackClientTelemetry ratpackClientTelemetry(OpenTelemetry openTelemetry) {
|
||||||
return RatpackTelemetry.create(openTelemetry)
|
return RatpackClientTelemetry.create(openTelemetry)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
OpenTelemetryServerHandler ratpackServerHandler(RatpackTelemetry ratpackTracing) {
|
RatpackServerTelemetry ratpackServerTelemetry(OpenTelemetry openTelemetry) {
|
||||||
return ratpackTracing.getOpenTelemetryServerHandler()
|
return RatpackServerTelemetry.create(openTelemetry)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
ExecInterceptor ratpackExecInterceptor(RatpackTelemetry ratpackTracing) {
|
Handler ratpackServerHandler(RatpackServerTelemetry ratpackTracing) {
|
||||||
return ratpackTracing.getOpenTelemetryExecInterceptor()
|
return ratpackTracing.getHandler()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
@Provides
|
||||||
|
ExecInterceptor ratpackExecInterceptor(RatpackServerTelemetry ratpackTracing) {
|
||||||
|
return ratpackTracing.getExecInterceptor()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
|
@ -131,14 +136,14 @@ class OpenTelemetryModule extends AbstractModule {
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
HttpClient instrumentedHttpClient(RatpackTelemetry ratpackTracing) {
|
HttpClient instrumentedHttpClient(RatpackClientTelemetry ratpackTracing) {
|
||||||
return ratpackTracing.instrumentHttpClient(HttpClient.of {})
|
return ratpackTracing.instrument(HttpClient.of {})
|
||||||
}
|
}
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
ExecInitializer ratpackExecInitializer(RatpackTelemetry ratpackTracing) {
|
ExecInitializer ratpackExecInitializer(RatpackServerTelemetry ratpackTracing) {
|
||||||
return ratpackTracing.getOpenTelemetryExecInitializer()
|
return ratpackTracing.getExecInitializer()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,7 +157,7 @@ class RatpackApp {
|
||||||
.handlers { chain ->
|
.handlers { chain ->
|
||||||
chain
|
chain
|
||||||
.get("ignore") { ctx -> ctx.render("ignored") }
|
.get("ignore") { ctx -> ctx.render("ignored") }
|
||||||
.all(OpenTelemetryServerHandler)
|
.all(Handler)
|
||||||
.get("foo") { ctx -> ctx.render("hi-foo") }
|
.get("foo") { ctx -> ctx.render("hi-foo") }
|
||||||
.get("bar") { ctx ->
|
.get("bar") { ctx ->
|
||||||
ctx.get(HttpClient).get(ctx.get(URI))
|
ctx.get(HttpClient).get(ctx.get(URI))
|
||||||
|
|
|
@ -8,7 +8,7 @@ package io.opentelemetry.instrumentation.ratpack.v1_7.server
|
||||||
import io.opentelemetry.api.trace.SpanKind
|
import io.opentelemetry.api.trace.SpanKind
|
||||||
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator
|
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator
|
||||||
import io.opentelemetry.context.propagation.ContextPropagators
|
import io.opentelemetry.context.propagation.ContextPropagators
|
||||||
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackTelemetry
|
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackServerTelemetry
|
||||||
import io.opentelemetry.sdk.OpenTelemetrySdk
|
import io.opentelemetry.sdk.OpenTelemetrySdk
|
||||||
import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter
|
import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter
|
||||||
import io.opentelemetry.sdk.trace.SdkTracerProvider
|
import io.opentelemetry.sdk.trace.SdkTracerProvider
|
||||||
|
@ -32,7 +32,7 @@ class RatpackServerTest extends Specification {
|
||||||
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
|
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
|
||||||
.setTracerProvider(tracerProvider).build()
|
.setTracerProvider(tracerProvider).build()
|
||||||
|
|
||||||
def telemetry = RatpackTelemetry.create(openTelemetry)
|
def telemetry = RatpackServerTelemetry.create(openTelemetry)
|
||||||
|
|
||||||
def cleanup() {
|
def cleanup() {
|
||||||
spanExporter.reset()
|
spanExporter.reset()
|
||||||
|
@ -41,7 +41,7 @@ class RatpackServerTest extends Specification {
|
||||||
def "add span on handlers"() {
|
def "add span on handlers"() {
|
||||||
given:
|
given:
|
||||||
def app = EmbeddedApp.of { spec ->
|
def app = EmbeddedApp.of { spec ->
|
||||||
spec.registry { Registry.of { telemetry.configureServerRegistry(it) } }
|
spec.registry { Registry.of { telemetry.configureRegistry(it) } }
|
||||||
spec.handlers { chain ->
|
spec.handlers { chain ->
|
||||||
chain.get("foo") { ctx -> ctx.render("hi-foo") }
|
chain.get("foo") { ctx -> ctx.render("hi-foo") }
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,7 @@ class RatpackServerTest extends Specification {
|
||||||
def "propagate trace with instrumented async operations"() {
|
def "propagate trace with instrumented async operations"() {
|
||||||
expect:
|
expect:
|
||||||
def app = EmbeddedApp.of { spec ->
|
def app = EmbeddedApp.of { spec ->
|
||||||
spec.registry { Registry.of { telemetry.configureServerRegistry(it) } }
|
spec.registry { Registry.of { telemetry.configureRegistry(it) } }
|
||||||
spec.handlers { chain ->
|
spec.handlers { chain ->
|
||||||
chain.get("foo") { ctx ->
|
chain.get("foo") { ctx ->
|
||||||
ctx.render("hi-foo")
|
ctx.render("hi-foo")
|
||||||
|
@ -106,7 +106,7 @@ class RatpackServerTest extends Specification {
|
||||||
def "propagate trace with instrumented async concurrent operations"() {
|
def "propagate trace with instrumented async concurrent operations"() {
|
||||||
expect:
|
expect:
|
||||||
def app = EmbeddedApp.of { spec ->
|
def app = EmbeddedApp.of { spec ->
|
||||||
spec.registry { Registry.of { telemetry.configureServerRegistry(it) } }
|
spec.registry { Registry.of { telemetry.configureRegistry(it) } }
|
||||||
spec.handlers { chain ->
|
spec.handlers { chain ->
|
||||||
chain.get("bar") { ctx ->
|
chain.get("bar") { ctx ->
|
||||||
ctx.render("hi-bar")
|
ctx.render("hi-bar")
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.instrumentation.ratpack.v1_7;
|
||||||
|
|
||||||
|
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
|
||||||
|
import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest;
|
||||||
|
import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension;
|
||||||
|
import java.util.Collections;
|
||||||
|
import org.junit.jupiter.api.extension.RegisterExtension;
|
||||||
|
import ratpack.func.Action;
|
||||||
|
import ratpack.http.client.HttpClient;
|
||||||
|
import ratpack.http.client.HttpClientSpec;
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // testing deprecated API
|
||||||
|
class RatpackHttpClientOldTest extends AbstractRatpackHttpClientTest {
|
||||||
|
|
||||||
|
@RegisterExtension
|
||||||
|
static final InstrumentationExtension testing = HttpClientInstrumentationExtension.forLibrary();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected HttpClient buildHttpClient() throws Exception {
|
||||||
|
return RatpackTelemetry.builder(testing.getOpenTelemetry())
|
||||||
|
.setCapturedClientRequestHeaders(
|
||||||
|
Collections.singletonList(AbstractHttpClientTest.TEST_REQUEST_HEADER))
|
||||||
|
.setCapturedClientResponseHeaders(
|
||||||
|
Collections.singletonList(AbstractHttpClientTest.TEST_RESPONSE_HEADER))
|
||||||
|
.build()
|
||||||
|
.instrumentHttpClient(HttpClient.of(Action.noop()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected HttpClient buildHttpClient(Action<? super HttpClientSpec> action) throws Exception {
|
||||||
|
return RatpackClientTelemetry.create(testing.getOpenTelemetry())
|
||||||
|
.instrument(HttpClient.of(action));
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,18 +21,18 @@ class RatpackHttpClientTest extends AbstractRatpackHttpClientTest {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected HttpClient buildHttpClient() throws Exception {
|
protected HttpClient buildHttpClient() throws Exception {
|
||||||
return RatpackTelemetry.builder(testing.getOpenTelemetry())
|
return RatpackClientTelemetry.builder(testing.getOpenTelemetry())
|
||||||
.setCapturedClientRequestHeaders(
|
.setCapturedRequestHeaders(
|
||||||
Collections.singletonList(AbstractHttpClientTest.TEST_REQUEST_HEADER))
|
Collections.singletonList(AbstractHttpClientTest.TEST_REQUEST_HEADER))
|
||||||
.setCapturedClientResponseHeaders(
|
.setCapturedResponseHeaders(
|
||||||
Collections.singletonList(AbstractHttpClientTest.TEST_RESPONSE_HEADER))
|
Collections.singletonList(AbstractHttpClientTest.TEST_RESPONSE_HEADER))
|
||||||
.build()
|
.build()
|
||||||
.instrumentHttpClient(HttpClient.of(Action.noop()));
|
.instrument(HttpClient.of(Action.noop()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected HttpClient buildHttpClient(Action<? super HttpClientSpec> action) throws Exception {
|
protected HttpClient buildHttpClient(Action<? super HttpClientSpec> action) throws Exception {
|
||||||
return RatpackTelemetry.create(testing.getOpenTelemetry())
|
return RatpackClientTelemetry.create(testing.getOpenTelemetry())
|
||||||
.instrumentHttpClient(HttpClient.of(action));
|
.instrument(HttpClient.of(action));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ package io.opentelemetry.instrumentation.ratpack.v1_7.server;
|
||||||
import static java.util.Collections.singletonList;
|
import static java.util.Collections.singletonList;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.ratpack.server.AbstractRatpackAsyncHttpServerTest;
|
import io.opentelemetry.instrumentation.ratpack.server.AbstractRatpackAsyncHttpServerTest;
|
||||||
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackTelemetry;
|
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackServerTelemetry;
|
||||||
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
|
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
|
||||||
import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest;
|
import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest;
|
||||||
import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension;
|
import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension;
|
||||||
|
@ -24,14 +24,12 @@ class RatpackAsyncHttpServerTest extends AbstractRatpackAsyncHttpServerTest {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void configure(RatpackServerSpec serverSpec) throws Exception {
|
protected void configure(RatpackServerSpec serverSpec) throws Exception {
|
||||||
RatpackTelemetry telemetry =
|
RatpackServerTelemetry telemetry =
|
||||||
RatpackTelemetry.builder(testing.getOpenTelemetry())
|
RatpackServerTelemetry.builder(testing.getOpenTelemetry())
|
||||||
.setCapturedServerRequestHeaders(
|
.setCapturedRequestHeaders(singletonList(AbstractHttpServerTest.TEST_REQUEST_HEADER))
|
||||||
singletonList(AbstractHttpServerTest.TEST_REQUEST_HEADER))
|
.setCapturedResponseHeaders(singletonList(AbstractHttpServerTest.TEST_RESPONSE_HEADER))
|
||||||
.setCapturedServerResponseHeaders(
|
|
||||||
singletonList(AbstractHttpServerTest.TEST_RESPONSE_HEADER))
|
|
||||||
.build();
|
.build();
|
||||||
serverSpec.registryOf(telemetry::configureServerRegistry);
|
serverSpec.registryOf(telemetry::configureRegistry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -8,7 +8,7 @@ package io.opentelemetry.instrumentation.ratpack.v1_7.server;
|
||||||
import static java.util.Collections.singletonList;
|
import static java.util.Collections.singletonList;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.ratpack.server.AbstractRatpackForkedHttpServerTest;
|
import io.opentelemetry.instrumentation.ratpack.server.AbstractRatpackForkedHttpServerTest;
|
||||||
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackTelemetry;
|
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackServerTelemetry;
|
||||||
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
|
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
|
||||||
import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest;
|
import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest;
|
||||||
import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension;
|
import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension;
|
||||||
|
@ -24,14 +24,12 @@ class RatpackForkedHttpServerTest extends AbstractRatpackForkedHttpServerTest {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void configure(RatpackServerSpec serverSpec) throws Exception {
|
protected void configure(RatpackServerSpec serverSpec) throws Exception {
|
||||||
RatpackTelemetry telemetry =
|
RatpackServerTelemetry telemetry =
|
||||||
RatpackTelemetry.builder(testing.getOpenTelemetry())
|
RatpackServerTelemetry.builder(testing.getOpenTelemetry())
|
||||||
.setCapturedServerRequestHeaders(
|
.setCapturedRequestHeaders(singletonList(AbstractHttpServerTest.TEST_REQUEST_HEADER))
|
||||||
singletonList(AbstractHttpServerTest.TEST_REQUEST_HEADER))
|
.setCapturedResponseHeaders(singletonList(AbstractHttpServerTest.TEST_RESPONSE_HEADER))
|
||||||
.setCapturedServerResponseHeaders(
|
|
||||||
singletonList(AbstractHttpServerTest.TEST_RESPONSE_HEADER))
|
|
||||||
.build();
|
.build();
|
||||||
serverSpec.registryOf(telemetry::configureServerRegistry);
|
serverSpec.registryOf(telemetry::configureRegistry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.instrumentation.ratpack.v1_7.server;
|
||||||
|
|
||||||
|
import static java.util.Collections.singletonList;
|
||||||
|
|
||||||
|
import io.opentelemetry.instrumentation.ratpack.server.AbstractRatpackHttpServerTest;
|
||||||
|
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
|
||||||
|
import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest;
|
||||||
|
import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension;
|
||||||
|
import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions;
|
||||||
|
import org.junit.jupiter.api.extension.RegisterExtension;
|
||||||
|
import ratpack.server.RatpackServerSpec;
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") // testing deprecated API
|
||||||
|
class RatpackHttpServerOldTest extends AbstractRatpackHttpServerTest {
|
||||||
|
|
||||||
|
@RegisterExtension
|
||||||
|
public static final InstrumentationExtension testing =
|
||||||
|
HttpServerInstrumentationExtension.forLibrary();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configure(RatpackServerSpec serverSpec) throws Exception {
|
||||||
|
io.opentelemetry.instrumentation.ratpack.v1_7.RatpackTelemetry telemetry =
|
||||||
|
io.opentelemetry.instrumentation.ratpack.v1_7.RatpackTelemetry.builder(
|
||||||
|
testing.getOpenTelemetry())
|
||||||
|
.setCapturedServerRequestHeaders(
|
||||||
|
singletonList(AbstractHttpServerTest.TEST_REQUEST_HEADER))
|
||||||
|
.setCapturedServerResponseHeaders(
|
||||||
|
singletonList(AbstractHttpServerTest.TEST_RESPONSE_HEADER))
|
||||||
|
.build();
|
||||||
|
serverSpec.registryOf(telemetry::configureServerRegistry);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configure(HttpServerTestOptions options) {
|
||||||
|
super.configure(options);
|
||||||
|
|
||||||
|
options.setHasHandlerSpan(endpoint -> false);
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,7 +8,7 @@ package io.opentelemetry.instrumentation.ratpack.v1_7.server;
|
||||||
import static java.util.Collections.singletonList;
|
import static java.util.Collections.singletonList;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.ratpack.server.AbstractRatpackHttpServerTest;
|
import io.opentelemetry.instrumentation.ratpack.server.AbstractRatpackHttpServerTest;
|
||||||
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackTelemetry;
|
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackServerTelemetry;
|
||||||
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
|
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
|
||||||
import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest;
|
import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest;
|
||||||
import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension;
|
import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension;
|
||||||
|
@ -24,14 +24,12 @@ class RatpackHttpServerTest extends AbstractRatpackHttpServerTest {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void configure(RatpackServerSpec serverSpec) throws Exception {
|
protected void configure(RatpackServerSpec serverSpec) throws Exception {
|
||||||
RatpackTelemetry telemetry =
|
RatpackServerTelemetry telemetry =
|
||||||
RatpackTelemetry.builder(testing.getOpenTelemetry())
|
RatpackServerTelemetry.builder(testing.getOpenTelemetry())
|
||||||
.setCapturedServerRequestHeaders(
|
.setCapturedRequestHeaders(singletonList(AbstractHttpServerTest.TEST_REQUEST_HEADER))
|
||||||
singletonList(AbstractHttpServerTest.TEST_REQUEST_HEADER))
|
.setCapturedResponseHeaders(singletonList(AbstractHttpServerTest.TEST_RESPONSE_HEADER))
|
||||||
.setCapturedServerResponseHeaders(
|
|
||||||
singletonList(AbstractHttpServerTest.TEST_RESPONSE_HEADER))
|
|
||||||
.build();
|
.build();
|
||||||
serverSpec.registryOf(telemetry::configureServerRegistry);
|
serverSpec.registryOf(telemetry::configureRegistry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
package io.opentelemetry.instrumentation.ratpack.v1_7.server;
|
package io.opentelemetry.instrumentation.ratpack.v1_7.server;
|
||||||
|
|
||||||
import io.opentelemetry.instrumentation.ratpack.server.AbstractRatpackRoutesTest;
|
import io.opentelemetry.instrumentation.ratpack.server.AbstractRatpackRoutesTest;
|
||||||
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackTelemetry;
|
import io.opentelemetry.instrumentation.ratpack.v1_7.RatpackServerTelemetry;
|
||||||
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
|
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
|
||||||
import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension;
|
import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension;
|
||||||
import org.junit.jupiter.api.extension.RegisterExtension;
|
import org.junit.jupiter.api.extension.RegisterExtension;
|
||||||
|
@ -24,8 +24,8 @@ class RatpackRoutesTest extends AbstractRatpackRoutesTest {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void configure(RatpackServerSpec serverSpec) throws Exception {
|
protected void configure(RatpackServerSpec serverSpec) throws Exception {
|
||||||
RatpackTelemetry telemetry = RatpackTelemetry.create(testing.getOpenTelemetry());
|
RatpackServerTelemetry telemetry = RatpackServerTelemetry.create(testing.getOpenTelemetry());
|
||||||
serverSpec.registryOf(telemetry::configureServerRegistry);
|
serverSpec.registryOf(telemetry::configureRegistry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in New Issue