From 76dbc9ccd61bc8b20983efcf44f23efb75dac4c8 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Thu, 6 Feb 2025 00:44:53 -0500 Subject: [PATCH 01/30] start --- .../java-http-server/library/build.gradle.kts | 18 ++ .../httpserver/JdkServerTelemetry.java | 31 +++ .../httpserver/JdkServerTelemetryBuilder.java | 109 +++++++++ .../httpserver/OpenTelemetryService.java | 44 ++++ .../internal/ExchangeContextGetter.java | 42 ++++ .../JdkHttpServerAttributesGetter.java | 89 ++++++++ .../JdkInstrumenterBuilderFactory.java | 25 ++ .../internal/JdkInstrumenterBuilderUtil.java | 40 ++++ .../httpserver/JdkHttpServerTest.java | 36 +++ .../java-http-server/testing/build.gradle.kts | 11 + .../httpserver/AbstractJdkHttpServerTest.java | 216 ++++++++++++++++++ settings.gradle.kts | 2 + 12 files changed, 663 insertions(+) create mode 100644 instrumentation/java-http-server/library/build.gradle.kts create mode 100644 instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetry.java create mode 100644 instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetryBuilder.java create mode 100644 instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryService.java create mode 100644 instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/ExchangeContextGetter.java create mode 100644 instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkHttpServerAttributesGetter.java create mode 100644 instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderFactory.java create mode 100644 instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderUtil.java create mode 100644 instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java create mode 100644 instrumentation/java-http-server/testing/build.gradle.kts create mode 100644 instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java diff --git a/instrumentation/java-http-server/library/build.gradle.kts b/instrumentation/java-http-server/library/build.gradle.kts new file mode 100644 index 000000000000..0d1531b62b9b --- /dev/null +++ b/instrumentation/java-http-server/library/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + id("otel.library-instrumentation") + id("otel.nullaway-conventions") +} + +dependencies { + testImplementation(project(":instrumentation:java-http-server:testing")) +} + +otelJava { + minJavaVersionSupported.set(JavaVersion.VERSION_17) +} + +tasks { + withType().configureEach { + systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) + } +} diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetry.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetry.java new file mode 100644 index 000000000000..d168bf0ee835 --- /dev/null +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetry.java @@ -0,0 +1,31 @@ +package io.opentelemetry.instrumentation.httpserver; + +import com.sun.net.httpserver.Filter; +import com.sun.net.httpserver.HttpExchange; + +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; + +/** Entrypoint for instrumenting Armeria services. */ +public final class JdkServerTelemetry { + + /** Returns a new {@link JdkServerTelemetry} configured with the given {@link OpenTelemetry}. */ + public static JdkServerTelemetry create(OpenTelemetry openTelemetry) { + return builder(openTelemetry).build(); + } + + public static JdkServerTelemetryBuilder builder(OpenTelemetry openTelemetry) { + return new JdkServerTelemetryBuilder(openTelemetry); + } + + private final Instrumenter instrumenter; + + JdkServerTelemetry(Instrumenter instrumenter) { + this.instrumenter = instrumenter; + } + + /** Returns a new {@link Filter} for telemetry usage */ + public Filter otelFilter() { + return new OpenTelemetryService(instrumenter); + } +} diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetryBuilder.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetryBuilder.java new file mode 100644 index 000000000000..70f043d74ad4 --- /dev/null +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetryBuilder.java @@ -0,0 +1,109 @@ +package io.opentelemetry.instrumentation.httpserver; + +import java.util.Collection; +import java.util.function.Function; + +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import com.sun.net.httpserver.HttpExchange; + +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.instrumenter.SpanStatusExtractor; +import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder; +import io.opentelemetry.instrumentation.httpserver.internal.JdkInstrumenterBuilderFactory; +import io.opentelemetry.instrumentation.httpserver.internal.JdkInstrumenterBuilderUtil; + +public final class JdkServerTelemetryBuilder { + + private final DefaultHttpServerInstrumenterBuilder builder; + + static { + JdkInstrumenterBuilderUtil.setServerBuilderExtractor(builder -> builder.builder); + } + + JdkServerTelemetryBuilder(OpenTelemetry openTelemetry) { + builder = JdkInstrumenterBuilderFactory.getServerBuilder(openTelemetry); + } + + /** Sets the status extractor for server spans. */ + @CanIgnoreReturnValue + public JdkServerTelemetryBuilder setStatusExtractor( + Function< + SpanStatusExtractor, + ? extends SpanStatusExtractor> + statusExtractor) { + builder.setStatusExtractor(statusExtractor); + return this; + } + + /** + * Adds an extra {@link AttributesExtractor} to invoke to set attributes to instrumented items. + * The {@link AttributesExtractor} will be executed after all default extractors. + */ + @CanIgnoreReturnValue + public JdkServerTelemetryBuilder addAttributesExtractor( + AttributesExtractor 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 JdkServerTelemetryBuilder setCapturedRequestHeaders( + Collection 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 JdkServerTelemetryBuilder setCapturedResponseHeaders( + Collection responseHeaders) { + builder.setCapturedResponseHeaders(responseHeaders); + return this; + } + + /** + * Configures the instrumentation to recognize an alternative set of HTTP request methods. + * + *

By default, this instrumentation defines "known" methods as the ones listed in RFC9110 and the PATCH + * method defined in RFC5789. + * + *

Note: calling this method overrides the default known method sets completely; it does + * not supplement it. + * + * @param knownMethods A set of recognized HTTP request methods. + * @see HttpServerAttributesExtractorBuilder#setKnownMethods(Collection) + */ + @CanIgnoreReturnValue + public JdkServerTelemetryBuilder setKnownMethods(Collection knownMethods) { + builder.setKnownMethods(knownMethods); + return this; + } + + /** Sets custom server {@link SpanNameExtractor} via transform function. */ + @CanIgnoreReturnValue + public JdkServerTelemetryBuilder setSpanNameExtractor( + Function< + SpanNameExtractor, + ? extends SpanNameExtractor> + serverSpanNameExtractor) { + builder.setSpanNameExtractor(serverSpanNameExtractor); + return this; + } + + public JdkServerTelemetry build() { + return new JdkServerTelemetry(builder.build()); + } +} diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryService.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryService.java new file mode 100644 index 000000000000..f68132292360 --- /dev/null +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryService.java @@ -0,0 +1,44 @@ +package io.opentelemetry.instrumentation.httpserver; + +import java.io.IOException; + +import com.sun.net.httpserver.Filter; +import com.sun.net.httpserver.HttpExchange; + +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; + +/** Decorates an {@link HttpServer} to trace inbound {@link HttpExchange}s. */ +final class OpenTelemetryService extends Filter { + + private final Instrumenter instrumenter; + + OpenTelemetryService(Instrumenter instrumenter) { + + this.instrumenter = instrumenter; + } + + @Override + public void doFilter(HttpExchange exchange, Chain chain) throws IOException { + + Context parentContext = Context.current(); + if (!instrumenter.shouldStart(parentContext, exchange)) { + chain.doFilter(exchange); + return; + } + + Context context = instrumenter.start(parentContext, exchange); + + try (Scope ignored = context.makeCurrent()) { + chain.doFilter(exchange); + } finally { + instrumenter.end(context, exchange, exchange, null); + } + } + + @Override + public String description() { + return "OpenTelemetry"; + } +} diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/ExchangeContextGetter.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/ExchangeContextGetter.java new file mode 100644 index 000000000000..13a0d5fe4776 --- /dev/null +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/ExchangeContextGetter.java @@ -0,0 +1,42 @@ +package io.opentelemetry.instrumentation.httpserver.internal; + +import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter; +import java.util.Collections; +import java.util.Iterator; +import java.util.stream.Collectors; +import javax.annotation.Nullable; + +import com.sun.net.httpserver.HttpExchange; + +enum ExchangeContextGetter implements ExtendedTextMapGetter { + INSTANCE; + + @Override + public Iterable keys(@Nullable HttpExchange exchange) { + if (exchange == null) { + return Collections.emptyList(); + } + return exchange.getRequestHeaders().keySet().stream().collect(Collectors.toList()); + } + + @Nullable + @Override + public String get(@Nullable HttpExchange carrier, String key) { + if (carrier == null) { + return null; + } + var list = carrier.getRequestHeaders().get(key); + + return list != null ? list.get(0) : null; + } + + @Override + public Iterator getAll(@Nullable HttpExchange carrier, String key) { + if (carrier == null) { + return Collections.emptyIterator(); + } + var list = carrier.getRequestHeaders().get(key); + + return list != null ? list.iterator() : Collections.emptyIterator(); + } +} diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkHttpServerAttributesGetter.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkHttpServerAttributesGetter.java new file mode 100644 index 000000000000..d39943914757 --- /dev/null +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkHttpServerAttributesGetter.java @@ -0,0 +1,89 @@ +package io.opentelemetry.instrumentation.httpserver.internal; + +import java.net.InetSocketAddress; +import java.util.List; + +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpsExchange; + +import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesGetter; +import javax.annotation.Nullable; + +enum JdkHttpServerAttributesGetter + implements HttpServerAttributesGetter { + INSTANCE; + + @Override + public String getHttpRequestMethod(HttpExchange exchange) { + return exchange.getRequestMethod(); + } + + @Override + public String getUrlScheme(HttpExchange exchange) { + return exchange instanceof HttpsExchange ? "https" : "http"; + } + + @Override + public String getUrlPath(HttpExchange exchange) { + String fullPath = exchange.getRequestURI().toString(); + int separatorPos = fullPath.indexOf('?'); + return separatorPos == -1 ? fullPath : fullPath.substring(0, separatorPos); + } + + @Nullable + @Override + public String getUrlQuery(HttpExchange exchange) { + String fullPath = exchange.getRequestURI().toString(); + int separatorPos = fullPath.indexOf('?'); + return separatorPos == -1 ? null : fullPath.substring(separatorPos + 1); + } + + @Override + public List getHttpRequestHeader(HttpExchange exchange, String name) { + return exchange.getRequestHeaders().getOrDefault(name, List.of()); + } + + @Nullable + @Override + public Integer getHttpResponseStatusCode( + HttpExchange exchange, @Nullable HttpExchange res, @Nullable Throwable error) { + int status = exchange.getResponseCode(); + if (status > 1) { + return status; + } + return null; + } + + @Override + public List getHttpResponseHeader(HttpExchange exchange, @Nullable HttpExchange res, String name) { + return exchange.getResponseHeaders().getOrDefault(name, List.of()); + } + + @Override + public String getHttpRoute(HttpExchange exchange) { + return exchange.getHttpContext().getPath(); + } + + @Override + public String getNetworkProtocolName(HttpExchange exchange, @Nullable HttpExchange res) { + return exchange instanceof HttpsExchange ? "https" : "http"; + } + + @Override + public String getNetworkProtocolVersion(HttpExchange exchange, @Nullable HttpExchange res) { + + return "1.1"; + } + + @Override + public InetSocketAddress getNetworkPeerInetSocketAddress( + HttpExchange exchange, @Nullable HttpExchange res) { + return exchange.getRemoteAddress(); + } + + @Override + public InetSocketAddress getNetworkLocalInetSocketAddress( + HttpExchange exchange, @Nullable HttpExchange res) { + return exchange.getLocalAddress(); + } +} diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderFactory.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderFactory.java new file mode 100644 index 000000000000..0aaa3a652a36 --- /dev/null +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderFactory.java @@ -0,0 +1,25 @@ +package io.opentelemetry.instrumentation.httpserver.internal; + +import com.sun.net.httpserver.HttpExchange; + +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; + +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +public final class JdkInstrumenterBuilderFactory { + private JdkInstrumenterBuilderFactory() {} + + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.java-http-server"; + + public static DefaultHttpServerInstrumenterBuilder getServerBuilder( + OpenTelemetry openTelemetry) { + return DefaultHttpServerInstrumenterBuilder.create( + INSTRUMENTATION_NAME, + openTelemetry, + JdkHttpServerAttributesGetter.INSTANCE, + ExchangeContextGetter.INSTANCE); + } +} diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderUtil.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderUtil.java new file mode 100644 index 000000000000..9803e6331bf5 --- /dev/null +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderUtil.java @@ -0,0 +1,40 @@ +package io.opentelemetry.instrumentation.httpserver.internal; + +import java.util.function.Function; + +import javax.annotation.Nullable; + +import com.sun.net.httpserver.HttpExchange; + +import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; +import io.opentelemetry.instrumentation.httpserver.JdkServerTelemetryBuilder; + +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +public class JdkInstrumenterBuilderUtil { + private JdkInstrumenterBuilderUtil() {} + + @Nullable + private static Function< + JdkServerTelemetryBuilder, + DefaultHttpServerInstrumenterBuilder> + serverBuilderExtractor; + + @Nullable + public static Function< + JdkServerTelemetryBuilder, + DefaultHttpServerInstrumenterBuilder> + getServerBuilderExtractor() { + return serverBuilderExtractor; + } + + public static void setServerBuilderExtractor( + Function< + JdkServerTelemetryBuilder, + DefaultHttpServerInstrumenterBuilder> + serverBuilderExtractor) { + JdkInstrumenterBuilderUtil.serverBuilderExtractor = serverBuilderExtractor; + } +} diff --git a/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java b/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java new file mode 100644 index 000000000000..312827cd0234 --- /dev/null +++ b/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java @@ -0,0 +1,36 @@ +package io.opentelemetry.instrumentation.httpserver; + +import java.util.Collections; + +import org.junit.jupiter.api.extension.RegisterExtension; + +import com.sun.net.httpserver.Filter; + +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; + +class JdkHttpServerTest extends AbstractJdkHttpServerTest { + + @RegisterExtension + static final InstrumentationExtension testing = HttpServerInstrumentationExtension.forLibrary(); + + @Override + protected Filter customFilter() { + return JdkServerTelemetry.builder(testing.getOpenTelemetry()) + .setCapturedRequestHeaders( + Collections.singletonList(AbstractHttpServerTest.TEST_REQUEST_HEADER)) + .setCapturedResponseHeaders( + Collections.singletonList(AbstractHttpServerTest.TEST_RESPONSE_HEADER)) + .build() + .otelFilter(); + } + + @Override + protected void configure(HttpServerTestOptions options) { + super.configure(options); + // library instrumentation does not create a span at all + options.disableTestNonStandardHttpMethod(); + } +} diff --git a/instrumentation/java-http-server/testing/build.gradle.kts b/instrumentation/java-http-server/testing/build.gradle.kts new file mode 100644 index 000000000000..66b9e3df0dc4 --- /dev/null +++ b/instrumentation/java-http-server/testing/build.gradle.kts @@ -0,0 +1,11 @@ +plugins { + id("otel.java-conventions") +} + +otelJava { + minJavaVersionSupported.set(JavaVersion.VERSION_17) +} + +dependencies { + api(project(":testing-common")) +} diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java new file mode 100644 index 000000000000..8bf781a2dd61 --- /dev/null +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java @@ -0,0 +1,216 @@ +package io.opentelemetry.instrumentation.httpserver; + +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.PATH_PARAM; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.net.InetSocketAddress; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import com.sun.net.httpserver.Filter; +import com.sun.net.httpserver.HttpContext; +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpServer; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; +import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; +import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; +import io.opentelemetry.testing.internal.armeria.common.QueryParams; + +public abstract class AbstractJdkHttpServerTest extends AbstractHttpServerTest { + + List contexts = new ArrayList<>(); + + protected abstract Filter customFilter(); + + void sendResponse(HttpExchange exchange, int status, String response) throws IOException { + sendResponse(exchange, status, Collections.emptyMap(), response); + } + + void sendResponse(HttpExchange exchange, int status, Map headers) + throws IOException { + sendResponse(exchange, status, headers, ""); + } + + void sendResponse(HttpExchange exchange, int status, Map headers, String response) + throws IOException { + + byte[] bytes = response.getBytes(Charset.defaultCharset()); + + // -1 means no content, 0 means unknown content length + var contentLength = bytes.length == 0 ? -1 : bytes.length; + exchange.getResponseHeaders().set("Content-Type", "text/plain"); + headers.forEach(exchange.getResponseHeaders()::set); + try (var os = exchange.getResponseBody()) { + exchange.sendResponseHeaders(status, contentLength); + os.write(bytes); + } + } + + public String getUrlQuery(HttpExchange exchange) { + String fullPath = exchange.getRequestURI().toString(); + int separatorPos = fullPath.indexOf('?'); + return separatorPos == -1 ? null : fullPath.substring(separatorPos + 1); + } + + @Override + protected HttpServer setupServer() throws IOException { + var server = HttpServer.create(new InetSocketAddress(port), 0); + + var context = + server.createContext( + SUCCESS.getPath(), + ctx -> + testing() + .runWithSpan( + "controller", + () -> sendResponse(ctx, SUCCESS.getStatus(), SUCCESS.getBody()))); + + contexts.add(context); + context = + server.createContext( + REDIRECT.getPath(), + ctx -> + testing() + .runWithSpan( + "controller", + () -> + sendResponse( + ctx, + REDIRECT.getStatus(), + Map.of("Location", REDIRECT.getBody())))); + + contexts.add(context); + context = + server.createContext( + ERROR.getPath(), + ctx -> + testing() + .runWithSpan( + "controller", () -> sendResponse(ctx, ERROR.getStatus(), ERROR.getBody()))); + + contexts.add(context); + context = + server.createContext( + EXCEPTION.getPath(), + ctx -> + testing() + .runWithSpan( + "controller", + () -> { + throw new IllegalStateException(EXCEPTION.getBody()); + })); + contexts.add(context); + context = + server.createContext( + "/query", + ctx -> + testing() + .runWithSpan( + "controller", + () -> + sendResponse( + ctx, + QUERY_PARAM.getStatus(), + "some=" + + QueryParams.fromQueryString(getUrlQuery(ctx)).get("some")))); + contexts.add(context); + context = + server.createContext( + "/path/:id/param", + ctx -> + testing() + .runWithSpan( + "controller", () -> sendResponse(ctx, PATH_PARAM.getStatus(), "id"))); + contexts.add(context); + context = + server.createContext( + "/child", + ctx -> + testing() + .runWithSpan( + "controller", + () -> { + INDEXED_CHILD.collectSpanAttributes( + name -> QueryParams.fromQueryString(getUrlQuery(ctx)).get(name)); + + sendResponse(ctx, INDEXED_CHILD.getStatus(), INDEXED_CHILD.getBody()); + })); + contexts.add(context); + context = + server.createContext( + "/captureHeaders", + ctx -> + testing() + .runWithSpan( + "controller", + () -> + sendResponse( + ctx, + CAPTURE_HEADERS.getStatus(), + Map.of( + "X-Test-Response", + ctx.getRequestHeaders().getFirst("X-Test-Request")), + CAPTURE_HEADERS.getBody()))); + + contexts.add(context); + + var customFilter = customFilter(); + contexts.forEach(ctx -> ctx.getFilters().add(customFilter)); + + // Make sure user decorators see spans. + + var spanFilter = + Filter.beforeHandler( + "filter", + ex -> { + if (!Span.current().getSpanContext().isValid()) { + // Return an invalid code to fail any assertion + try { + ex.sendResponseHeaders(601, -1); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + return; + } + ex.getResponseHeaders().set("decoratingfunction", "ok"); + ex.getResponseHeaders().set("decoratinghttpservicefunction", "ok"); + }); + contexts.forEach(ctx -> ctx.getFilters().add(spanFilter)); + server.start(); + + return server; + } + + @Override + protected void stopServer(HttpServer server) { + server.stop(1000); + } + + @Override + protected void configure(HttpServerTestOptions options) { + options.setExpectedHttpRoute( + (endpoint, method) -> { + if (endpoint == ServerEndpoint.NOT_FOUND) { + // TODO: Revisit this when applying instrumenters to more libraries, Armeria currently + // reports '/*' which is a fallback route. + return "/*"; + } + return expectedHttpRoute(endpoint, method); + }); + + options.setTestPathParam(false); + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 8de92d20c588..97ebdde655c7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -266,6 +266,8 @@ include(":instrumentation:internal:internal-url-class-loader:javaagent-integrati include(":instrumentation:java-http-client:javaagent") include(":instrumentation:java-http-client:library") include(":instrumentation:java-http-client:testing") +include(":instrumentation:java-http-server:library") +include(":instrumentation:java-http-server:testing") include(":instrumentation:java-util-logging:javaagent") include(":instrumentation:java-util-logging:shaded-stub-for-instrumenting") include(":instrumentation:javalin-5.0:javaagent") From 0c28cba8437a4d4dc23cc2659decbe5f0a69f319 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Thu, 6 Feb 2025 00:44:53 -0500 Subject: [PATCH 02/30] start --- .../instrumentation/httpserver/OpenTelemetryService.java | 2 +- .../instrumentation/httpserver/AbstractJdkHttpServerTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryService.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryService.java index f68132292360..6b9ea5cf9252 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryService.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryService.java @@ -33,7 +33,7 @@ public void doFilter(HttpExchange exchange, Chain chain) throws IOException { try (Scope ignored = context.makeCurrent()) { chain.doFilter(exchange); } finally { - instrumenter.end(context, exchange, exchange, null); + instrumenter.end(context, exchange, null, null); } } diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java index 8bf781a2dd61..aa5c2ad0e4cf 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java @@ -196,7 +196,7 @@ protected HttpServer setupServer() throws IOException { @Override protected void stopServer(HttpServer server) { - server.stop(1000); + server.stop(5000); } @Override @@ -211,6 +211,6 @@ protected void configure(HttpServerTestOptions options) { return expectedHttpRoute(endpoint, method); }); - options.setTestPathParam(false); + options.setTestPathParam(true); } } From 874c553163ca4164359ca8ca861166f43527f70a Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Thu, 6 Feb 2025 01:32:08 -0500 Subject: [PATCH 03/30] Update AbstractJdkHttpServerTest.java --- .../httpserver/AbstractJdkHttpServerTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java index aa5c2ad0e4cf..86125e3191d1 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java @@ -196,7 +196,7 @@ protected HttpServer setupServer() throws IOException { @Override protected void stopServer(HttpServer server) { - server.stop(5000); + server.stop(1000); } @Override @@ -211,6 +211,8 @@ protected void configure(HttpServerTestOptions options) { return expectedHttpRoute(endpoint, method); }); - options.setTestPathParam(true); + options.setTestNotFound(false); + options.setTestPathParam(false); + options.setTestException(false); } } From 8651b063fbbfdd2263731a79c205a793ee271bec Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Thu, 6 Feb 2025 21:21:26 -0500 Subject: [PATCH 04/30] agent --- .../javaagent/build.gradle.kts | 15 +++++ .../httpserver/JavaHttpResponseMutator.java | 18 ++++++ .../JdkHttpServerInstrumentationModule.java | 27 +++++++++ .../JdkServerContextInstrumentation.java | 42 +++++++++++++ .../httpserver/JdkSingletons.java | 37 ++++++++++++ .../httpserver/ResponseCustomizingFilter.java | 33 +++++++++++ .../httpserver/JdkHttpServerTest.java | 20 +++++++ .../java-http-server/library/build.gradle.kts | 4 -- .../internal/ExchangeContextGetter.java | 5 +- .../JdkHttpServerAttributesGetter.java | 5 +- .../java-http-server/testing/build.gradle.kts | 4 -- .../httpserver/AbstractJdkHttpServerTest.java | 59 +++++++++++-------- settings.gradle.kts | 1 + 13 files changed, 232 insertions(+), 38 deletions(-) create mode 100644 instrumentation/java-http-server/javaagent/build.gradle.kts create mode 100644 instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpResponseMutator.java create mode 100644 instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerInstrumentationModule.java create mode 100644 instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkServerContextInstrumentation.java create mode 100644 instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkSingletons.java create mode 100644 instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java create mode 100644 instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java diff --git a/instrumentation/java-http-server/javaagent/build.gradle.kts b/instrumentation/java-http-server/javaagent/build.gradle.kts new file mode 100644 index 000000000000..bbb842c59dad --- /dev/null +++ b/instrumentation/java-http-server/javaagent/build.gradle.kts @@ -0,0 +1,15 @@ +plugins { + id("otel.javaagent-instrumentation") +} + +muzzle { + pass { + coreJdk() + } +} + + +dependencies { + implementation(project(":instrumentation:java-http-server:library")) + testImplementation(project(":instrumentation:java-http-server:testing")) +} diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpResponseMutator.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpResponseMutator.java new file mode 100644 index 000000000000..608abc00064e --- /dev/null +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpResponseMutator.java @@ -0,0 +1,18 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.httpserver; + +import com.sun.net.httpserver.Headers; +import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseMutator; + +enum JavaHttpResponseMutator implements HttpServerResponseMutator { + INSTANCE; + + @Override + public void appendHeader(Headers response, String name, String value) { + response.add(name, value); + } +} diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerInstrumentationModule.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerInstrumentationModule.java new file mode 100644 index 000000000000..9add612fe1f9 --- /dev/null +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerInstrumentationModule.java @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.httpserver; + +import static java.util.Arrays.asList; + +import java.util.List; + +import com.google.auto.service.AutoService; + +import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; + +@AutoService(InstrumentationModule.class) +public class JdkHttpServerInstrumentationModule extends InstrumentationModule { + public JdkHttpServerInstrumentationModule() { + super("java-http-server"); + } + + @Override + public List typeInstrumentations() { + return asList(new JdkServerContextInstrumentation()); + } +} diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkServerContextInstrumentation.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkServerContextInstrumentation.java new file mode 100644 index 000000000000..b0037f94fa3b --- /dev/null +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkServerContextInstrumentation.java @@ -0,0 +1,42 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.httpserver; + +import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.isPublic; +import static net.bytebuddy.matcher.ElementMatchers.named; + +import com.sun.net.httpserver.HttpContext; +import com.sun.net.httpserver.HttpServer; + +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +public class JdkServerContextInstrumentation implements TypeInstrumentation { + + @Override + public ElementMatcher typeMatcher() { + return named(HttpServer.class.getName()); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + isMethod().and(isPublic()).and(named("createContext")), + this.getClass().getName() + "$BuildAdvice"); + } + + public static class BuildAdvice { + + @Advice.OnMethodExit + public static void onExit(@Advice.Return HttpContext ctx) { + ctx.getFilters().addAll(JdkSingletons.SERVER_DECORATOR); + } + } +} diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkSingletons.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkSingletons.java new file mode 100644 index 000000000000..c5d8cd39398b --- /dev/null +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkSingletons.java @@ -0,0 +1,37 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.httpserver; + +import java.util.Arrays; +import java.util.List; + +import com.sun.net.httpserver.Filter; + +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig; +import io.opentelemetry.instrumentation.httpserver.JdkServerTelemetry; +import io.opentelemetry.instrumentation.httpserver.JdkServerTelemetryBuilder; +import io.opentelemetry.instrumentation.httpserver.internal.JdkInstrumenterBuilderUtil; +import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; + +// Holds singleton references to decorators to match against during suppression. +// https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/903 +public final class JdkSingletons { + + public static final List SERVER_DECORATOR; + + static { + CommonConfig config = AgentCommonConfig.get(); + + JdkServerTelemetryBuilder serverBuilder = JdkServerTelemetry.builder(GlobalOpenTelemetry.get()); + JdkInstrumenterBuilderUtil.getServerBuilderExtractor().apply(serverBuilder).configure(config); + JdkServerTelemetry serverTelemetry = serverBuilder.build(); + + SERVER_DECORATOR = Arrays.asList(serverTelemetry.otelFilter(), new ResponseCustomizingFilter()); + } + + private JdkSingletons() {} +} diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java new file mode 100644 index 000000000000..4c1ea50524aa --- /dev/null +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java @@ -0,0 +1,33 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.httpserver; + +import java.io.IOException; + +import com.sun.net.httpserver.Filter; +import com.sun.net.httpserver.HttpExchange; + +import io.opentelemetry.context.Context; +import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseCustomizerHolder; + +class ResponseCustomizingFilter extends Filter { + + ResponseCustomizingFilter() {} + + @Override + public void doFilter(HttpExchange exchange, Chain chain) throws IOException { + + Context context = Context.current(); + HttpServerResponseCustomizerHolder.getCustomizer() + .customize(context, exchange.getResponseHeaders(), JavaHttpResponseMutator.INSTANCE); + chain.doFilter(exchange); + } + + @Override + public String description() { + return "ResponseCustomizingFilter"; + } +} diff --git a/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java b/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java new file mode 100644 index 000000000000..e84a19031a04 --- /dev/null +++ b/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java @@ -0,0 +1,20 @@ +package io.opentelemetry.javaagent.instrumentation.httpserver; + +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.httpserver.AbstractJdkHttpServerTest; +import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; + +class JdkHttpServerTest extends AbstractJdkHttpServerTest { + + @RegisterExtension + static final InstrumentationExtension testing = HttpServerInstrumentationExtension.forAgent(); + + @Override + protected void configure(HttpServerTestOptions options) { + super.configure(options); + options.setTestHttpPipelining(false); + } +} diff --git a/instrumentation/java-http-server/library/build.gradle.kts b/instrumentation/java-http-server/library/build.gradle.kts index 0d1531b62b9b..0bfcb32b601e 100644 --- a/instrumentation/java-http-server/library/build.gradle.kts +++ b/instrumentation/java-http-server/library/build.gradle.kts @@ -7,10 +7,6 @@ dependencies { testImplementation(project(":instrumentation:java-http-server:testing")) } -otelJava { - minJavaVersionSupported.set(JavaVersion.VERSION_17) -} - tasks { withType().configureEach { systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/ExchangeContextGetter.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/ExchangeContextGetter.java index 13a0d5fe4776..ed996e29c66b 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/ExchangeContextGetter.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/ExchangeContextGetter.java @@ -3,6 +3,7 @@ import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter; import java.util.Collections; import java.util.Iterator; +import java.util.List; import java.util.stream.Collectors; import javax.annotation.Nullable; @@ -25,7 +26,7 @@ public String get(@Nullable HttpExchange carrier, String key) { if (carrier == null) { return null; } - var list = carrier.getRequestHeaders().get(key); + List list = carrier.getRequestHeaders().get(key); return list != null ? list.get(0) : null; } @@ -35,7 +36,7 @@ public Iterator getAll(@Nullable HttpExchange carrier, String key) { if (carrier == null) { return Collections.emptyIterator(); } - var list = carrier.getRequestHeaders().get(key); + List list = carrier.getRequestHeaders().get(key); return list != null ? list.iterator() : Collections.emptyIterator(); } diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkHttpServerAttributesGetter.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkHttpServerAttributesGetter.java index d39943914757..056fa9fbf935 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkHttpServerAttributesGetter.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkHttpServerAttributesGetter.java @@ -1,6 +1,7 @@ package io.opentelemetry.instrumentation.httpserver.internal; import java.net.InetSocketAddress; +import java.util.Collections; import java.util.List; import com.sun.net.httpserver.HttpExchange; @@ -40,7 +41,7 @@ public String getUrlQuery(HttpExchange exchange) { @Override public List getHttpRequestHeader(HttpExchange exchange, String name) { - return exchange.getRequestHeaders().getOrDefault(name, List.of()); + return exchange.getRequestHeaders().getOrDefault(name, Collections.emptyList()); } @Nullable @@ -56,7 +57,7 @@ public Integer getHttpResponseStatusCode( @Override public List getHttpResponseHeader(HttpExchange exchange, @Nullable HttpExchange res, String name) { - return exchange.getResponseHeaders().getOrDefault(name, List.of()); + return exchange.getResponseHeaders().getOrDefault(name, Collections.emptyList()); } @Override diff --git a/instrumentation/java-http-server/testing/build.gradle.kts b/instrumentation/java-http-server/testing/build.gradle.kts index 66b9e3df0dc4..484e04028aaa 100644 --- a/instrumentation/java-http-server/testing/build.gradle.kts +++ b/instrumentation/java-http-server/testing/build.gradle.kts @@ -2,10 +2,6 @@ plugins { id("otel.java-conventions") } -otelJava { - minJavaVersionSupported.set(JavaVersion.VERSION_17) -} - dependencies { api(project(":testing-common")) } diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java index 86125e3191d1..d6d100cf7073 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java @@ -10,7 +10,7 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; import java.io.IOException; -import java.io.UncheckedIOException; +import java.io.OutputStream; import java.net.InetSocketAddress; import java.nio.charset.Charset; import java.util.ArrayList; @@ -33,7 +33,9 @@ public abstract class AbstractJdkHttpServerTest extends AbstractHttpServerTest contexts = new ArrayList<>(); - protected abstract Filter customFilter(); + protected Filter customFilter() { + return null; + } void sendResponse(HttpExchange exchange, int status, String response) throws IOException { sendResponse(exchange, status, Collections.emptyMap(), response); @@ -50,10 +52,10 @@ void sendResponse(HttpExchange exchange, int status, Map headers byte[] bytes = response.getBytes(Charset.defaultCharset()); // -1 means no content, 0 means unknown content length - var contentLength = bytes.length == 0 ? -1 : bytes.length; + long contentLength = bytes.length == 0 ? -1 : bytes.length; exchange.getResponseHeaders().set("Content-Type", "text/plain"); headers.forEach(exchange.getResponseHeaders()::set); - try (var os = exchange.getResponseBody()) { + try (OutputStream os = exchange.getResponseBody()) { exchange.sendResponseHeaders(status, contentLength); os.write(bytes); } @@ -67,9 +69,9 @@ public String getUrlQuery(HttpExchange exchange) { @Override protected HttpServer setupServer() throws IOException { - var server = HttpServer.create(new InetSocketAddress(port), 0); + HttpServer server = HttpServer.create(new InetSocketAddress(port), 0); - var context = + HttpContext context = server.createContext( SUCCESS.getPath(), ctx -> @@ -90,7 +92,7 @@ protected HttpServer setupServer() throws IOException { sendResponse( ctx, REDIRECT.getStatus(), - Map.of("Location", REDIRECT.getBody())))); + Collections.singletonMap("Location", REDIRECT.getBody())))); contexts.add(context); context = @@ -160,34 +162,39 @@ protected HttpServer setupServer() throws IOException { sendResponse( ctx, CAPTURE_HEADERS.getStatus(), - Map.of( + Collections.singletonMap( "X-Test-Response", ctx.getRequestHeaders().getFirst("X-Test-Request")), CAPTURE_HEADERS.getBody()))); contexts.add(context); - var customFilter = customFilter(); - contexts.forEach(ctx -> ctx.getFilters().add(customFilter)); + Filter customFilter = customFilter(); + if (customFilter != null) { + contexts.forEach(ctx -> ctx.getFilters().add(customFilter)); + } // Make sure user decorators see spans. + Filter spanFilter = + new Filter() { + + @Override + public void doFilter(HttpExchange exchange, Chain chain) throws IOException { + + if (!Span.current().getSpanContext().isValid()) { + // Return an invalid code to fail any assertion - var spanFilter = - Filter.beforeHandler( - "filter", - ex -> { - if (!Span.current().getSpanContext().isValid()) { - // Return an invalid code to fail any assertion - try { - ex.sendResponseHeaders(601, -1); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - return; - } - ex.getResponseHeaders().set("decoratingfunction", "ok"); - ex.getResponseHeaders().set("decoratinghttpservicefunction", "ok"); - }); + exchange.sendResponseHeaders(601, -1); + } + exchange.getResponseHeaders().set("decoratingfunction", "ok"); + exchange.getResponseHeaders().set("decoratinghttpservicefunction", "ok"); + } + + @Override + public String description() { + return "test"; + } + }; contexts.forEach(ctx -> ctx.getFilters().add(spanFilter)); server.start(); diff --git a/settings.gradle.kts b/settings.gradle.kts index 97ebdde655c7..c87d57b231a5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -266,6 +266,7 @@ include(":instrumentation:internal:internal-url-class-loader:javaagent-integrati include(":instrumentation:java-http-client:javaagent") include(":instrumentation:java-http-client:library") include(":instrumentation:java-http-client:testing") +include(":instrumentation:java-http-server:javaagent") include(":instrumentation:java-http-server:library") include(":instrumentation:java-http-server:testing") include(":instrumentation:java-util-logging:javaagent") From d0d35ebedb41533b3ad0899def014a2daadbe84f Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Thu, 6 Feb 2025 22:37:16 -0500 Subject: [PATCH 05/30] spotless --- .../java-http-server/javaagent/build.gradle.kts | 1 - .../JdkHttpServerInstrumentationModule.java | 4 +--- .../JdkServerContextInstrumentation.java | 1 - .../httpserver/JdkSingletons.java | 6 ++---- .../httpserver/ResponseCustomizingFilter.java | 4 +--- .../httpserver/JdkHttpServerTest.java | 12 ++++++++---- .../httpserver/JdkServerTelemetry.java | 6 +++++- .../httpserver/JdkServerTelemetryBuilder.java | 17 +++++++++-------- .../httpserver/OpenTelemetryService.java | 9 ++++++--- .../internal/ExchangeContextGetter.java | 8 ++++++-- .../internal/JdkHttpServerAttributesGetter.java | 16 ++++++++++------ .../internal/JdkInstrumenterBuilderFactory.java | 6 +++++- .../internal/JdkInstrumenterBuilderUtil.java | 12 +++++++----- .../httpserver/JdkHttpServerTest.java | 12 +++++++----- 14 files changed, 67 insertions(+), 47 deletions(-) diff --git a/instrumentation/java-http-server/javaagent/build.gradle.kts b/instrumentation/java-http-server/javaagent/build.gradle.kts index bbb842c59dad..1c8be721a562 100644 --- a/instrumentation/java-http-server/javaagent/build.gradle.kts +++ b/instrumentation/java-http-server/javaagent/build.gradle.kts @@ -8,7 +8,6 @@ muzzle { } } - dependencies { implementation(project(":instrumentation:java-http-server:library")) testImplementation(project(":instrumentation:java-http-server:testing")) diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerInstrumentationModule.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerInstrumentationModule.java index 9add612fe1f9..aafb5faa8565 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerInstrumentationModule.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerInstrumentationModule.java @@ -7,12 +7,10 @@ import static java.util.Arrays.asList; -import java.util.List; - import com.google.auto.service.AutoService; - import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import java.util.List; @AutoService(InstrumentationModule.class) public class JdkHttpServerInstrumentationModule extends InstrumentationModule { diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkServerContextInstrumentation.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkServerContextInstrumentation.java index b0037f94fa3b..469f32c5fc42 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkServerContextInstrumentation.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkServerContextInstrumentation.java @@ -11,7 +11,6 @@ import com.sun.net.httpserver.HttpContext; import com.sun.net.httpserver.HttpServer; - import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkSingletons.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkSingletons.java index c5d8cd39398b..72a049a47883 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkSingletons.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkSingletons.java @@ -5,17 +5,15 @@ package io.opentelemetry.javaagent.instrumentation.httpserver; -import java.util.Arrays; -import java.util.List; - import com.sun.net.httpserver.Filter; - import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig; import io.opentelemetry.instrumentation.httpserver.JdkServerTelemetry; import io.opentelemetry.instrumentation.httpserver.JdkServerTelemetryBuilder; import io.opentelemetry.instrumentation.httpserver.internal.JdkInstrumenterBuilderUtil; import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import java.util.Arrays; +import java.util.List; // Holds singleton references to decorators to match against during suppression. // https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/903 diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java index 4c1ea50524aa..8e7c30befaf7 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java @@ -5,13 +5,11 @@ package io.opentelemetry.javaagent.instrumentation.httpserver; -import java.io.IOException; - import com.sun.net.httpserver.Filter; import com.sun.net.httpserver.HttpExchange; - import io.opentelemetry.context.Context; import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseCustomizerHolder; +import java.io.IOException; class ResponseCustomizingFilter extends Filter { diff --git a/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java b/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java index e84a19031a04..ae7fcf360e71 100644 --- a/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java +++ b/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java @@ -1,11 +1,15 @@ -package io.opentelemetry.javaagent.instrumentation.httpserver; +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ -import org.junit.jupiter.api.extension.RegisterExtension; +package io.opentelemetry.javaagent.instrumentation.httpserver; -import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.httpserver.AbstractJdkHttpServerTest; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; +import org.junit.jupiter.api.extension.RegisterExtension; class JdkHttpServerTest extends AbstractJdkHttpServerTest { @@ -15,6 +19,6 @@ class JdkHttpServerTest extends AbstractJdkHttpServerTest { @Override protected void configure(HttpServerTestOptions options) { super.configure(options); - options.setTestHttpPipelining(false); + options.setTestHttpPipelining(false); } } diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetry.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetry.java index d168bf0ee835..a6dc701c4bc2 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetry.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetry.java @@ -1,8 +1,12 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.instrumentation.httpserver; import com.sun.net.httpserver.Filter; import com.sun.net.httpserver.HttpExchange; - import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetryBuilder.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetryBuilder.java index 70f043d74ad4..ac5a4c3ccc55 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetryBuilder.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetryBuilder.java @@ -1,11 +1,12 @@ -package io.opentelemetry.instrumentation.httpserver; +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ -import java.util.Collection; -import java.util.function.Function; +package io.opentelemetry.instrumentation.httpserver; import com.google.errorprone.annotations.CanIgnoreReturnValue; import com.sun.net.httpserver.HttpExchange; - import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; @@ -14,6 +15,8 @@ import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder; import io.opentelemetry.instrumentation.httpserver.internal.JdkInstrumenterBuilderFactory; import io.opentelemetry.instrumentation.httpserver.internal.JdkInstrumenterBuilderUtil; +import java.util.Collection; +import java.util.function.Function; public final class JdkServerTelemetryBuilder { @@ -55,8 +58,7 @@ public JdkServerTelemetryBuilder addAttributesExtractor( * @param requestHeaders A list of HTTP header names. */ @CanIgnoreReturnValue - public JdkServerTelemetryBuilder setCapturedRequestHeaders( - Collection requestHeaders) { + public JdkServerTelemetryBuilder setCapturedRequestHeaders(Collection requestHeaders) { builder.setCapturedRequestHeaders(requestHeaders); return this; } @@ -67,8 +69,7 @@ public JdkServerTelemetryBuilder setCapturedRequestHeaders( * @param responseHeaders A list of HTTP header names. */ @CanIgnoreReturnValue - public JdkServerTelemetryBuilder setCapturedResponseHeaders( - Collection responseHeaders) { + public JdkServerTelemetryBuilder setCapturedResponseHeaders(Collection responseHeaders) { builder.setCapturedResponseHeaders(responseHeaders); return this; } diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryService.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryService.java index 6b9ea5cf9252..18c7b7644ee1 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryService.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryService.java @@ -1,13 +1,16 @@ -package io.opentelemetry.instrumentation.httpserver; +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ -import java.io.IOException; +package io.opentelemetry.instrumentation.httpserver; import com.sun.net.httpserver.Filter; import com.sun.net.httpserver.HttpExchange; - import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import java.io.IOException; /** Decorates an {@link HttpServer} to trace inbound {@link HttpExchange}s. */ final class OpenTelemetryService extends Filter { diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/ExchangeContextGetter.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/ExchangeContextGetter.java index ed996e29c66b..c332754d60f0 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/ExchangeContextGetter.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/ExchangeContextGetter.java @@ -1,5 +1,11 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.instrumentation.httpserver.internal; +import com.sun.net.httpserver.HttpExchange; import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter; import java.util.Collections; import java.util.Iterator; @@ -7,8 +13,6 @@ import java.util.stream.Collectors; import javax.annotation.Nullable; -import com.sun.net.httpserver.HttpExchange; - enum ExchangeContextGetter implements ExtendedTextMapGetter { INSTANCE; diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkHttpServerAttributesGetter.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkHttpServerAttributesGetter.java index 056fa9fbf935..b332130b8f0d 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkHttpServerAttributesGetter.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkHttpServerAttributesGetter.java @@ -1,13 +1,16 @@ -package io.opentelemetry.instrumentation.httpserver.internal; +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ -import java.net.InetSocketAddress; -import java.util.Collections; -import java.util.List; +package io.opentelemetry.instrumentation.httpserver.internal; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpsExchange; - import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesGetter; +import java.net.InetSocketAddress; +import java.util.Collections; +import java.util.List; import javax.annotation.Nullable; enum JdkHttpServerAttributesGetter @@ -56,7 +59,8 @@ public Integer getHttpResponseStatusCode( } @Override - public List getHttpResponseHeader(HttpExchange exchange, @Nullable HttpExchange res, String name) { + public List getHttpResponseHeader( + HttpExchange exchange, @Nullable HttpExchange res, String name) { return exchange.getResponseHeaders().getOrDefault(name, Collections.emptyList()); } diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderFactory.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderFactory.java index 0aaa3a652a36..b7cb85253ce6 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderFactory.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderFactory.java @@ -1,7 +1,11 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.instrumentation.httpserver.internal; import com.sun.net.httpserver.HttpExchange; - import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderUtil.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderUtil.java index 9803e6331bf5..021467ac7bc4 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderUtil.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderUtil.java @@ -1,13 +1,15 @@ -package io.opentelemetry.instrumentation.httpserver.internal; - -import java.util.function.Function; +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ -import javax.annotation.Nullable; +package io.opentelemetry.instrumentation.httpserver.internal; import com.sun.net.httpserver.HttpExchange; - import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; import io.opentelemetry.instrumentation.httpserver.JdkServerTelemetryBuilder; +import java.util.function.Function; +import javax.annotation.Nullable; /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at diff --git a/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java b/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java index 312827cd0234..d0590c082d29 100644 --- a/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java +++ b/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java @@ -1,15 +1,17 @@ -package io.opentelemetry.instrumentation.httpserver; - -import java.util.Collections; +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ -import org.junit.jupiter.api.extension.RegisterExtension; +package io.opentelemetry.instrumentation.httpserver; import com.sun.net.httpserver.Filter; - 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 java.util.Collections; +import org.junit.jupiter.api.extension.RegisterExtension; class JdkHttpServerTest extends AbstractJdkHttpServerTest { From 60c33828accc8965ccacedbc973ed5879da50509 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Thu, 6 Feb 2025 22:45:10 -0500 Subject: [PATCH 06/30] Update AbstractJdkHttpServerTest.java --- .../httpserver/AbstractJdkHttpServerTest.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java index d6d100cf7073..c669d966ac7e 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java @@ -1,3 +1,8 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.instrumentation.httpserver; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS; @@ -9,25 +14,23 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; -import java.io.IOException; -import java.io.OutputStream; -import java.net.InetSocketAddress; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - import com.sun.net.httpserver.Filter; import com.sun.net.httpserver.HttpContext; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpServer; - import io.opentelemetry.api.trace.Span; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.testing.internal.armeria.common.QueryParams; +import java.io.IOException; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; public abstract class AbstractJdkHttpServerTest extends AbstractHttpServerTest { From cd1e12126972b34a6acc1ba85dcfb2a485d87ea9 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Thu, 6 Feb 2025 23:38:37 -0500 Subject: [PATCH 07/30] Update AbstractJdkHttpServerTest.java --- .../instrumentation/httpserver/AbstractJdkHttpServerTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java index c669d966ac7e..6806d1c4b861 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java @@ -191,6 +191,7 @@ public void doFilter(HttpExchange exchange, Chain chain) throws IOException { } exchange.getResponseHeaders().set("decoratingfunction", "ok"); exchange.getResponseHeaders().set("decoratinghttpservicefunction", "ok"); + chain.doFilter(exchange); } @Override From 2f199610ee89803d57a372da0a766677c6b826d9 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Thu, 6 Feb 2025 23:49:07 -0500 Subject: [PATCH 08/30] span filter --- .../httpserver/AbstractJdkHttpServerTest.java | 54 +++++++++++-------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java index 6806d1c4b861..87c7dbcc75b7 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java @@ -40,16 +40,17 @@ protected Filter customFilter() { return null; } - void sendResponse(HttpExchange exchange, int status, String response) throws IOException { + static void sendResponse(HttpExchange exchange, int status, String response) throws IOException { sendResponse(exchange, status, Collections.emptyMap(), response); } - void sendResponse(HttpExchange exchange, int status, Map headers) + static void sendResponse(HttpExchange exchange, int status, Map headers) throws IOException { sendResponse(exchange, status, headers, ""); } - void sendResponse(HttpExchange exchange, int status, Map headers, String response) + static void sendResponse( + HttpExchange exchange, int status, Map headers, String response) throws IOException { byte[] bytes = response.getBytes(Charset.defaultCharset()); @@ -178,27 +179,8 @@ protected HttpServer setupServer() throws IOException { } // Make sure user decorators see spans. - Filter spanFilter = - new Filter() { + Filter spanFilter = new SpanFilter(); - @Override - public void doFilter(HttpExchange exchange, Chain chain) throws IOException { - - if (!Span.current().getSpanContext().isValid()) { - // Return an invalid code to fail any assertion - - exchange.sendResponseHeaders(601, -1); - } - exchange.getResponseHeaders().set("decoratingfunction", "ok"); - exchange.getResponseHeaders().set("decoratinghttpservicefunction", "ok"); - chain.doFilter(exchange); - } - - @Override - public String description() { - return "test"; - } - }; contexts.forEach(ctx -> ctx.getFilters().add(spanFilter)); server.start(); @@ -226,4 +208,30 @@ protected void configure(HttpServerTestOptions options) { options.setTestPathParam(false); options.setTestException(false); } + + static class SpanFilter extends Filter { + + @Override + public void doFilter(HttpExchange exchange, Chain chain) throws IOException { + + if (!Span.current().getSpanContext().isValid()) { + // Return an invalid code to fail any assertion + + exchange.sendResponseHeaders(601, -1); + } + exchange.getResponseHeaders().set("decoratingfunction", "ok"); + exchange.getResponseHeaders().set("decoratinghttpservicefunction", "ok"); + chain.doFilter(exchange); + + // server will hang if nothing is sent + if (exchange.getResponseCode() == -1) { + sendResponse(exchange, 500, "nothing"); + } + } + + @Override + public String description() { + return "test"; + } + } } From e386c061586f2c1d746bd19cd3f1c7897342ea03 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 7 Feb 2025 00:01:40 -0500 Subject: [PATCH 09/30] Update AbstractJdkHttpServerTest.java --- .../httpserver/AbstractJdkHttpServerTest.java | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java index 87c7dbcc75b7..791351bf17f1 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java @@ -7,7 +7,6 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.PATH_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; @@ -108,17 +107,6 @@ protected HttpServer setupServer() throws IOException { "controller", () -> sendResponse(ctx, ERROR.getStatus(), ERROR.getBody()))); contexts.add(context); - context = - server.createContext( - EXCEPTION.getPath(), - ctx -> - testing() - .runWithSpan( - "controller", - () -> { - throw new IllegalStateException(EXCEPTION.getBody()); - })); - contexts.add(context); context = server.createContext( "/query", @@ -221,10 +209,15 @@ public void doFilter(HttpExchange exchange, Chain chain) throws IOException { } exchange.getResponseHeaders().set("decoratingfunction", "ok"); exchange.getResponseHeaders().set("decoratinghttpservicefunction", "ok"); - chain.doFilter(exchange); - // server will hang if nothing is sent + try { + chain.doFilter(exchange); + } catch (Exception e) { + sendResponse(exchange, 500, e.getMessage()); + } + if (exchange.getResponseCode() == -1) { + sendResponse(exchange, 500, "nothing"); } } From 1433ddc6f5701e51d53104f78378f705fe20754d Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 7 Feb 2025 00:06:08 -0500 Subject: [PATCH 10/30] Update AbstractJdkHttpServerTest.java --- .../httpserver/AbstractJdkHttpServerTest.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java index 791351bf17f1..454037e48446 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java @@ -182,16 +182,6 @@ protected void stopServer(HttpServer server) { @Override protected void configure(HttpServerTestOptions options) { - options.setExpectedHttpRoute( - (endpoint, method) -> { - if (endpoint == ServerEndpoint.NOT_FOUND) { - // TODO: Revisit this when applying instrumenters to more libraries, Armeria currently - // reports '/*' which is a fallback route. - return "/*"; - } - return expectedHttpRoute(endpoint, method); - }); - options.setTestNotFound(false); options.setTestPathParam(false); options.setTestException(false); From 60b29fb7ad55473f142de5e56b1671560ddb34cd Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 7 Feb 2025 00:14:51 -0500 Subject: [PATCH 11/30] Update AbstractJdkHttpServerTest.java --- .../instrumentation/httpserver/AbstractJdkHttpServerTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java index 454037e48446..c219557604d5 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java @@ -20,7 +20,6 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; -import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.testing.internal.armeria.common.QueryParams; import java.io.IOException; import java.io.OutputStream; From 959b667d22198871595fe49e00b5764ab29a5b57 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 7 Feb 2025 11:04:24 -0500 Subject: [PATCH 12/30] address comments --- ... JavaHttpServerInstrumentationModule.java} | 9 +++-- ... => JavaServerContextInstrumentation.java} | 11 +++--- .../httpserver/JavaSingletons.java | 36 +++++++++++++++++++ .../httpserver/JdkSingletons.java | 35 ------------------ .../httpserver/JdkHttpServerTest.java | 3 +- ...elemetry.java => JavaServerTelemetry.java} | 16 ++++----- ...r.java => JavaServerTelemetryBuilder.java} | 28 +++++++-------- ...yService.java => OpenTelemetryFilter.java} | 11 +++--- ...va => JavaHttpServerAttributesGetter.java} | 15 ++++---- ...va => JavaInstrumenterBuilderFactory.java} | 6 ++-- ....java => JavaInstrumenterBuilderUtil.java} | 14 ++++---- .../httpserver/JdkHttpServerTest.java | 2 +- .../httpserver/AbstractJdkHttpServerTest.java | 13 ++++--- .../ignore/GlobalIgnoredTypesConfigurer.java | 3 +- 14 files changed, 102 insertions(+), 100 deletions(-) rename instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/{JdkHttpServerInstrumentationModule.java => JavaHttpServerInstrumentationModule.java} (69%) rename instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/{JdkServerContextInstrumentation.java => JavaServerContextInstrumentation.java} (72%) create mode 100644 instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaSingletons.java delete mode 100644 instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkSingletons.java rename instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/{JdkServerTelemetry.java => JavaServerTelemetry.java} (52%) rename instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/{JdkServerTelemetryBuilder.java => JavaServerTelemetryBuilder.java} (76%) rename instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/{OpenTelemetryService.java => OpenTelemetryFilter.java} (80%) rename instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/{JdkHttpServerAttributesGetter.java => JavaHttpServerAttributesGetter.java} (82%) rename instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/{JdkInstrumenterBuilderFactory.java => JavaInstrumenterBuilderFactory.java} (85%) rename instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/{JdkInstrumenterBuilderUtil.java => JavaInstrumenterBuilderUtil.java} (73%) diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerInstrumentationModule.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerInstrumentationModule.java similarity index 69% rename from instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerInstrumentationModule.java rename to instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerInstrumentationModule.java index aafb5faa8565..7d3f7dd36def 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerInstrumentationModule.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerInstrumentationModule.java @@ -5,21 +5,20 @@ package io.opentelemetry.javaagent.instrumentation.httpserver; -import static java.util.Arrays.asList; - import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import java.util.Collections; import java.util.List; @AutoService(InstrumentationModule.class) -public class JdkHttpServerInstrumentationModule extends InstrumentationModule { - public JdkHttpServerInstrumentationModule() { +public class JavaHttpServerInstrumentationModule extends InstrumentationModule { + public JavaHttpServerInstrumentationModule() { super("java-http-server"); } @Override public List typeInstrumentations() { - return asList(new JdkServerContextInstrumentation()); + return Collections.singletonList(new JavaServerContextInstrumentation()); } } diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkServerContextInstrumentation.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaServerContextInstrumentation.java similarity index 72% rename from instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkServerContextInstrumentation.java rename to instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaServerContextInstrumentation.java index 469f32c5fc42..4689407894f9 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkServerContextInstrumentation.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaServerContextInstrumentation.java @@ -5,37 +5,38 @@ package io.opentelemetry.javaagent.instrumentation.httpserver; +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.extendsClass; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import com.sun.net.httpserver.HttpContext; -import com.sun.net.httpserver.HttpServer; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -public class JdkServerContextInstrumentation implements TypeInstrumentation { +public class JavaServerContextInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { - return named(HttpServer.class.getName()); + return extendsClass(named("com.sun.net.httpserver.HttpServer")); } @Override public void transform(TypeTransformer transformer) { transformer.applyAdviceToMethod( isMethod().and(isPublic()).and(named("createContext")), - this.getClass().getName() + "$BuildAdvice"); + JavaServerContextInstrumentation.class.getName() + "$BuildAdvice"); } + @SuppressWarnings("unused") public static class BuildAdvice { @Advice.OnMethodExit public static void onExit(@Advice.Return HttpContext ctx) { - ctx.getFilters().addAll(JdkSingletons.SERVER_DECORATOR); + ctx.getFilters().addAll(JavaSingletons.FILTERS); } } } diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaSingletons.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaSingletons.java new file mode 100644 index 000000000000..4c2acd1e0621 --- /dev/null +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaSingletons.java @@ -0,0 +1,36 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.httpserver; + +import com.sun.net.httpserver.Filter; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig; +import io.opentelemetry.instrumentation.httpserver.JavaServerTelemetry; +import io.opentelemetry.instrumentation.httpserver.JavaServerTelemetryBuilder; +import io.opentelemetry.instrumentation.httpserver.internal.JavaInstrumenterBuilderUtil; +import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import java.util.Arrays; +import java.util.List; + +// Holds singleton references to decorators to match against during suppression. +// https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/903 +public final class JavaSingletons { + + public static final List FILTERS; + + static { + CommonConfig config = AgentCommonConfig.get(); + + JavaServerTelemetryBuilder serverBuilder = + JavaServerTelemetry.builder(GlobalOpenTelemetry.get()); + JavaInstrumenterBuilderUtil.getServerBuilderExtractor().apply(serverBuilder).configure(config); + JavaServerTelemetry serverTelemetry = serverBuilder.build(); + + FILTERS = Arrays.asList(serverTelemetry.otelFilter(), new ResponseCustomizingFilter()); + } + + private JavaSingletons() {} +} diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkSingletons.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkSingletons.java deleted file mode 100644 index 72a049a47883..000000000000 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkSingletons.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.httpserver; - -import com.sun.net.httpserver.Filter; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig; -import io.opentelemetry.instrumentation.httpserver.JdkServerTelemetry; -import io.opentelemetry.instrumentation.httpserver.JdkServerTelemetryBuilder; -import io.opentelemetry.instrumentation.httpserver.internal.JdkInstrumenterBuilderUtil; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import java.util.Arrays; -import java.util.List; - -// Holds singleton references to decorators to match against during suppression. -// https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/903 -public final class JdkSingletons { - - public static final List SERVER_DECORATOR; - - static { - CommonConfig config = AgentCommonConfig.get(); - - JdkServerTelemetryBuilder serverBuilder = JdkServerTelemetry.builder(GlobalOpenTelemetry.get()); - JdkInstrumenterBuilderUtil.getServerBuilderExtractor().apply(serverBuilder).configure(config); - JdkServerTelemetry serverTelemetry = serverBuilder.build(); - - SERVER_DECORATOR = Arrays.asList(serverTelemetry.otelFilter(), new ResponseCustomizingFilter()); - } - - private JdkSingletons() {} -} diff --git a/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java b/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java index ae7fcf360e71..04cd92efb38e 100644 --- a/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java +++ b/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java @@ -19,6 +19,7 @@ class JdkHttpServerTest extends AbstractJdkHttpServerTest { @Override protected void configure(HttpServerTestOptions options) { super.configure(options); - options.setTestHttpPipelining(false); + // library instrumentation does not create a span at all + options.disableTestNonStandardHttpMethod(); } } diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetry.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaServerTelemetry.java similarity index 52% rename from instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetry.java rename to instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaServerTelemetry.java index a6dc701c4bc2..0824fe52c919 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetry.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaServerTelemetry.java @@ -10,26 +10,26 @@ import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -/** Entrypoint for instrumenting Armeria services. */ -public final class JdkServerTelemetry { +/** Entrypoint for instrumenting the jdk.httpserver services. */ +public final class JavaServerTelemetry { - /** Returns a new {@link JdkServerTelemetry} configured with the given {@link OpenTelemetry}. */ - public static JdkServerTelemetry create(OpenTelemetry openTelemetry) { + /** Returns a new {@link JavaServerTelemetry} configured with the given {@link OpenTelemetry}. */ + public static JavaServerTelemetry create(OpenTelemetry openTelemetry) { return builder(openTelemetry).build(); } - public static JdkServerTelemetryBuilder builder(OpenTelemetry openTelemetry) { - return new JdkServerTelemetryBuilder(openTelemetry); + public static JavaServerTelemetryBuilder builder(OpenTelemetry openTelemetry) { + return new JavaServerTelemetryBuilder(openTelemetry); } private final Instrumenter instrumenter; - JdkServerTelemetry(Instrumenter instrumenter) { + JavaServerTelemetry(Instrumenter instrumenter) { this.instrumenter = instrumenter; } /** Returns a new {@link Filter} for telemetry usage */ public Filter otelFilter() { - return new OpenTelemetryService(instrumenter); + return new OpenTelemetryFilter(instrumenter); } } diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetryBuilder.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaServerTelemetryBuilder.java similarity index 76% rename from instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetryBuilder.java rename to instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaServerTelemetryBuilder.java index ac5a4c3ccc55..525ae8c61d6e 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JdkServerTelemetryBuilder.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaServerTelemetryBuilder.java @@ -13,26 +13,26 @@ import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder; -import io.opentelemetry.instrumentation.httpserver.internal.JdkInstrumenterBuilderFactory; -import io.opentelemetry.instrumentation.httpserver.internal.JdkInstrumenterBuilderUtil; +import io.opentelemetry.instrumentation.httpserver.internal.JavaInstrumenterBuilderFactory; +import io.opentelemetry.instrumentation.httpserver.internal.JavaInstrumenterBuilderUtil; import java.util.Collection; import java.util.function.Function; -public final class JdkServerTelemetryBuilder { +public final class JavaServerTelemetryBuilder { private final DefaultHttpServerInstrumenterBuilder builder; static { - JdkInstrumenterBuilderUtil.setServerBuilderExtractor(builder -> builder.builder); + JavaInstrumenterBuilderUtil.setServerBuilderExtractor(builder -> builder.builder); } - JdkServerTelemetryBuilder(OpenTelemetry openTelemetry) { - builder = JdkInstrumenterBuilderFactory.getServerBuilder(openTelemetry); + JavaServerTelemetryBuilder(OpenTelemetry openTelemetry) { + builder = JavaInstrumenterBuilderFactory.getServerBuilder(openTelemetry); } /** Sets the status extractor for server spans. */ @CanIgnoreReturnValue - public JdkServerTelemetryBuilder setStatusExtractor( + public JavaServerTelemetryBuilder setStatusExtractor( Function< SpanStatusExtractor, ? extends SpanStatusExtractor> @@ -46,7 +46,7 @@ public JdkServerTelemetryBuilder setStatusExtractor( * The {@link AttributesExtractor} will be executed after all default extractors. */ @CanIgnoreReturnValue - public JdkServerTelemetryBuilder addAttributesExtractor( + public JavaServerTelemetryBuilder addAttributesExtractor( AttributesExtractor attributesExtractor) { builder.addAttributesExtractor(attributesExtractor); return this; @@ -58,7 +58,7 @@ public JdkServerTelemetryBuilder addAttributesExtractor( * @param requestHeaders A list of HTTP header names. */ @CanIgnoreReturnValue - public JdkServerTelemetryBuilder setCapturedRequestHeaders(Collection requestHeaders) { + public JavaServerTelemetryBuilder setCapturedRequestHeaders(Collection requestHeaders) { builder.setCapturedRequestHeaders(requestHeaders); return this; } @@ -69,7 +69,7 @@ public JdkServerTelemetryBuilder setCapturedRequestHeaders(Collection re * @param responseHeaders A list of HTTP header names. */ @CanIgnoreReturnValue - public JdkServerTelemetryBuilder setCapturedResponseHeaders(Collection responseHeaders) { + public JavaServerTelemetryBuilder setCapturedResponseHeaders(Collection responseHeaders) { builder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -88,14 +88,14 @@ public JdkServerTelemetryBuilder setCapturedResponseHeaders(Collection r * @see HttpServerAttributesExtractorBuilder#setKnownMethods(Collection) */ @CanIgnoreReturnValue - public JdkServerTelemetryBuilder setKnownMethods(Collection knownMethods) { + public JavaServerTelemetryBuilder setKnownMethods(Collection knownMethods) { builder.setKnownMethods(knownMethods); return this; } /** Sets custom server {@link SpanNameExtractor} via transform function. */ @CanIgnoreReturnValue - public JdkServerTelemetryBuilder setSpanNameExtractor( + public JavaServerTelemetryBuilder setSpanNameExtractor( Function< SpanNameExtractor, ? extends SpanNameExtractor> @@ -104,7 +104,7 @@ public JdkServerTelemetryBuilder setSpanNameExtractor( return this; } - public JdkServerTelemetry build() { - return new JdkServerTelemetry(builder.build()); + public JavaServerTelemetry build() { + return new JavaServerTelemetry(builder.build()); } } diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryService.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryFilter.java similarity index 80% rename from instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryService.java rename to instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryFilter.java index 18c7b7644ee1..5b3d95d3fc65 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryService.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryFilter.java @@ -13,11 +13,11 @@ import java.io.IOException; /** Decorates an {@link HttpServer} to trace inbound {@link HttpExchange}s. */ -final class OpenTelemetryService extends Filter { +final class OpenTelemetryFilter extends Filter { private final Instrumenter instrumenter; - OpenTelemetryService(Instrumenter instrumenter) { + OpenTelemetryFilter(Instrumenter instrumenter) { this.instrumenter = instrumenter; } @@ -30,13 +30,16 @@ public void doFilter(HttpExchange exchange, Chain chain) throws IOException { chain.doFilter(exchange); return; } - + Throwable error = null; Context context = instrumenter.start(parentContext, exchange); try (Scope ignored = context.makeCurrent()) { chain.doFilter(exchange); + } catch (Throwable t) { + error = t; + throw t; } finally { - instrumenter.end(context, exchange, null, null); + instrumenter.end(context, exchange, exchange, error); } } diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkHttpServerAttributesGetter.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaHttpServerAttributesGetter.java similarity index 82% rename from instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkHttpServerAttributesGetter.java rename to instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaHttpServerAttributesGetter.java index b332130b8f0d..22927224e9e1 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkHttpServerAttributesGetter.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaHttpServerAttributesGetter.java @@ -7,13 +7,14 @@ import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpsExchange; +import io.opentelemetry.instrumentation.api.internal.HttpProtocolUtil; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesGetter; import java.net.InetSocketAddress; import java.util.Collections; import java.util.List; import javax.annotation.Nullable; -enum JdkHttpServerAttributesGetter +enum JavaHttpServerAttributesGetter implements HttpServerAttributesGetter { INSTANCE; @@ -29,17 +30,13 @@ public String getUrlScheme(HttpExchange exchange) { @Override public String getUrlPath(HttpExchange exchange) { - String fullPath = exchange.getRequestURI().toString(); - int separatorPos = fullPath.indexOf('?'); - return separatorPos == -1 ? fullPath : fullPath.substring(0, separatorPos); + return exchange.getRequestURI().getPath(); } @Nullable @Override public String getUrlQuery(HttpExchange exchange) { - String fullPath = exchange.getRequestURI().toString(); - int separatorPos = fullPath.indexOf('?'); - return separatorPos == -1 ? null : fullPath.substring(separatorPos + 1); + return exchange.getRequestURI().getQuery(); } @Override @@ -71,13 +68,13 @@ public String getHttpRoute(HttpExchange exchange) { @Override public String getNetworkProtocolName(HttpExchange exchange, @Nullable HttpExchange res) { - return exchange instanceof HttpsExchange ? "https" : "http"; + return HttpProtocolUtil.getProtocol(exchange.getProtocol()); } @Override public String getNetworkProtocolVersion(HttpExchange exchange, @Nullable HttpExchange res) { - return "1.1"; + return HttpProtocolUtil.getVersion(exchange.getProtocol()); } @Override diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderFactory.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaInstrumenterBuilderFactory.java similarity index 85% rename from instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderFactory.java rename to instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaInstrumenterBuilderFactory.java index b7cb85253ce6..bf9c80df0090 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderFactory.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaInstrumenterBuilderFactory.java @@ -13,8 +13,8 @@ * This class is internal and is hence not for public use. Its APIs are unstable and can change at * any time. */ -public final class JdkInstrumenterBuilderFactory { - private JdkInstrumenterBuilderFactory() {} +public final class JavaInstrumenterBuilderFactory { + private JavaInstrumenterBuilderFactory() {} private static final String INSTRUMENTATION_NAME = "io.opentelemetry.java-http-server"; @@ -23,7 +23,7 @@ public static DefaultHttpServerInstrumenterBuilder g return DefaultHttpServerInstrumenterBuilder.create( INSTRUMENTATION_NAME, openTelemetry, - JdkHttpServerAttributesGetter.INSTANCE, + JavaHttpServerAttributesGetter.INSTANCE, ExchangeContextGetter.INSTANCE); } } diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderUtil.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaInstrumenterBuilderUtil.java similarity index 73% rename from instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderUtil.java rename to instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaInstrumenterBuilderUtil.java index 021467ac7bc4..d90789ad7e2b 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JdkInstrumenterBuilderUtil.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaInstrumenterBuilderUtil.java @@ -7,7 +7,7 @@ import com.sun.net.httpserver.HttpExchange; import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; -import io.opentelemetry.instrumentation.httpserver.JdkServerTelemetryBuilder; +import io.opentelemetry.instrumentation.httpserver.JavaServerTelemetryBuilder; import java.util.function.Function; import javax.annotation.Nullable; @@ -15,18 +15,18 @@ * This class is internal and is hence not for public use. Its APIs are unstable and can change at * any time. */ -public class JdkInstrumenterBuilderUtil { - private JdkInstrumenterBuilderUtil() {} +public class JavaInstrumenterBuilderUtil { + private JavaInstrumenterBuilderUtil() {} @Nullable private static Function< - JdkServerTelemetryBuilder, + JavaServerTelemetryBuilder, DefaultHttpServerInstrumenterBuilder> serverBuilderExtractor; @Nullable public static Function< - JdkServerTelemetryBuilder, + JavaServerTelemetryBuilder, DefaultHttpServerInstrumenterBuilder> getServerBuilderExtractor() { return serverBuilderExtractor; @@ -34,9 +34,9 @@ private JdkInstrumenterBuilderUtil() {} public static void setServerBuilderExtractor( Function< - JdkServerTelemetryBuilder, + JavaServerTelemetryBuilder, DefaultHttpServerInstrumenterBuilder> serverBuilderExtractor) { - JdkInstrumenterBuilderUtil.serverBuilderExtractor = serverBuilderExtractor; + JavaInstrumenterBuilderUtil.serverBuilderExtractor = serverBuilderExtractor; } } diff --git a/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java b/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java index d0590c082d29..29847a78af38 100644 --- a/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java +++ b/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java @@ -20,7 +20,7 @@ class JdkHttpServerTest extends AbstractJdkHttpServerTest { @Override protected Filter customFilter() { - return JdkServerTelemetry.builder(testing.getOpenTelemetry()) + return JavaServerTelemetry.builder(testing.getOpenTelemetry()) .setCapturedRequestHeaders( Collections.singletonList(AbstractHttpServerTest.TEST_REQUEST_HEADER)) .setCapturedResponseHeaders( diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java index c219557604d5..be9282cb434f 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java @@ -24,7 +24,7 @@ import java.io.IOException; import java.io.OutputStream; import java.net.InetSocketAddress; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -32,8 +32,6 @@ public abstract class AbstractJdkHttpServerTest extends AbstractHttpServerTest { - List contexts = new ArrayList<>(); - protected Filter customFilter() { return null; } @@ -51,7 +49,7 @@ static void sendResponse( HttpExchange exchange, int status, Map headers, String response) throws IOException { - byte[] bytes = response.getBytes(Charset.defaultCharset()); + byte[] bytes = response.getBytes(StandardCharsets.UTF_8); // -1 means no content, 0 means unknown content length long contentLength = bytes.length == 0 ? -1 : bytes.length; @@ -64,13 +62,13 @@ static void sendResponse( } public String getUrlQuery(HttpExchange exchange) { - String fullPath = exchange.getRequestURI().toString(); - int separatorPos = fullPath.indexOf('?'); - return separatorPos == -1 ? null : fullPath.substring(separatorPos + 1); + return exchange.getRequestURI().getQuery(); } @Override protected HttpServer setupServer() throws IOException { + + List contexts = new ArrayList<>(); HttpServer server = HttpServer.create(new InetSocketAddress(port), 0); HttpContext context = @@ -181,6 +179,7 @@ protected void stopServer(HttpServer server) { @Override protected void configure(HttpServerTestOptions options) { + options.setTestNotFound(false); options.setTestPathParam(false); options.setTestException(false); diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/GlobalIgnoredTypesConfigurer.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/GlobalIgnoredTypesConfigurer.java index 0a8b709b1d11..2b7ec17d8f57 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/GlobalIgnoredTypesConfigurer.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ignore/GlobalIgnoredTypesConfigurer.java @@ -99,7 +99,8 @@ private static void configureIgnoredTypes(IgnoredTypesBuilder builder) { .allowClass("sun.net.www.protocol.") .allowClass("sun.rmi.server") .allowClass("sun.rmi.transport") - .allowClass("sun.net.www.http.HttpClient"); + .allowClass("sun.net.www.http.HttpClient") + .allowClass("sun.net.httpserver."); builder.ignoreClass("org.slf4j."); From 578e2758e96ddafb99a8dd662127320354cf3c82 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 7 Feb 2025 13:13:26 -0500 Subject: [PATCH 13/30] address more comments --- .../httpserver/ResponseCustomizingFilter.java | 1 - instrumentation/java-http-server/library/build.gradle.kts | 6 ------ .../instrumentation/httpserver/OpenTelemetryFilter.java | 2 -- .../httpserver/AbstractJdkHttpServerTest.java | 4 +--- 4 files changed, 1 insertion(+), 12 deletions(-) diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java index 8e7c30befaf7..a05193b02575 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java @@ -17,7 +17,6 @@ class ResponseCustomizingFilter extends Filter { @Override public void doFilter(HttpExchange exchange, Chain chain) throws IOException { - Context context = Context.current(); HttpServerResponseCustomizerHolder.getCustomizer() .customize(context, exchange.getResponseHeaders(), JavaHttpResponseMutator.INSTANCE); diff --git a/instrumentation/java-http-server/library/build.gradle.kts b/instrumentation/java-http-server/library/build.gradle.kts index 0bfcb32b601e..34f1618868e8 100644 --- a/instrumentation/java-http-server/library/build.gradle.kts +++ b/instrumentation/java-http-server/library/build.gradle.kts @@ -6,9 +6,3 @@ plugins { dependencies { testImplementation(project(":instrumentation:java-http-server:testing")) } - -tasks { - withType().configureEach { - systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) - } -} diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryFilter.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryFilter.java index 5b3d95d3fc65..d1bc097e2429 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryFilter.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryFilter.java @@ -18,13 +18,11 @@ final class OpenTelemetryFilter extends Filter { private final Instrumenter instrumenter; OpenTelemetryFilter(Instrumenter instrumenter) { - this.instrumenter = instrumenter; } @Override public void doFilter(HttpExchange exchange, Chain chain) throws IOException { - Context parentContext = Context.current(); if (!instrumenter.shouldStart(parentContext, exchange)) { chain.doFilter(exchange); diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java index be9282cb434f..1aff9cd6531f 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java @@ -61,7 +61,7 @@ static void sendResponse( } } - public String getUrlQuery(HttpExchange exchange) { + private static String getUrlQuery(HttpExchange exchange) { return exchange.getRequestURI().getQuery(); } @@ -195,8 +195,6 @@ public void doFilter(HttpExchange exchange, Chain chain) throws IOException { exchange.sendResponseHeaders(601, -1); } - exchange.getResponseHeaders().set("decoratingfunction", "ok"); - exchange.getResponseHeaders().set("decoratinghttpservicefunction", "ok"); try { chain.doFilter(exchange); From 43a78c2f78164bd7826220f288dc9b9e20a66216 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 7 Feb 2025 15:36:54 -0500 Subject: [PATCH 14/30] http pipeline --- .../javaagent/instrumentation/httpserver/JdkHttpServerTest.java | 1 + .../instrumentation/httpserver/JdkHttpServerTest.java | 1 + 2 files changed, 2 insertions(+) diff --git a/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java b/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java index 04cd92efb38e..1c07a0290caa 100644 --- a/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java +++ b/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java @@ -21,5 +21,6 @@ protected void configure(HttpServerTestOptions options) { super.configure(options); // library instrumentation does not create a span at all options.disableTestNonStandardHttpMethod(); + options.setTestHttpPipelining(false); } } diff --git a/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java b/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java index 29847a78af38..9faa2c88fa3f 100644 --- a/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java +++ b/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java @@ -34,5 +34,6 @@ protected void configure(HttpServerTestOptions options) { super.configure(options); // library instrumentation does not create a span at all options.disableTestNonStandardHttpMethod(); + options.setTestHttpPipelining(false); } } From 8ee019fa49460173894d4e22fd37798b76b40539 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 7 Feb 2025 17:08:12 -0500 Subject: [PATCH 15/30] add executor --- .../instrumentation/httpserver/AbstractJdkHttpServerTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java index 1aff9cd6531f..ece5dedcb929 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java @@ -29,6 +29,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.concurrent.Executors; public abstract class AbstractJdkHttpServerTest extends AbstractHttpServerTest { @@ -71,6 +72,7 @@ protected HttpServer setupServer() throws IOException { List contexts = new ArrayList<>(); HttpServer server = HttpServer.create(new InetSocketAddress(port), 0); + server.setExecutor(Executors.newCachedThreadPool()); HttpContext context = server.createContext( SUCCESS.getPath(), From 43cc1cf581d735bf0bba654e3551cc6086968193 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 7 Feb 2025 17:57:13 -0500 Subject: [PATCH 16/30] Update supported-libraries.md --- docs/supported-libraries.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/supported-libraries.md b/docs/supported-libraries.md index 8a66681358f0..2a3b6a3382f2 100644 --- a/docs/supported-libraries.md +++ b/docs/supported-libraries.md @@ -80,6 +80,7 @@ These are the supported libraries and frameworks: | [InfluxDB Client](https://github.com/influxdata/influxdb-java) | 2.4+ | N/A | [Database Client Spans], [Database Client Metrics] [6] | | [Java Executors](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executor.html) | Java 8+ | N/A | Context propagation | | [Java Http Client](https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/package-summary.html) | Java 11+ | [opentelemetry-java-http-client](../instrumentation/java-http-client/library) | [HTTP Client Spans], [HTTP Client Metrics] | +| [Java Http Server](https://docs.oracle.com/en/java/javase/21/docs/api/jdk.httpserver/module-summary.html) | Java 8+ | [opentelemetry-java-http-server](../instrumentation/java-http-server/library) | [HTTP Server Spans], [HTTP Server Metrics] | | [java.util.logging](https://docs.oracle.com/javase/8/docs/api/java/util/logging/package-summary.html) | Java 8+ | N/A | none | | [Java Platform](https://docs.oracle.com/javase/8/docs/api/java/lang/management/ManagementFactory.html) | Java 8+ | [opentelemetry-runtime-telemetry-java8](../instrumentation/runtime-telemetry/runtime-telemetry-java8/library),
[opentelemetry-runtime-telemetry-java17](../instrumentation/runtime-telemetry/runtime-telemetry-java17/library),
[opentelemetry-resources](../instrumentation/resources/library) | [JVM Runtime Metrics] | | [Javalin](https://javalin.io/) | 5.0+ | N/A | Provides `http.route` [2] | From 2332175eb58fdff5afc220a21cdbebc207ce0420 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 7 Feb 2025 21:28:32 -0500 Subject: [PATCH 17/30] try future stop --- .../instrumentation/httpserver/AbstractJdkHttpServerTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java index ece5dedcb929..a5393118982a 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java @@ -25,6 +25,7 @@ import java.io.OutputStream; import java.net.InetSocketAddress; import java.nio.charset.StandardCharsets; +import java.util.concurrent.CompletableFuture; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -176,7 +177,7 @@ protected HttpServer setupServer() throws IOException { @Override protected void stopServer(HttpServer server) { - server.stop(1000); + CompletableFuture.runAsync(() -> server.stop(1000)); } @Override From d2698c0890482972ff130190da258c0e52e0efdd Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 7 Feb 2025 21:39:17 -0500 Subject: [PATCH 18/30] Update AbstractJdkHttpServerTest.java --- .../instrumentation/httpserver/AbstractJdkHttpServerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java index a5393118982a..a46f48a29a54 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java @@ -25,11 +25,11 @@ import java.io.OutputStream; import java.net.InetSocketAddress; import java.nio.charset.StandardCharsets; -import java.util.concurrent.CompletableFuture; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executors; public abstract class AbstractJdkHttpServerTest extends AbstractHttpServerTest { From fd3662a4f0ce37571028820cdc54a3b0e6688f5e Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 7 Feb 2025 21:59:06 -0500 Subject: [PATCH 19/30] Update AbstractJdkHttpServerTest.java --- .../instrumentation/httpserver/AbstractJdkHttpServerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java index a46f48a29a54..5e4a77431465 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java @@ -177,6 +177,7 @@ protected HttpServer setupServer() throws IOException { @Override protected void stopServer(HttpServer server) { + //I guess the server has trouble stopping? CompletableFuture.runAsync(() -> server.stop(1000)); } @@ -195,7 +196,6 @@ public void doFilter(HttpExchange exchange, Chain chain) throws IOException { if (!Span.current().getSpanContext().isValid()) { // Return an invalid code to fail any assertion - exchange.sendResponseHeaders(601, -1); } From 15383a8edac8e6c32c89d7de45a1ac44dd2dc1ff Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 7 Feb 2025 22:04:23 -0500 Subject: [PATCH 20/30] Update AbstractJdkHttpServerTest.java --- .../instrumentation/httpserver/AbstractJdkHttpServerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java index 5e4a77431465..cf80153de45d 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java @@ -177,7 +177,7 @@ protected HttpServer setupServer() throws IOException { @Override protected void stopServer(HttpServer server) { - //I guess the server has trouble stopping? + // I guess the server has trouble stopping? CompletableFuture.runAsync(() -> server.stop(1000)); } From 10b36796941d1c9105508f42781fd84c4b439881 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Tue, 11 Feb 2025 11:13:58 -0500 Subject: [PATCH 21/30] Create README.md --- .../java-http-server/library/README.md | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 instrumentation/java-http-server/library/README.md diff --git a/instrumentation/java-http-server/library/README.md b/instrumentation/java-http-server/library/README.md new file mode 100644 index 000000000000..fbd5d7d13058 --- /dev/null +++ b/instrumentation/java-http-server/library/README.md @@ -0,0 +1,63 @@ +# Library Instrumentation for Java HTTP Server + +Provides OpenTelemetry instrumentation for [Java HTTP Server](https://docs.oracle.com/en/java/javase/21/docs/api/jdk.httpserver/module-summary.html). + +## Quickstart + +### Add these dependencies to your project + +Replace `OPENTELEMETRY_VERSION` with the [latest +release](https://search.maven.org/search?q=g:io.opentelemetry.instrumentation%20AND%20a:opentelemetry-java-http-server). + +For Maven, add to your `pom.xml` dependencies: + +```xml + + + io.opentelemetry.instrumentation + opentelemetry-java-http-server + OPENTELEMETRY_VERSION + + +``` + +For Gradle, add to your dependencies: + +```groovy +implementation("io.opentelemetry.instrumentation:opentelemetry-java-http-server:OPENTELEMETRY_VERSION") +``` + +### Usage + +The instrumentation library contains a `Filter` wrapper that provides OpenTelemetry-based spans +and context propagation. + +```java + +import java.io.IOException; +import java.net.InetSocketAddress; + +import com.sun.net.httpserver.HttpContext; +import com.sun.net.httpserver.HttpServer; + +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.sdk.OpenTelemetrySdk; + +public class Application { + + static void main(String args) throws IOException { + + final HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0); + final HttpContext context = + server.createContext( + "/", + ctx -> { + // http logic + }); + + OpenTelemetry otel = //... + + context.getFilters().add(JavaServerTelemetry.create(otel).otelFilter()); + } +} +``` From 46cb20f118b76de384adacc4ef1310b293ccd356 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Wed, 12 Feb 2025 15:55:42 +0200 Subject: [PATCH 22/30] update fossa configuration --- .fossa.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.fossa.yml b/.fossa.yml index 627c1f06d83c..eed5ac8b7ec8 100644 --- a/.fossa.yml +++ b/.fossa.yml @@ -148,6 +148,12 @@ targets: - type: gradle path: ./ target: ':instrumentation:java-http-client:library' + - type: gradle + path: ./ + target: ':instrumentation:java-http-server:javaagent' + - type: gradle + path: ./ + target: ':instrumentation:java-http-server:library' - type: gradle path: ./ target: ':instrumentation:java-util-logging:javaagent' From 6487593454c511e08cb2f2e1941a77e37c79e987 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Thu, 13 Feb 2025 11:23:46 +0200 Subject: [PATCH 23/30] rename classes --- ...on.java => HttpServerInstrumentation.java} | 16 +++++--- .../JavaHttpServerInstrumentationModule.java | 2 +- ...ava => JavaHttpServerResponseMutator.java} | 2 +- .../httpserver/JavaHttpServerSingletons.java | 34 ++++++++++++++++ .../httpserver/JavaSingletons.java | 36 ----------------- .../httpserver/ResponseCustomizingFilter.java | 4 +- ...erverTest.java => JavaHttpServerTest.java} | 13 +------ .../java-http-server/library/README.md | 2 +- .../JavaHttpServerAttributesGetter.java | 8 +--- ...java => JavaHttpServerExchangeGetter.java} | 11 +++--- ...etry.java => JavaHttpServerTelemetry.java} | 18 +++++---- ...va => JavaHttpServerTelemetryBuilder.java} | 39 ++++++++++++------- .../httpserver/OpenTelemetryFilter.java | 6 ++- .../httpserver/internal/Experimental.java | 36 +++++++++++++++++ ...avaHttpServerInstrumenterBuilderUtil.java} | 14 +++---- .../JavaInstrumenterBuilderFactory.java | 29 -------------- ...erverTest.java => JavaHttpServerTest.java} | 15 ++----- ...t.java => AbstractJavaHttpServerTest.java} | 14 +++---- 18 files changed, 150 insertions(+), 149 deletions(-) rename instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/{JavaServerContextInstrumentation.java => HttpServerInstrumentation.java} (66%) rename instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/{JavaHttpResponseMutator.java => JavaHttpServerResponseMutator.java} (82%) create mode 100644 instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerSingletons.java delete mode 100644 instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaSingletons.java rename instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/{JdkHttpServerTest.java => JavaHttpServerTest.java} (51%) rename instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/{internal => }/JavaHttpServerAttributesGetter.java (95%) rename instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/{internal/ExchangeContextGetter.java => JavaHttpServerExchangeGetter.java} (80%) rename instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/{JavaServerTelemetry.java => JavaHttpServerTelemetry.java} (52%) rename instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/{JavaServerTelemetryBuilder.java => JavaHttpServerTelemetryBuilder.java} (70%) create mode 100644 instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/Experimental.java rename instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/{JavaInstrumenterBuilderUtil.java => JavaHttpServerInstrumenterBuilderUtil.java} (71%) delete mode 100644 instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaInstrumenterBuilderFactory.java rename instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/{JdkHttpServerTest.java => JavaHttpServerTest.java} (66%) rename instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/{AbstractJdkHttpServerTest.java => AbstractJavaHttpServerTest.java} (95%) diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaServerContextInstrumentation.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/HttpServerInstrumentation.java similarity index 66% rename from instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaServerContextInstrumentation.java rename to instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/HttpServerInstrumentation.java index 4689407894f9..dfdd8536a3a9 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaServerContextInstrumentation.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/HttpServerInstrumentation.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.httpserver; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.extendsClass; +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; @@ -17,26 +18,31 @@ import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -public class JavaServerContextInstrumentation implements TypeInstrumentation { +public class HttpServerInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { return extendsClass(named("com.sun.net.httpserver.HttpServer")); } + @Override + public ElementMatcher classLoaderOptimization() { + return hasClassesNamed("com.sun.net.httpserver.HttpServer"); + } + @Override public void transform(TypeTransformer transformer) { transformer.applyAdviceToMethod( isMethod().and(isPublic()).and(named("createContext")), - JavaServerContextInstrumentation.class.getName() + "$BuildAdvice"); + HttpServerInstrumentation.class.getName() + "$BuildAdvice"); } @SuppressWarnings("unused") public static class BuildAdvice { - @Advice.OnMethodExit - public static void onExit(@Advice.Return HttpContext ctx) { - ctx.getFilters().addAll(JavaSingletons.FILTERS); + @Advice.OnMethodExit(suppress = Throwable.class) + public static void onExit(@Advice.Return HttpContext httpContext) { + httpContext.getFilters().addAll(JavaHttpServerSingletons.FILTERS); } } } diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerInstrumentationModule.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerInstrumentationModule.java index 7d3f7dd36def..205615c4794b 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerInstrumentationModule.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerInstrumentationModule.java @@ -19,6 +19,6 @@ public JavaHttpServerInstrumentationModule() { @Override public List typeInstrumentations() { - return Collections.singletonList(new JavaServerContextInstrumentation()); + return Collections.singletonList(new HttpServerInstrumentation()); } } diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpResponseMutator.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerResponseMutator.java similarity index 82% rename from instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpResponseMutator.java rename to instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerResponseMutator.java index 608abc00064e..659d1c273c13 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpResponseMutator.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerResponseMutator.java @@ -8,7 +8,7 @@ import com.sun.net.httpserver.Headers; import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseMutator; -enum JavaHttpResponseMutator implements HttpServerResponseMutator { +enum JavaHttpServerResponseMutator implements HttpServerResponseMutator { INSTANCE; @Override diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerSingletons.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerSingletons.java new file mode 100644 index 000000000000..476b25c5f5c5 --- /dev/null +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerSingletons.java @@ -0,0 +1,34 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.httpserver; + +import com.sun.net.httpserver.Filter; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig; +import io.opentelemetry.instrumentation.httpserver.JavaHttpServerTelemetry; +import io.opentelemetry.instrumentation.httpserver.JavaHttpServerTelemetryBuilder; +import io.opentelemetry.instrumentation.httpserver.internal.JavaHttpServerInstrumenterBuilderUtil; +import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; +import java.util.Arrays; +import java.util.List; + +public final class JavaHttpServerSingletons { + + public static final List FILTERS; + + static { + CommonConfig config = AgentCommonConfig.get(); + + JavaHttpServerTelemetryBuilder serverBuilder = + JavaHttpServerTelemetry.builder(GlobalOpenTelemetry.get()); + JavaHttpServerInstrumenterBuilderUtil.getServerBuilderExtractor().apply(serverBuilder).configure(config); + JavaHttpServerTelemetry serverTelemetry = serverBuilder.build(); + + FILTERS = Arrays.asList(serverTelemetry.newFilter(), new ResponseCustomizingFilter()); + } + + private JavaHttpServerSingletons() {} +} diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaSingletons.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaSingletons.java deleted file mode 100644 index 4c2acd1e0621..000000000000 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaSingletons.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.httpserver; - -import com.sun.net.httpserver.Filter; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig; -import io.opentelemetry.instrumentation.httpserver.JavaServerTelemetry; -import io.opentelemetry.instrumentation.httpserver.JavaServerTelemetryBuilder; -import io.opentelemetry.instrumentation.httpserver.internal.JavaInstrumenterBuilderUtil; -import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; -import java.util.Arrays; -import java.util.List; - -// Holds singleton references to decorators to match against during suppression. -// https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/903 -public final class JavaSingletons { - - public static final List FILTERS; - - static { - CommonConfig config = AgentCommonConfig.get(); - - JavaServerTelemetryBuilder serverBuilder = - JavaServerTelemetry.builder(GlobalOpenTelemetry.get()); - JavaInstrumenterBuilderUtil.getServerBuilderExtractor().apply(serverBuilder).configure(config); - JavaServerTelemetry serverTelemetry = serverBuilder.build(); - - FILTERS = Arrays.asList(serverTelemetry.otelFilter(), new ResponseCustomizingFilter()); - } - - private JavaSingletons() {} -} diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java index a05193b02575..40e623b2fd9f 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java @@ -19,12 +19,12 @@ class ResponseCustomizingFilter extends Filter { public void doFilter(HttpExchange exchange, Chain chain) throws IOException { Context context = Context.current(); HttpServerResponseCustomizerHolder.getCustomizer() - .customize(context, exchange.getResponseHeaders(), JavaHttpResponseMutator.INSTANCE); + .customize(context, exchange.getResponseHeaders(), JavaHttpServerResponseMutator.INSTANCE); chain.doFilter(exchange); } @Override public String description() { - return "ResponseCustomizingFilter"; + return "OpenTelemetry response customizing filter"; } } diff --git a/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java b/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerTest.java similarity index 51% rename from instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java rename to instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerTest.java index 1c07a0290caa..14b624ec6415 100644 --- a/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JdkHttpServerTest.java +++ b/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerTest.java @@ -5,22 +5,13 @@ package io.opentelemetry.javaagent.instrumentation.httpserver; -import io.opentelemetry.instrumentation.httpserver.AbstractJdkHttpServerTest; +import io.opentelemetry.instrumentation.httpserver.AbstractJavaHttpServerTest; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import org.junit.jupiter.api.extension.RegisterExtension; -class JdkHttpServerTest extends AbstractJdkHttpServerTest { +class JavaHttpServerTest extends AbstractJavaHttpServerTest { @RegisterExtension static final InstrumentationExtension testing = HttpServerInstrumentationExtension.forAgent(); - - @Override - protected void configure(HttpServerTestOptions options) { - super.configure(options); - // library instrumentation does not create a span at all - options.disableTestNonStandardHttpMethod(); - options.setTestHttpPipelining(false); - } } diff --git a/instrumentation/java-http-server/library/README.md b/instrumentation/java-http-server/library/README.md index fbd5d7d13058..acbf6d63d050 100644 --- a/instrumentation/java-http-server/library/README.md +++ b/instrumentation/java-http-server/library/README.md @@ -57,7 +57,7 @@ public class Application { OpenTelemetry otel = //... - context.getFilters().add(JavaServerTelemetry.create(otel).otelFilter()); + context.getFilters().add(JavaHttpServerTelemetry.create(otel).newFilter()); } } ``` diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaHttpServerAttributesGetter.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerAttributesGetter.java similarity index 95% rename from instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaHttpServerAttributesGetter.java rename to instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerAttributesGetter.java index 22927224e9e1..1d336ba102d3 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaHttpServerAttributesGetter.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerAttributesGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpserver.internal; +package io.opentelemetry.instrumentation.httpserver; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpsExchange; @@ -49,10 +49,7 @@ public List getHttpRequestHeader(HttpExchange exchange, String name) { public Integer getHttpResponseStatusCode( HttpExchange exchange, @Nullable HttpExchange res, @Nullable Throwable error) { int status = exchange.getResponseCode(); - if (status > 1) { - return status; - } - return null; + return status != -1 ? status : null; } @Override @@ -73,7 +70,6 @@ public String getNetworkProtocolName(HttpExchange exchange, @Nullable HttpExchan @Override public String getNetworkProtocolVersion(HttpExchange exchange, @Nullable HttpExchange res) { - return HttpProtocolUtil.getVersion(exchange.getProtocol()); } diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/ExchangeContextGetter.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerExchangeGetter.java similarity index 80% rename from instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/ExchangeContextGetter.java rename to instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerExchangeGetter.java index c332754d60f0..4a51603681ef 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/ExchangeContextGetter.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerExchangeGetter.java @@ -3,17 +3,16 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpserver.internal; +package io.opentelemetry.instrumentation.httpserver; import com.sun.net.httpserver.HttpExchange; import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter; import java.util.Collections; import java.util.Iterator; import java.util.List; -import java.util.stream.Collectors; import javax.annotation.Nullable; -enum ExchangeContextGetter implements ExtendedTextMapGetter { +enum JavaHttpServerExchangeGetter implements ExtendedTextMapGetter { INSTANCE; @Override @@ -21,7 +20,7 @@ public Iterable keys(@Nullable HttpExchange exchange) { if (exchange == null) { return Collections.emptyList(); } - return exchange.getRequestHeaders().keySet().stream().collect(Collectors.toList()); + return exchange.getRequestHeaders().keySet(); } @Nullable @@ -30,8 +29,8 @@ public String get(@Nullable HttpExchange carrier, String key) { if (carrier == null) { return null; } - List list = carrier.getRequestHeaders().get(key); + List list = carrier.getRequestHeaders().get(key); return list != null ? list.get(0) : null; } @@ -40,8 +39,8 @@ public Iterator getAll(@Nullable HttpExchange carrier, String key) { if (carrier == null) { return Collections.emptyIterator(); } - List list = carrier.getRequestHeaders().get(key); + List list = carrier.getRequestHeaders().get(key); return list != null ? list.iterator() : Collections.emptyIterator(); } } diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaServerTelemetry.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTelemetry.java similarity index 52% rename from instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaServerTelemetry.java rename to instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTelemetry.java index 0824fe52c919..3baff5bac566 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaServerTelemetry.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTelemetry.java @@ -10,26 +10,28 @@ import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -/** Entrypoint for instrumenting the jdk.httpserver services. */ -public final class JavaServerTelemetry { +/** Entrypoint for instrumenting Java HTTP Server services. */ +public final class JavaHttpServerTelemetry { - /** Returns a new {@link JavaServerTelemetry} configured with the given {@link OpenTelemetry}. */ - public static JavaServerTelemetry create(OpenTelemetry openTelemetry) { + /** + * Returns a new {@link JavaHttpServerTelemetry} configured with the given {@link OpenTelemetry}. + */ + public static JavaHttpServerTelemetry create(OpenTelemetry openTelemetry) { return builder(openTelemetry).build(); } - public static JavaServerTelemetryBuilder builder(OpenTelemetry openTelemetry) { - return new JavaServerTelemetryBuilder(openTelemetry); + public static JavaHttpServerTelemetryBuilder builder(OpenTelemetry openTelemetry) { + return new JavaHttpServerTelemetryBuilder(openTelemetry); } private final Instrumenter instrumenter; - JavaServerTelemetry(Instrumenter instrumenter) { + JavaHttpServerTelemetry(Instrumenter instrumenter) { this.instrumenter = instrumenter; } /** Returns a new {@link Filter} for telemetry usage */ - public Filter otelFilter() { + public Filter newFilter() { return new OpenTelemetryFilter(instrumenter); } } diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaServerTelemetryBuilder.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTelemetryBuilder.java similarity index 70% rename from instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaServerTelemetryBuilder.java rename to instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTelemetryBuilder.java index 525ae8c61d6e..f10b2d61a41e 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaServerTelemetryBuilder.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTelemetryBuilder.java @@ -13,26 +13,35 @@ import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder; -import io.opentelemetry.instrumentation.httpserver.internal.JavaInstrumenterBuilderFactory; -import io.opentelemetry.instrumentation.httpserver.internal.JavaInstrumenterBuilderUtil; +import io.opentelemetry.instrumentation.httpserver.internal.Experimental; +import io.opentelemetry.instrumentation.httpserver.internal.JavaHttpServerInstrumenterBuilderUtil; import java.util.Collection; import java.util.function.Function; -public final class JavaServerTelemetryBuilder { +public final class JavaHttpServerTelemetryBuilder { + + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.java-http-server"; private final DefaultHttpServerInstrumenterBuilder builder; static { - JavaInstrumenterBuilderUtil.setServerBuilderExtractor(builder -> builder.builder); + JavaHttpServerInstrumenterBuilderUtil.setServerBuilderExtractor(builder -> builder.builder); + Experimental.internalSetEmitExperimentalTelemetry( + (builder, emit) -> builder.builder.setEmitExperimentalHttpServerMetrics(emit)); } - JavaServerTelemetryBuilder(OpenTelemetry openTelemetry) { - builder = JavaInstrumenterBuilderFactory.getServerBuilder(openTelemetry); + JavaHttpServerTelemetryBuilder(OpenTelemetry openTelemetry) { + builder = + DefaultHttpServerInstrumenterBuilder.create( + INSTRUMENTATION_NAME, + openTelemetry, + JavaHttpServerAttributesGetter.INSTANCE, + JavaHttpServerExchangeGetter.INSTANCE); } /** Sets the status extractor for server spans. */ @CanIgnoreReturnValue - public JavaServerTelemetryBuilder setStatusExtractor( + public JavaHttpServerTelemetryBuilder setStatusExtractor( Function< SpanStatusExtractor, ? extends SpanStatusExtractor> @@ -46,7 +55,7 @@ public JavaServerTelemetryBuilder setStatusExtractor( * The {@link AttributesExtractor} will be executed after all default extractors. */ @CanIgnoreReturnValue - public JavaServerTelemetryBuilder addAttributesExtractor( + public JavaHttpServerTelemetryBuilder addAttributesExtractor( AttributesExtractor attributesExtractor) { builder.addAttributesExtractor(attributesExtractor); return this; @@ -58,7 +67,8 @@ public JavaServerTelemetryBuilder addAttributesExtractor( * @param requestHeaders A list of HTTP header names. */ @CanIgnoreReturnValue - public JavaServerTelemetryBuilder setCapturedRequestHeaders(Collection requestHeaders) { + public JavaHttpServerTelemetryBuilder setCapturedRequestHeaders( + Collection requestHeaders) { builder.setCapturedRequestHeaders(requestHeaders); return this; } @@ -69,7 +79,8 @@ public JavaServerTelemetryBuilder setCapturedRequestHeaders(Collection r * @param responseHeaders A list of HTTP header names. */ @CanIgnoreReturnValue - public JavaServerTelemetryBuilder setCapturedResponseHeaders(Collection responseHeaders) { + public JavaHttpServerTelemetryBuilder setCapturedResponseHeaders( + Collection responseHeaders) { builder.setCapturedResponseHeaders(responseHeaders); return this; } @@ -88,14 +99,14 @@ public JavaServerTelemetryBuilder setCapturedResponseHeaders(Collection * @see HttpServerAttributesExtractorBuilder#setKnownMethods(Collection) */ @CanIgnoreReturnValue - public JavaServerTelemetryBuilder setKnownMethods(Collection knownMethods) { + public JavaHttpServerTelemetryBuilder setKnownMethods(Collection knownMethods) { builder.setKnownMethods(knownMethods); return this; } /** Sets custom server {@link SpanNameExtractor} via transform function. */ @CanIgnoreReturnValue - public JavaServerTelemetryBuilder setSpanNameExtractor( + public JavaHttpServerTelemetryBuilder setSpanNameExtractor( Function< SpanNameExtractor, ? extends SpanNameExtractor> @@ -104,7 +115,7 @@ public JavaServerTelemetryBuilder setSpanNameExtractor( return this; } - public JavaServerTelemetry build() { - return new JavaServerTelemetry(builder.build()); + public JavaHttpServerTelemetry build() { + return new JavaHttpServerTelemetry(builder.build()); } } diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryFilter.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryFilter.java index d1bc097e2429..84dc26adffca 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryFilter.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryFilter.java @@ -7,6 +7,7 @@ import com.sun.net.httpserver.Filter; import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpServer; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; @@ -28,9 +29,10 @@ public void doFilter(HttpExchange exchange, Chain chain) throws IOException { chain.doFilter(exchange); return; } - Throwable error = null; + Context context = instrumenter.start(parentContext, exchange); + Throwable error = null; try (Scope ignored = context.makeCurrent()) { chain.doFilter(exchange); } catch (Throwable t) { @@ -43,6 +45,6 @@ public void doFilter(HttpExchange exchange, Chain chain) throws IOException { @Override public String description() { - return "OpenTelemetry"; + return "OpenTelemetry tracing filter"; } } diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/Experimental.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/Experimental.java new file mode 100644 index 000000000000..f96b70a5af5f --- /dev/null +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/Experimental.java @@ -0,0 +1,36 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.httpserver.internal; + +import io.opentelemetry.instrumentation.httpserver.JavaHttpServerTelemetryBuilder; +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 + setEmitExperimentalTelemetry; + + public static void setEmitExperimentalTelemetry( + JavaHttpServerTelemetryBuilder builder, boolean emitExperimentalTelemetry) { + if (setEmitExperimentalTelemetry != null) { + setEmitExperimentalTelemetry.accept(builder, emitExperimentalTelemetry); + } + } + + public static void internalSetEmitExperimentalTelemetry( + BiConsumer setEmitExperimentalTelemetry) { + Experimental.setEmitExperimentalTelemetry = setEmitExperimentalTelemetry; + } + + private Experimental() {} +} diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaInstrumenterBuilderUtil.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaHttpServerInstrumenterBuilderUtil.java similarity index 71% rename from instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaInstrumenterBuilderUtil.java rename to instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaHttpServerInstrumenterBuilderUtil.java index d90789ad7e2b..8914cdeb8ff0 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaInstrumenterBuilderUtil.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaHttpServerInstrumenterBuilderUtil.java @@ -7,7 +7,7 @@ import com.sun.net.httpserver.HttpExchange; import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; -import io.opentelemetry.instrumentation.httpserver.JavaServerTelemetryBuilder; +import io.opentelemetry.instrumentation.httpserver.JavaHttpServerTelemetryBuilder; import java.util.function.Function; import javax.annotation.Nullable; @@ -15,18 +15,18 @@ * This class is internal and is hence not for public use. Its APIs are unstable and can change at * any time. */ -public class JavaInstrumenterBuilderUtil { - private JavaInstrumenterBuilderUtil() {} +public class JavaHttpServerInstrumenterBuilderUtil { + private JavaHttpServerInstrumenterBuilderUtil() {} @Nullable private static Function< - JavaServerTelemetryBuilder, + JavaHttpServerTelemetryBuilder, DefaultHttpServerInstrumenterBuilder> serverBuilderExtractor; @Nullable public static Function< - JavaServerTelemetryBuilder, + JavaHttpServerTelemetryBuilder, DefaultHttpServerInstrumenterBuilder> getServerBuilderExtractor() { return serverBuilderExtractor; @@ -34,9 +34,9 @@ private JavaInstrumenterBuilderUtil() {} public static void setServerBuilderExtractor( Function< - JavaServerTelemetryBuilder, + JavaHttpServerTelemetryBuilder, DefaultHttpServerInstrumenterBuilder> serverBuilderExtractor) { - JavaInstrumenterBuilderUtil.serverBuilderExtractor = serverBuilderExtractor; + JavaHttpServerInstrumenterBuilderUtil.serverBuilderExtractor = serverBuilderExtractor; } } diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaInstrumenterBuilderFactory.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaInstrumenterBuilderFactory.java deleted file mode 100644 index bf9c80df0090..000000000000 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaInstrumenterBuilderFactory.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.httpserver.internal; - -import com.sun.net.httpserver.HttpExchange; -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; - -/** - * This class is internal and is hence not for public use. Its APIs are unstable and can change at - * any time. - */ -public final class JavaInstrumenterBuilderFactory { - private JavaInstrumenterBuilderFactory() {} - - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.java-http-server"; - - public static DefaultHttpServerInstrumenterBuilder getServerBuilder( - OpenTelemetry openTelemetry) { - return DefaultHttpServerInstrumenterBuilder.create( - INSTRUMENTATION_NAME, - openTelemetry, - JavaHttpServerAttributesGetter.INSTANCE, - ExchangeContextGetter.INSTANCE); - } -} diff --git a/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java b/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTest.java similarity index 66% rename from instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java rename to instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTest.java index 9faa2c88fa3f..7185a6ad97b4 100644 --- a/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JdkHttpServerTest.java +++ b/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTest.java @@ -9,31 +9,22 @@ 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 java.util.Collections; import org.junit.jupiter.api.extension.RegisterExtension; -class JdkHttpServerTest extends AbstractJdkHttpServerTest { +class JavaHttpServerTest extends AbstractJavaHttpServerTest { @RegisterExtension static final InstrumentationExtension testing = HttpServerInstrumentationExtension.forLibrary(); @Override protected Filter customFilter() { - return JavaServerTelemetry.builder(testing.getOpenTelemetry()) + return JavaHttpServerTelemetry.builder(testing.getOpenTelemetry()) .setCapturedRequestHeaders( Collections.singletonList(AbstractHttpServerTest.TEST_REQUEST_HEADER)) .setCapturedResponseHeaders( Collections.singletonList(AbstractHttpServerTest.TEST_RESPONSE_HEADER)) .build() - .otelFilter(); - } - - @Override - protected void configure(HttpServerTestOptions options) { - super.configure(options); - // library instrumentation does not create a span at all - options.disableTestNonStandardHttpMethod(); - options.setTestHttpPipelining(false); + .newFilter(); } } diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJavaHttpServerTest.java similarity index 95% rename from instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java rename to instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJavaHttpServerTest.java index cf80153de45d..6fe31489921c 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJdkHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJavaHttpServerTest.java @@ -29,10 +29,9 @@ import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executors; -public abstract class AbstractJdkHttpServerTest extends AbstractHttpServerTest { +public abstract class AbstractJavaHttpServerTest extends AbstractHttpServerTest { protected Filter customFilter() { return null; @@ -69,7 +68,6 @@ private static String getUrlQuery(HttpExchange exchange) { @Override protected HttpServer setupServer() throws IOException { - List contexts = new ArrayList<>(); HttpServer server = HttpServer.create(new InetSocketAddress(port), 0); @@ -168,7 +166,6 @@ protected HttpServer setupServer() throws IOException { // Make sure user decorators see spans. Filter spanFilter = new SpanFilter(); - contexts.forEach(ctx -> ctx.getFilters().add(spanFilter)); server.start(); @@ -177,23 +174,24 @@ protected HttpServer setupServer() throws IOException { @Override protected void stopServer(HttpServer server) { - // I guess the server has trouble stopping? - CompletableFuture.runAsync(() -> server.stop(1000)); + server.stop(0); } @Override protected void configure(HttpServerTestOptions options) { - options.setTestNotFound(false); options.setTestPathParam(false); options.setTestException(false); + // filter isn't called for non-standard method + options.disableTestNonStandardHttpMethod(); + options.setTestHttpPipelining( + Double.parseDouble(System.getProperty("java.specification.version")) >= 21); } static class SpanFilter extends Filter { @Override public void doFilter(HttpExchange exchange, Chain chain) throws IOException { - if (!Span.current().getSpanContext().isValid()) { // Return an invalid code to fail any assertion exchange.sendResponseHeaders(601, -1); From ec176d8b4b4d26231dc907c5ed2fb2e40e62a574 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Thu, 13 Feb 2025 14:58:11 +0200 Subject: [PATCH 24/30] fix jdk8 --- .../httpserver/HttpServerInstrumentation.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/HttpServerInstrumentation.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/HttpServerInstrumentation.java index dfdd8536a3a9..af681fc31b68 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/HttpServerInstrumentation.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/HttpServerInstrumentation.java @@ -6,7 +6,6 @@ package io.opentelemetry.javaagent.instrumentation.httpserver; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.extendsClass; -import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; @@ -25,11 +24,6 @@ public ElementMatcher typeMatcher() { return extendsClass(named("com.sun.net.httpserver.HttpServer")); } - @Override - public ElementMatcher classLoaderOptimization() { - return hasClassesNamed("com.sun.net.httpserver.HttpServer"); - } - @Override public void transform(TypeTransformer transformer) { transformer.applyAdviceToMethod( From 373abd7d7d05ddafc1afee209bb06dc0a055223f Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Thu, 13 Feb 2025 15:01:50 +0200 Subject: [PATCH 25/30] modify tests a bit, add a method that configures tracing for HttpContext --- .../httpserver/JavaHttpServerSingletons.java | 4 +- .../java-http-server/library/README.md | 6 +- .../httpserver/JavaHttpServerTelemetry.java | 6 ++ .../httpserver/JavaHttpServerTest.java | 20 ++-- .../AbstractJavaHttpServerTest.java | 94 +++++++------------ 5 files changed, 60 insertions(+), 70 deletions(-) diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerSingletons.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerSingletons.java index 476b25c5f5c5..4a3253da98de 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerSingletons.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerSingletons.java @@ -24,7 +24,9 @@ public final class JavaHttpServerSingletons { JavaHttpServerTelemetryBuilder serverBuilder = JavaHttpServerTelemetry.builder(GlobalOpenTelemetry.get()); - JavaHttpServerInstrumenterBuilderUtil.getServerBuilderExtractor().apply(serverBuilder).configure(config); + JavaHttpServerInstrumenterBuilderUtil.getServerBuilderExtractor() + .apply(serverBuilder) + .configure(config); JavaHttpServerTelemetry serverTelemetry = serverBuilder.build(); FILTERS = Arrays.asList(serverTelemetry.newFilter(), new ResponseCustomizingFilter()); diff --git a/instrumentation/java-http-server/library/README.md b/instrumentation/java-http-server/library/README.md index acbf6d63d050..63c8fb01642f 100644 --- a/instrumentation/java-http-server/library/README.md +++ b/instrumentation/java-http-server/library/README.md @@ -55,9 +55,9 @@ public class Application { // http logic }); - OpenTelemetry otel = //... - - context.getFilters().add(JavaHttpServerTelemetry.create(otel).newFilter()); + OpenTelemetry openTelemetry = //... + + JavaHttpServerTelemetry.create(openTelemetry).configure(context); } } ``` diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTelemetry.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTelemetry.java index 3baff5bac566..818d9fa42ac6 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTelemetry.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTelemetry.java @@ -6,6 +6,7 @@ package io.opentelemetry.instrumentation.httpserver; import com.sun.net.httpserver.Filter; +import com.sun.net.httpserver.HttpContext; import com.sun.net.httpserver.HttpExchange; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; @@ -34,4 +35,9 @@ public static JavaHttpServerTelemetryBuilder builder(OpenTelemetry openTelemetry public Filter newFilter() { return new OpenTelemetryFilter(instrumenter); } + + /** Configures the {@link HttpContext} with OpenTelemetry. */ + public void configure(HttpContext httpContext) { + httpContext.getFilters().add(0, newFilter()); + } } diff --git a/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTest.java b/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTest.java index 7185a6ad97b4..981523b35250 100644 --- a/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTest.java +++ b/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTest.java @@ -6,10 +6,12 @@ package io.opentelemetry.instrumentation.httpserver; import com.sun.net.httpserver.Filter; +import com.sun.net.httpserver.HttpContext; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; import java.util.Collections; +import java.util.List; import org.junit.jupiter.api.extension.RegisterExtension; class JavaHttpServerTest extends AbstractJavaHttpServerTest { @@ -18,13 +20,15 @@ class JavaHttpServerTest extends AbstractJavaHttpServerTest { static final InstrumentationExtension testing = HttpServerInstrumentationExtension.forLibrary(); @Override - protected Filter customFilter() { - return JavaHttpServerTelemetry.builder(testing.getOpenTelemetry()) - .setCapturedRequestHeaders( - Collections.singletonList(AbstractHttpServerTest.TEST_REQUEST_HEADER)) - .setCapturedResponseHeaders( - Collections.singletonList(AbstractHttpServerTest.TEST_RESPONSE_HEADER)) - .build() - .newFilter(); + protected void configureContexts(List contexts) { + Filter filter = + JavaHttpServerTelemetry.builder(testing.getOpenTelemetry()) + .setCapturedRequestHeaders( + Collections.singletonList(AbstractHttpServerTest.TEST_REQUEST_HEADER)) + .setCapturedResponseHeaders( + Collections.singletonList(AbstractHttpServerTest.TEST_RESPONSE_HEADER)) + .build() + .newFilter(); + contexts.forEach(ctx -> ctx.getFilters().add(filter)); } } diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJavaHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJavaHttpServerTest.java index 6fe31489921c..3c7b8187d54b 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJavaHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJavaHttpServerTest.java @@ -7,17 +7,16 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD; -import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.PATH_PARAM; +import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.NOT_FOUND; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; -import com.sun.net.httpserver.Filter; import com.sun.net.httpserver.HttpContext; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpServer; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import io.opentelemetry.testing.internal.armeria.common.QueryParams; @@ -33,9 +32,7 @@ public abstract class AbstractJavaHttpServerTest extends AbstractHttpServerTest { - protected Filter customFilter() { - return null; - } + protected void configureContexts(List contexts) {} static void sendResponse(HttpExchange exchange, int status, String response) throws IOException { sendResponse(exchange, status, Collections.emptyMap(), response); @@ -56,9 +53,13 @@ static void sendResponse( long contentLength = bytes.length == 0 ? -1 : bytes.length; exchange.getResponseHeaders().set("Content-Type", "text/plain"); headers.forEach(exchange.getResponseHeaders()::set); - try (OutputStream os = exchange.getResponseBody()) { - exchange.sendResponseHeaders(status, contentLength); - os.write(bytes); + exchange.sendResponseHeaders(status, contentLength); + if (bytes.length != 0) { + try (OutputStream os = exchange.getResponseBody()) { + os.write(bytes); + } + } else { + exchange.getResponseBody().close(); } } @@ -107,7 +108,7 @@ protected HttpServer setupServer() throws IOException { contexts.add(context); context = server.createContext( - "/query", + QUERY_PARAM.getPath(), ctx -> testing() .runWithSpan( @@ -121,15 +122,7 @@ protected HttpServer setupServer() throws IOException { contexts.add(context); context = server.createContext( - "/path/:id/param", - ctx -> - testing() - .runWithSpan( - "controller", () -> sendResponse(ctx, PATH_PARAM.getStatus(), "id"))); - contexts.add(context); - context = - server.createContext( - "/child", + INDEXED_CHILD.getPath(), ctx -> testing() .runWithSpan( @@ -156,17 +149,25 @@ protected HttpServer setupServer() throws IOException { "X-Test-Response", ctx.getRequestHeaders().getFirst("X-Test-Request")), CAPTURE_HEADERS.getBody()))); - + contexts.add(context); + context = + server.createContext( + EXCEPTION.getPath(), + ctx -> + testing() + .runWithSpan( + "controller", + () -> { + sendResponse(ctx, EXCEPTION.getStatus(), EXCEPTION.getBody()); + throw new IllegalStateException(EXCEPTION.getBody()); + })); + contexts.add(context); + context = + server.createContext( + "/", ctx -> sendResponse(ctx, NOT_FOUND.getStatus(), NOT_FOUND.getBody())); contexts.add(context); - Filter customFilter = customFilter(); - if (customFilter != null) { - contexts.forEach(ctx -> ctx.getFilters().add(customFilter)); - } - - // Make sure user decorators see spans. - Filter spanFilter = new SpanFilter(); - contexts.forEach(ctx -> ctx.getFilters().add(spanFilter)); + configureContexts(contexts); server.start(); return server; @@ -179,39 +180,16 @@ protected void stopServer(HttpServer server) { @Override protected void configure(HttpServerTestOptions options) { - options.setTestNotFound(false); - options.setTestPathParam(false); - options.setTestException(false); // filter isn't called for non-standard method options.disableTestNonStandardHttpMethod(); options.setTestHttpPipelining( Double.parseDouble(System.getProperty("java.specification.version")) >= 21); - } - - static class SpanFilter extends Filter { - - @Override - public void doFilter(HttpExchange exchange, Chain chain) throws IOException { - if (!Span.current().getSpanContext().isValid()) { - // Return an invalid code to fail any assertion - exchange.sendResponseHeaders(601, -1); - } - - try { - chain.doFilter(exchange); - } catch (Exception e) { - sendResponse(exchange, 500, e.getMessage()); - } - - if (exchange.getResponseCode() == -1) { - - sendResponse(exchange, 500, "nothing"); - } - } - - @Override - public String description() { - return "test"; - } + options.setExpectedHttpRoute( + (endpoint, method) -> { + if (NOT_FOUND.equals(endpoint)) { + return "/"; + } + return expectedHttpRoute(endpoint, method); + }); } } From dd43a41a90279d89a1774cef0d8c5376d34f076f Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Thu, 13 Feb 2025 15:31:11 +0200 Subject: [PATCH 26/30] spotless --- instrumentation/java-http-server/library/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/java-http-server/library/README.md b/instrumentation/java-http-server/library/README.md index 63c8fb01642f..c4d6d9382dc8 100644 --- a/instrumentation/java-http-server/library/README.md +++ b/instrumentation/java-http-server/library/README.md @@ -56,7 +56,7 @@ public class Application { }); OpenTelemetry openTelemetry = //... - + JavaHttpServerTelemetry.create(openTelemetry).configure(context); } } From a46b078d6433bdebc56016e27397afe0615009a3 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Thu, 13 Feb 2025 19:07:47 +0200 Subject: [PATCH 27/30] reformat table --- docs/supported-libraries.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/supported-libraries.md b/docs/supported-libraries.md index 2a3b6a3382f2..fb4c4f762325 100644 --- a/docs/supported-libraries.md +++ b/docs/supported-libraries.md @@ -80,7 +80,7 @@ These are the supported libraries and frameworks: | [InfluxDB Client](https://github.com/influxdata/influxdb-java) | 2.4+ | N/A | [Database Client Spans], [Database Client Metrics] [6] | | [Java Executors](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executor.html) | Java 8+ | N/A | Context propagation | | [Java Http Client](https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/package-summary.html) | Java 11+ | [opentelemetry-java-http-client](../instrumentation/java-http-client/library) | [HTTP Client Spans], [HTTP Client Metrics] | -| [Java Http Server](https://docs.oracle.com/en/java/javase/21/docs/api/jdk.httpserver/module-summary.html) | Java 8+ | [opentelemetry-java-http-server](../instrumentation/java-http-server/library) | [HTTP Server Spans], [HTTP Server Metrics] | +| [Java Http Server](https://docs.oracle.com/en/java/javase/21/docs/api/jdk.httpserver/module-summary.html) | Java 8+ | [opentelemetry-java-http-server](../instrumentation/java-http-server/library) | [HTTP Server Spans], [HTTP Server Metrics] | | [java.util.logging](https://docs.oracle.com/javase/8/docs/api/java/util/logging/package-summary.html) | Java 8+ | N/A | none | | [Java Platform](https://docs.oracle.com/javase/8/docs/api/java/lang/management/ManagementFactory.html) | Java 8+ | [opentelemetry-runtime-telemetry-java8](../instrumentation/runtime-telemetry/runtime-telemetry-java8/library),
[opentelemetry-runtime-telemetry-java17](../instrumentation/runtime-telemetry/runtime-telemetry-java17/library),
[opentelemetry-resources](../instrumentation/resources/library) | [JVM Runtime Metrics] | | [Javalin](https://javalin.io/) | 5.0+ | N/A | Provides `http.route` [2] | From f6b556a4f172a1ab4e66dc85b9ca9c03a5e0cd76 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Thu, 13 Feb 2025 19:12:57 +0200 Subject: [PATCH 28/30] enable response customizer test --- .../instrumentation/httpserver/JavaHttpServerTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerTest.java b/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerTest.java index 14b624ec6415..803e8239fc67 100644 --- a/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerTest.java +++ b/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerTest.java @@ -8,10 +8,18 @@ import io.opentelemetry.instrumentation.httpserver.AbstractJavaHttpServerTest; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import org.junit.jupiter.api.extension.RegisterExtension; class JavaHttpServerTest extends AbstractJavaHttpServerTest { @RegisterExtension static final InstrumentationExtension testing = HttpServerInstrumentationExtension.forAgent(); + + @Override + protected void configure(HttpServerTestOptions options) { + super.configure(options); + + options.setHasResponseCustomizer(serverEndpoint -> true); + } } From a42e07e32a00d062decdb05c15e077883b94ee49 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Thu, 13 Feb 2025 20:53:55 -0500 Subject: [PATCH 29/30] package change --- .../HttpServerInstrumentation.java | 2 +- .../JavaHttpServerInstrumentationModule.java | 2 +- .../JavaHttpServerResponseMutator.java | 2 +- .../JavaHttpServerSingletons.java | 8 ++++---- .../ResponseCustomizingFilter.java | 2 +- .../JavaHttpServerTest.java | 4 ++-- .../JavaHttpServerAttributesGetter.java | 2 +- .../JavaHttpServerExchangeGetter.java | 2 +- .../JavaHttpServerTelemetry.java | 2 +- .../JavaHttpServerTelemetryBuilder.java | 7 ++++--- .../OpenTelemetryFilter.java | 2 +- .../internal/Experimental.java | 5 +++-- .../internal/JavaHttpServerInstrumenterBuilderUtil.java | 5 +++-- .../JavaHttpServerTest.java | 2 +- .../AbstractJavaHttpServerTest.java | 2 +- 15 files changed, 26 insertions(+), 23 deletions(-) rename instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/{httpserver => javahttpserver}/HttpServerInstrumentation.java (95%) rename instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/{httpserver => javahttpserver}/JavaHttpServerInstrumentationModule.java (91%) rename instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/{httpserver => javahttpserver}/JavaHttpServerResponseMutator.java (86%) rename instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/{httpserver => javahttpserver}/JavaHttpServerSingletons.java (74%) rename instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/{httpserver => javahttpserver}/ResponseCustomizingFilter.java (92%) rename instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/{httpserver => javahttpserver}/JavaHttpServerTest.java (83%) rename instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/{httpserver => javahttpserver}/JavaHttpServerAttributesGetter.java (97%) rename instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/{httpserver => javahttpserver}/JavaHttpServerExchangeGetter.java (95%) rename instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/{httpserver => javahttpserver}/JavaHttpServerTelemetry.java (95%) rename instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/{httpserver => javahttpserver}/JavaHttpServerTelemetryBuilder.java (94%) rename instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/{httpserver => javahttpserver}/OpenTelemetryFilter.java (96%) rename instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/{httpserver => javahttpserver}/internal/Experimental.java (87%) rename instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/{httpserver => javahttpserver}/internal/JavaHttpServerInstrumenterBuilderUtil.java (89%) rename instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/{httpserver => javahttpserver}/JavaHttpServerTest.java (95%) rename instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/{httpserver => javahttpserver}/AbstractJavaHttpServerTest.java (99%) diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/HttpServerInstrumentation.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/HttpServerInstrumentation.java similarity index 95% rename from instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/HttpServerInstrumentation.java rename to instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/HttpServerInstrumentation.java index af681fc31b68..f1dc68a5914f 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/HttpServerInstrumentation.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/HttpServerInstrumentation.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.httpserver; +package io.opentelemetry.javaagent.instrumentation.javahttpserver; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.extendsClass; import static net.bytebuddy.matcher.ElementMatchers.isMethod; diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerInstrumentationModule.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerInstrumentationModule.java similarity index 91% rename from instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerInstrumentationModule.java rename to instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerInstrumentationModule.java index 205615c4794b..dba7a7723305 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerInstrumentationModule.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerInstrumentationModule.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.httpserver; +package io.opentelemetry.javaagent.instrumentation.javahttpserver; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerResponseMutator.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerResponseMutator.java similarity index 86% rename from instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerResponseMutator.java rename to instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerResponseMutator.java index 659d1c273c13..c212eaeadec7 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerResponseMutator.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerResponseMutator.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.httpserver; +package io.opentelemetry.javaagent.instrumentation.javahttpserver; import com.sun.net.httpserver.Headers; import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseMutator; diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerSingletons.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerSingletons.java similarity index 74% rename from instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerSingletons.java rename to instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerSingletons.java index 4a3253da98de..997b325f6410 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerSingletons.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerSingletons.java @@ -3,14 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.httpserver; +package io.opentelemetry.javaagent.instrumentation.javahttpserver; import com.sun.net.httpserver.Filter; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig; -import io.opentelemetry.instrumentation.httpserver.JavaHttpServerTelemetry; -import io.opentelemetry.instrumentation.httpserver.JavaHttpServerTelemetryBuilder; -import io.opentelemetry.instrumentation.httpserver.internal.JavaHttpServerInstrumenterBuilderUtil; +import io.opentelemetry.instrumentation.javahttpserver.JavaHttpServerTelemetry; +import io.opentelemetry.instrumentation.javahttpserver.JavaHttpServerTelemetryBuilder; +import io.opentelemetry.instrumentation.javahttpserver.internal.JavaHttpServerInstrumenterBuilderUtil; import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import java.util.Arrays; import java.util.List; diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/ResponseCustomizingFilter.java similarity index 92% rename from instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java rename to instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/ResponseCustomizingFilter.java index 40e623b2fd9f..867e5b9ba7ec 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpserver/ResponseCustomizingFilter.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/ResponseCustomizingFilter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.httpserver; +package io.opentelemetry.javaagent.instrumentation.javahttpserver; import com.sun.net.httpserver.Filter; import com.sun.net.httpserver.HttpExchange; diff --git a/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerTest.java b/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerTest.java similarity index 83% rename from instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerTest.java rename to instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerTest.java index 803e8239fc67..445b4d0bc07a 100644 --- a/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/httpserver/JavaHttpServerTest.java +++ b/instrumentation/java-http-server/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerTest.java @@ -3,9 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.httpserver; +package io.opentelemetry.javaagent.instrumentation.javahttpserver; -import io.opentelemetry.instrumentation.httpserver.AbstractJavaHttpServerTest; +import io.opentelemetry.instrumentation.javahttpserver.AbstractJavaHttpServerTest; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerAttributesGetter.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerAttributesGetter.java similarity index 97% rename from instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerAttributesGetter.java rename to instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerAttributesGetter.java index 1d336ba102d3..c742fe99f857 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerAttributesGetter.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerAttributesGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpserver; +package io.opentelemetry.instrumentation.javahttpserver; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpsExchange; diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerExchangeGetter.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerExchangeGetter.java similarity index 95% rename from instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerExchangeGetter.java rename to instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerExchangeGetter.java index 4a51603681ef..2987258112fa 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerExchangeGetter.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerExchangeGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpserver; +package io.opentelemetry.instrumentation.javahttpserver; import com.sun.net.httpserver.HttpExchange; import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter; diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTelemetry.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerTelemetry.java similarity index 95% rename from instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTelemetry.java rename to instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerTelemetry.java index 818d9fa42ac6..6595f553d8cf 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTelemetry.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerTelemetry.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpserver; +package io.opentelemetry.instrumentation.javahttpserver; import com.sun.net.httpserver.Filter; import com.sun.net.httpserver.HttpContext; diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTelemetryBuilder.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerTelemetryBuilder.java similarity index 94% rename from instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTelemetryBuilder.java rename to instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerTelemetryBuilder.java index f10b2d61a41e..1a5ce438d085 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTelemetryBuilder.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerTelemetryBuilder.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpserver; +package io.opentelemetry.instrumentation.javahttpserver; import com.google.errorprone.annotations.CanIgnoreReturnValue; import com.sun.net.httpserver.HttpExchange; @@ -13,8 +13,9 @@ import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor; import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder; -import io.opentelemetry.instrumentation.httpserver.internal.Experimental; -import io.opentelemetry.instrumentation.httpserver.internal.JavaHttpServerInstrumenterBuilderUtil; +import io.opentelemetry.instrumentation.javahttpserver.internal.Experimental; +import io.opentelemetry.instrumentation.javahttpserver.internal.JavaHttpServerInstrumenterBuilderUtil; + import java.util.Collection; import java.util.function.Function; diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryFilter.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/OpenTelemetryFilter.java similarity index 96% rename from instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryFilter.java rename to instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/OpenTelemetryFilter.java index 84dc26adffca..83d6968e73ca 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/OpenTelemetryFilter.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/OpenTelemetryFilter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpserver; +package io.opentelemetry.instrumentation.javahttpserver; import com.sun.net.httpserver.Filter; import com.sun.net.httpserver.HttpExchange; diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/Experimental.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/Experimental.java similarity index 87% rename from instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/Experimental.java rename to instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/Experimental.java index f96b70a5af5f..8e0f6b71d833 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/Experimental.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/Experimental.java @@ -3,12 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpserver.internal; +package io.opentelemetry.instrumentation.javahttpserver.internal; -import io.opentelemetry.instrumentation.httpserver.JavaHttpServerTelemetryBuilder; import java.util.function.BiConsumer; import javax.annotation.Nullable; +import io.opentelemetry.instrumentation.javahttpserver.JavaHttpServerTelemetryBuilder; + /** * 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 diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaHttpServerInstrumenterBuilderUtil.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/JavaHttpServerInstrumenterBuilderUtil.java similarity index 89% rename from instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaHttpServerInstrumenterBuilderUtil.java rename to instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/JavaHttpServerInstrumenterBuilderUtil.java index 8914cdeb8ff0..dcc53a5d988f 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/httpserver/internal/JavaHttpServerInstrumenterBuilderUtil.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/JavaHttpServerInstrumenterBuilderUtil.java @@ -3,11 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpserver.internal; +package io.opentelemetry.instrumentation.javahttpserver.internal; import com.sun.net.httpserver.HttpExchange; import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; -import io.opentelemetry.instrumentation.httpserver.JavaHttpServerTelemetryBuilder; +import io.opentelemetry.instrumentation.javahttpserver.JavaHttpServerTelemetryBuilder; + import java.util.function.Function; import javax.annotation.Nullable; diff --git a/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTest.java b/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerTest.java similarity index 95% rename from instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTest.java rename to instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerTest.java index 981523b35250..92e08aeced2a 100644 --- a/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/httpserver/JavaHttpServerTest.java +++ b/instrumentation/java-http-server/library/src/test/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpserver; +package io.opentelemetry.instrumentation.javahttpserver; import com.sun.net.httpserver.Filter; import com.sun.net.httpserver.HttpContext; diff --git a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJavaHttpServerTest.java b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/javahttpserver/AbstractJavaHttpServerTest.java similarity index 99% rename from instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJavaHttpServerTest.java rename to instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/javahttpserver/AbstractJavaHttpServerTest.java index 3c7b8187d54b..2876bf7479d8 100644 --- a/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/httpserver/AbstractJavaHttpServerTest.java +++ b/instrumentation/java-http-server/testing/src/main/java/io/opentelemetry/instrumentation/javahttpserver/AbstractJavaHttpServerTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.httpserver; +package io.opentelemetry.instrumentation.javahttpserver; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR; From f78ec08d6f6335696a24e8e6743b27d87c00d72a Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 14 Feb 2025 00:42:02 -0500 Subject: [PATCH 30/30] static imports --- .../JavaHttpServerInstrumentationModule.java | 5 +++-- .../javahttpserver/ResponseCustomizingFilter.java | 2 +- .../javahttpserver/JavaHttpServerExchangeGetter.java | 10 ++++++---- .../javahttpserver/JavaHttpServerTelemetryBuilder.java | 1 - .../javahttpserver/internal/Experimental.java | 3 +-- .../JavaHttpServerInstrumenterBuilderUtil.java | 1 - 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerInstrumentationModule.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerInstrumentationModule.java index dba7a7723305..9d25ca807c3a 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerInstrumentationModule.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/JavaHttpServerInstrumentationModule.java @@ -5,10 +5,11 @@ package io.opentelemetry.javaagent.instrumentation.javahttpserver; +import static java.util.Collections.singletonList; + import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; -import java.util.Collections; import java.util.List; @AutoService(InstrumentationModule.class) @@ -19,6 +20,6 @@ public JavaHttpServerInstrumentationModule() { @Override public List typeInstrumentations() { - return Collections.singletonList(new HttpServerInstrumentation()); + return singletonList(new HttpServerInstrumentation()); } } diff --git a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/ResponseCustomizingFilter.java b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/ResponseCustomizingFilter.java index 867e5b9ba7ec..41db8046c129 100644 --- a/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/ResponseCustomizingFilter.java +++ b/instrumentation/java-http-server/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpserver/ResponseCustomizingFilter.java @@ -11,7 +11,7 @@ import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseCustomizerHolder; import java.io.IOException; -class ResponseCustomizingFilter extends Filter { +final class ResponseCustomizingFilter extends Filter { ResponseCustomizingFilter() {} diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerExchangeGetter.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerExchangeGetter.java index 2987258112fa..1a573b60f1d5 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerExchangeGetter.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerExchangeGetter.java @@ -5,9 +5,11 @@ package io.opentelemetry.instrumentation.javahttpserver; +import static java.util.Collections.emptyIterator; +import static java.util.Collections.emptyList; + import com.sun.net.httpserver.HttpExchange; import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter; -import java.util.Collections; import java.util.Iterator; import java.util.List; import javax.annotation.Nullable; @@ -18,7 +20,7 @@ enum JavaHttpServerExchangeGetter implements ExtendedTextMapGetter @Override public Iterable keys(@Nullable HttpExchange exchange) { if (exchange == null) { - return Collections.emptyList(); + return emptyList(); } return exchange.getRequestHeaders().keySet(); } @@ -37,10 +39,10 @@ public String get(@Nullable HttpExchange carrier, String key) { @Override public Iterator getAll(@Nullable HttpExchange carrier, String key) { if (carrier == null) { - return Collections.emptyIterator(); + return emptyIterator(); } List list = carrier.getRequestHeaders().get(key); - return list != null ? list.iterator() : Collections.emptyIterator(); + return list != null ? list.iterator() : emptyIterator(); } } diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerTelemetryBuilder.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerTelemetryBuilder.java index 1a5ce438d085..ec2462e6c59b 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerTelemetryBuilder.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/JavaHttpServerTelemetryBuilder.java @@ -15,7 +15,6 @@ import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder; import io.opentelemetry.instrumentation.javahttpserver.internal.Experimental; import io.opentelemetry.instrumentation.javahttpserver.internal.JavaHttpServerInstrumenterBuilderUtil; - import java.util.Collection; import java.util.function.Function; diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/Experimental.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/Experimental.java index 8e0f6b71d833..bd6bf037ad24 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/Experimental.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/Experimental.java @@ -5,11 +5,10 @@ package io.opentelemetry.instrumentation.javahttpserver.internal; +import io.opentelemetry.instrumentation.javahttpserver.JavaHttpServerTelemetryBuilder; import java.util.function.BiConsumer; import javax.annotation.Nullable; -import io.opentelemetry.instrumentation.javahttpserver.JavaHttpServerTelemetryBuilder; - /** * 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 diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/JavaHttpServerInstrumenterBuilderUtil.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/JavaHttpServerInstrumenterBuilderUtil.java index dcc53a5d988f..3232411599a0 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/JavaHttpServerInstrumenterBuilderUtil.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/JavaHttpServerInstrumenterBuilderUtil.java @@ -8,7 +8,6 @@ import com.sun.net.httpserver.HttpExchange; import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder; import io.opentelemetry.instrumentation.javahttpserver.JavaHttpServerTelemetryBuilder; - import java.util.function.Function; import javax.annotation.Nullable;