diff --git a/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionInstrumentation.java b/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionInstrumentation.java index c4bb4c17ea..f02bb0f7fa 100644 --- a/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionInstrumentation.java +++ b/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionInstrumentation.java @@ -7,7 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.httpurlconnection; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.extendsClass; import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; -import static io.opentelemetry.javaagent.instrumentation.httpurlconnection.HttpUrlConnectionTracer.tracer; +import static io.opentelemetry.javaagent.instrumentation.httpurlconnection.HttpUrlConnectionSingletons.instrumenter; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; @@ -76,7 +76,7 @@ public class HttpUrlConnectionInstrumentation implements TypeInstrumentation { return; } Context parentContext = currentContext(); - if (!tracer().shouldStartSpan(parentContext)) { + if (!instrumenter().shouldStart(parentContext, connection)) { return; } @@ -94,7 +94,7 @@ public class HttpUrlConnectionInstrumentation implements TypeInstrumentation { return; } - Context context = tracer().startSpan(parentContext, connection); + Context context = instrumenter().start(parentContext, connection); httpUrlState = new HttpUrlState(context); storage.put(connection, httpUrlState); scope = context.makeCurrent(); @@ -122,16 +122,16 @@ public class HttpUrlConnectionInstrumentation implements TypeInstrumentation { // HttpURLConnection unnecessarily throws exception on error response. // None of the other http clients do this, so not recording the exception on the span // to be consistent with the telemetry for other http clients. - tracer().end(httpUrlState.context, new HttpUrlResponse(connection, responseCode)); + instrumenter().end(httpUrlState.context, connection, responseCode, null); } else { - tracer().endExceptionally(httpUrlState.context, throwable); + instrumenter().end(httpUrlState.context, connection, null, throwable); } httpUrlState.finished = true; } else if (methodName.equals("getInputStream") && responseCode > 0) { // responseCode field is sometimes not populated. // We can't call getResponseCode() due to some unwanted side-effects // (e.g. breaks getOutputStream). - tracer().end(httpUrlState.context, new HttpUrlResponse(connection, responseCode)); + instrumenter().end(httpUrlState.context, connection, responseCode, null); httpUrlState.finished = true; } } diff --git a/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionSingletons.java b/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionSingletons.java new file mode 100644 index 0000000000..dc24911129 --- /dev/null +++ b/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionSingletons.java @@ -0,0 +1,41 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.httpurlconnection; + +import static io.opentelemetry.javaagent.instrumentation.httpurlconnection.HeadersInjectAdapter.SETTER; + +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; +import io.opentelemetry.javaagent.instrumentation.api.instrumenter.PeerServiceAttributesExtractor; +import java.net.HttpURLConnection; + +public class HttpUrlConnectionSingletons { + + private static final Instrumenter INSTRUMENTER; + + static { + HttpUrlHttpAttributesExtractor httpAttributesExtractor = new HttpUrlHttpAttributesExtractor(); + HttpUrlNetAttributesExtractor netAttributesExtractor = new HttpUrlNetAttributesExtractor(); + SpanNameExtractor spanNameExtractor = + HttpSpanNameExtractor.create(httpAttributesExtractor); + + INSTRUMENTER = + Instrumenter.newBuilder( + GlobalOpenTelemetry.get(), + "io.opentelemetry.http-url-connection", + spanNameExtractor) + .addAttributesExtractor(httpAttributesExtractor) + .addAttributesExtractor(netAttributesExtractor) + .addAttributesExtractor(PeerServiceAttributesExtractor.create(netAttributesExtractor)) + .newClientInstrumenter(SETTER); + } + + public static Instrumenter instrumenter() { + return INSTRUMENTER; + } +} diff --git a/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionTracer.java b/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionTracer.java deleted file mode 100644 index 13dde169a3..0000000000 --- a/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlConnectionTracer.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.httpurlconnection; - -import static io.opentelemetry.javaagent.instrumentation.httpurlconnection.HeadersInjectAdapter.SETTER; - -import io.opentelemetry.context.Context; -import io.opentelemetry.context.propagation.TextMapSetter; -import io.opentelemetry.instrumentation.api.tracer.HttpClientTracer; -import io.opentelemetry.instrumentation.api.tracer.net.NetPeerAttributes; -import java.net.HttpURLConnection; -import java.net.URI; -import java.net.URISyntaxException; - -public class HttpUrlConnectionTracer - extends HttpClientTracer { - - private static final HttpUrlConnectionTracer TRACER = new HttpUrlConnectionTracer(); - - private HttpUrlConnectionTracer() { - super(NetPeerAttributes.INSTANCE); - } - - public static HttpUrlConnectionTracer tracer() { - return TRACER; - } - - public Context startSpan(Context parentContext, HttpURLConnection request) { - return super.startSpan(parentContext, request, request); - } - - @Override - protected String method(HttpURLConnection connection) { - return connection.getRequestMethod(); - } - - @Override - protected URI url(HttpURLConnection connection) throws URISyntaxException { - return connection.getURL().toURI(); - } - - @Override - protected Integer status(HttpUrlResponse response) { - return response.status(); - } - - @Override - protected String requestHeader(HttpURLConnection httpUrlConnection, String name) { - return httpUrlConnection.getRequestProperty(name); - } - - @Override - protected String responseHeader(HttpUrlResponse response, String name) { - return response.header(name); - } - - @Override - protected TextMapSetter getSetter() { - return SETTER; - } - - @Override - protected String getInstrumentationName() { - return "io.opentelemetry.http-url-connection"; - } -} diff --git a/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlHttpAttributesExtractor.java b/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlHttpAttributesExtractor.java new file mode 100644 index 0000000000..b773dc33c9 --- /dev/null +++ b/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlHttpAttributesExtractor.java @@ -0,0 +1,87 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.httpurlconnection; + +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpAttributesExtractor; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import java.net.HttpURLConnection; +import org.checkerframework.checker.nullness.qual.Nullable; + +class HttpUrlHttpAttributesExtractor extends HttpAttributesExtractor { + @Override + protected String method(HttpURLConnection connection) { + return connection.getRequestMethod(); + } + + @Override + protected String url(HttpURLConnection connection) { + return connection.getURL().toExternalForm(); + } + + @Override + protected @Nullable String target(HttpURLConnection connection) { + return null; + } + + @Override + protected @Nullable String host(HttpURLConnection connection) { + return null; + } + + @Override + protected @Nullable String route(HttpURLConnection connection) { + return null; + } + + @Override + protected @Nullable String scheme(HttpURLConnection connection) { + return null; + } + + @Override + protected @Nullable String userAgent(HttpURLConnection connection) { + return connection.getRequestProperty("User-Agent"); + } + + @Override + protected @Nullable Long requestContentLength( + HttpURLConnection connection, @Nullable Integer statusCode) { + return null; + } + + @Override + protected @Nullable Long requestContentLengthUncompressed( + HttpURLConnection connection, @Nullable Integer response) { + return null; + } + + @Override + protected String flavor(HttpURLConnection connection, @Nullable Integer statusCode) { + return SemanticAttributes.HttpFlavorValues.HTTP_1_1; + } + + @Override + protected @Nullable String serverName( + HttpURLConnection connection, @Nullable Integer statusCode) { + return null; + } + + @Override + protected Integer statusCode(HttpURLConnection connection, Integer statusCode) { + return statusCode; + } + + @Override + protected @Nullable Long responseContentLength(HttpURLConnection connection, Integer statusCode) { + return null; + } + + @Override + protected @Nullable Long responseContentLengthUncompressed( + HttpURLConnection connection, Integer statusCode) { + return null; + } +} diff --git a/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlNetAttributesExtractor.java b/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlNetAttributesExtractor.java new file mode 100644 index 0000000000..e9e8cc73da --- /dev/null +++ b/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlNetAttributesExtractor.java @@ -0,0 +1,33 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.httpurlconnection; + +import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import java.net.HttpURLConnection; +import org.checkerframework.checker.nullness.qual.Nullable; + +class HttpUrlNetAttributesExtractor extends NetAttributesExtractor { + @Override + public @Nullable String transport(HttpURLConnection connection) { + return SemanticAttributes.NetTransportValues.IP_TCP; + } + + @Override + public String peerName(HttpURLConnection connection, @Nullable Integer statusCode) { + return connection.getURL().getHost(); + } + + @Override + public Integer peerPort(HttpURLConnection connection, @Nullable Integer statusCode) { + return connection.getURL().getPort(); + } + + @Override + public @Nullable String peerIp(HttpURLConnection connection, @Nullable Integer statusCode) { + return null; + } +} diff --git a/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlResponse.java b/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlResponse.java deleted file mode 100644 index 53705d7524..0000000000 --- a/instrumentation/http-url-connection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpurlconnection/HttpUrlResponse.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.httpurlconnection; - -import java.net.HttpURLConnection; - -public class HttpUrlResponse { - private final HttpURLConnection connection; - private final int resolvedResponseCode; - - public HttpUrlResponse(HttpURLConnection connection, int resolvedResponseCode) { - this.connection = connection; - this.resolvedResponseCode = resolvedResponseCode; - } - - int status() { - return resolvedResponseCode; - } - - String header(String name) { - return connection.getHeaderField(name); - } -}