From 5f516e0a6e4ecb2b7ef7afeda56aac5282b691f7 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Wed, 19 Oct 2022 09:21:50 -0700 Subject: [PATCH] Capture net.host.name for netty (#6892) This may be a regression in 1.19.0 because you can no longer reconstruct the original url for netty server spans (previously `http.host` was captured which could be used). --- .../http/HttpServerAttributesExtractor.java | 37 ++++-- .../HttpServerAttributesExtractorBuilder.java | 13 +- .../net/NetServerAttributesExtractor.java | 49 +------ .../InternalNetServerAttributesExtractor.java | 95 +++++++++++++ .../HttpServerAttributesExtractorTest.java | 125 ++++++++++++++---- .../server/AkkaHttpServerSingletons.java | 3 +- .../server/AkkaNetServerAttributesGetter.java | 32 +++++ ...bstractHttpServerInstrumentationTest.scala | 2 - .../armeria/v1_3/ArmeriaTelemetryBuilder.java | 6 +- .../grizzly/GrizzlySingletons.java | 4 +- .../ktor/v1_0/KtorServerTracing.kt | 4 +- .../ktor/v2_0/KtorServerTracing.kt | 4 +- .../LibertyDispatcherSingletons.java | 4 +- .../v3_8/server/NettyServerSingletons.java | 6 +- .../NettyServerInstrumenterFactory.java | 6 +- .../testing/AgentSpanTestingInstrumenter.java | 3 +- .../MockNetServerAttributesGetter.java | 32 +++++ .../ratpack/RatpackTelemetryBuilder.java | 6 +- .../restlet/v1_1/RestletTelemetryBuilder.java | 6 +- .../restlet/v2_0/RestletSingletons.java | 4 +- .../restlet/v2_0/RestletTelemetryBuilder.java | 4 +- .../internal/RestletInstrumenterFactory.java | 3 - .../internal/RestletNetAttributesGetter.java | 6 +- .../servlet/ServletInstrumenterBuilder.java | 4 +- .../src/test/groovy/SpringWebfluxTest.groovy | 27 ++-- .../v5_3/SpringWebMvcTelemetryBuilder.java | 6 +- .../common/TomcatInstrumenterFactory.java | 4 +- .../undertow/UndertowSingletons.java | 4 +- .../VertxReactivePropagationTest.groovy | 6 +- .../VertxReactivePropagationTest.groovy | 6 +- .../junit/http/AbstractHttpServerTest.java | 4 +- 31 files changed, 357 insertions(+), 158 deletions(-) create mode 100644 instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/internal/InternalNetServerAttributesExtractor.java create mode 100644 instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaNetServerAttributesGetter.java create mode 100644 instrumentation/opentelemetry-instrumentation-api/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/testing/MockNetServerAttributesGetter.java diff --git a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractor.java b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractor.java index 2e302c42729a..7b23a3fa3757 100644 --- a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractor.java +++ b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractor.java @@ -13,6 +13,8 @@ import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesGetter; +import io.opentelemetry.instrumentation.api.instrumenter.net.internal.InternalNetServerAttributesExtractor; import io.opentelemetry.instrumentation.api.internal.SpanKey; import io.opentelemetry.instrumentation.api.internal.SpanKeyProvider; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; @@ -36,8 +38,9 @@ public final class HttpServerAttributesExtractor /** Creates the HTTP server attributes extractor with default configuration. */ public static HttpServerAttributesExtractor create( - HttpServerAttributesGetter getter) { - return builder(getter).build(); + HttpServerAttributesGetter httpAttributesGetter, + NetServerAttributesGetter netAttributesGetter) { + return builder(httpAttributesGetter, netAttributesGetter).build(); } /** @@ -45,26 +48,36 @@ public static HttpServerAttributesExtractor HttpServerAttributesExtractorBuilder builder( - HttpServerAttributesGetter getter) { - return new HttpServerAttributesExtractorBuilder<>(getter); + HttpServerAttributesGetter httpAttributesGetter, + NetServerAttributesGetter netAttributesGetter) { + return new HttpServerAttributesExtractorBuilder<>(httpAttributesGetter, netAttributesGetter); } + private final NetServerAttributesGetter netAttributesGetter; private final Function httpRouteHolderGetter; HttpServerAttributesExtractor( - HttpServerAttributesGetter getter, + HttpServerAttributesGetter httpAttributesGetter, + NetServerAttributesGetter netAttributesGetter, List capturedRequestHeaders, List capturedResponseHeaders) { - this(getter, capturedRequestHeaders, capturedResponseHeaders, HttpRouteHolder::getRoute); + this( + httpAttributesGetter, + netAttributesGetter, + capturedRequestHeaders, + capturedResponseHeaders, + HttpRouteHolder::getRoute); } // visible for tests HttpServerAttributesExtractor( - HttpServerAttributesGetter getter, + HttpServerAttributesGetter httpAttributesGetter, + NetServerAttributesGetter netAttributesGetter, List capturedRequestHeaders, List responseHeaders, Function httpRouteHolderGetter) { - super(getter, capturedRequestHeaders, responseHeaders); + super(httpAttributesGetter, capturedRequestHeaders, responseHeaders); + this.netAttributesGetter = netAttributesGetter; this.httpRouteHolderGetter = httpRouteHolderGetter; } @@ -79,6 +92,9 @@ public void onStart(AttributesBuilder attributes, Context parentContext, REQUEST internalSet(attributes, SemanticAttributes.HTTP_TARGET, getter.target(request)); internalSet(attributes, SemanticAttributes.HTTP_ROUTE, getter.route(request)); internalSet(attributes, SemanticAttributes.HTTP_CLIENT_IP, clientIp(request)); + + InternalNetServerAttributesExtractor.onStart( + netAttributesGetter, attributes, request, host(request)); } @Override @@ -93,6 +109,11 @@ public void onEnd( internalSet(attributes, SemanticAttributes.HTTP_ROUTE, httpRouteHolderGetter.apply(context)); } + @Nullable + private String host(REQUEST request) { + return firstHeaderValue(getter.requestHeader(request, "host")); + } + @Nullable private String forwardedProto(REQUEST request) { // try Forwarded diff --git a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractorBuilder.java b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractorBuilder.java index 65a2f0fc1abd..12e7bc5b3368 100644 --- a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractorBuilder.java +++ b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractorBuilder.java @@ -8,17 +8,22 @@ import static java.util.Collections.emptyList; import com.google.errorprone.annotations.CanIgnoreReturnValue; +import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesGetter; import java.util.List; /** A builder of {@link HttpServerAttributesExtractor}. */ public final class HttpServerAttributesExtractorBuilder { - final HttpServerAttributesGetter getter; + final HttpServerAttributesGetter httpAttributesGetter; + final NetServerAttributesGetter netAttributesGetter; List capturedRequestHeaders = emptyList(); List capturedResponseHeaders = emptyList(); - HttpServerAttributesExtractorBuilder(HttpServerAttributesGetter getter) { - this.getter = getter; + HttpServerAttributesExtractorBuilder( + HttpServerAttributesGetter httpAttributesGetter, + NetServerAttributesGetter netAttributesGetter) { + this.httpAttributesGetter = httpAttributesGetter; + this.netAttributesGetter = netAttributesGetter; } /** @@ -64,6 +69,6 @@ public HttpServerAttributesExtractorBuilder setCapturedRespon */ public HttpServerAttributesExtractor build() { return new HttpServerAttributesExtractor<>( - getter, capturedRequestHeaders, capturedResponseHeaders); + httpAttributesGetter, netAttributesGetter, capturedRequestHeaders, capturedResponseHeaders); } } diff --git a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetServerAttributesExtractor.java b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetServerAttributesExtractor.java index 9ae5c4ae33e2..0a95d6dbdbd3 100644 --- a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetServerAttributesExtractor.java +++ b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetServerAttributesExtractor.java @@ -5,12 +5,10 @@ package io.opentelemetry.instrumentation.api.instrumenter.net; -import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet; - import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; -import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import io.opentelemetry.instrumentation.api.instrumenter.net.internal.InternalNetServerAttributesExtractor; import javax.annotation.Nullable; /** @@ -35,50 +33,7 @@ private NetServerAttributesExtractor(NetServerAttributesGetter getter) @Override public void onStart(AttributesBuilder attributes, Context parentContext, REQUEST request) { - internalSet(attributes, SemanticAttributes.NET_TRANSPORT, getter.transport(request)); - - boolean setSockFamily = false; - - String sockPeerAddr = getter.sockPeerAddr(request); - if (sockPeerAddr != null) { - setSockFamily = true; - - internalSet(attributes, NetAttributes.NET_SOCK_PEER_ADDR, sockPeerAddr); - - Integer sockPeerPort = getter.sockPeerPort(request); - if (sockPeerPort != null && sockPeerPort > 0) { - internalSet(attributes, NetAttributes.NET_SOCK_PEER_PORT, (long) sockPeerPort); - } - } - - String hostName = getter.hostName(request); - Integer hostPort = getter.hostPort(request); - if (hostName != null) { - internalSet(attributes, SemanticAttributes.NET_HOST_NAME, hostName); - - if (hostPort != null && hostPort > 0) { - internalSet(attributes, SemanticAttributes.NET_HOST_PORT, (long) hostPort); - } - } - - String sockHostAddr = getter.sockHostAddr(request); - if (sockHostAddr != null && !sockHostAddr.equals(hostName)) { - setSockFamily = true; - - internalSet(attributes, NetAttributes.NET_SOCK_HOST_ADDR, sockHostAddr); - - Integer sockHostPort = getter.sockHostPort(request); - if (sockHostPort != null && sockHostPort > 0 && !sockHostPort.equals(hostPort)) { - internalSet(attributes, NetAttributes.NET_SOCK_HOST_PORT, (long) sockHostPort); - } - } - - if (setSockFamily) { - String sockFamily = getter.sockFamily(request); - if (sockFamily != null && !NetAttributes.SOCK_FAMILY_INET.equals(sockFamily)) { - internalSet(attributes, NetAttributes.NET_SOCK_FAMILY, sockFamily); - } - } + InternalNetServerAttributesExtractor.onStart(getter, attributes, request, null); } @Override diff --git a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/internal/InternalNetServerAttributesExtractor.java b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/internal/InternalNetServerAttributesExtractor.java new file mode 100644 index 000000000000..5e1c22f9b738 --- /dev/null +++ b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/internal/InternalNetServerAttributesExtractor.java @@ -0,0 +1,95 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.instrumenter.net.internal; + +import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet; +import static java.util.logging.Level.FINE; + +import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesGetter; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import java.util.logging.Logger; +import javax.annotation.Nullable; + +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +public class InternalNetServerAttributesExtractor { + + private static final Logger logger = + Logger.getLogger(InternalNetServerAttributesExtractor.class.getName()); + + public static void onStart( + NetServerAttributesGetter getter, + AttributesBuilder attributes, + REQUEST request, + @Nullable String hostHeader) { + internalSet(attributes, SemanticAttributes.NET_TRANSPORT, getter.transport(request)); + + boolean setSockFamily = false; + + String sockPeerAddr = getter.sockPeerAddr(request); + if (sockPeerAddr != null) { + setSockFamily = true; + + internalSet(attributes, SemanticAttributes.NET_SOCK_PEER_ADDR, sockPeerAddr); + + Integer sockPeerPort = getter.sockPeerPort(request); + if (sockPeerPort != null && sockPeerPort > 0) { + internalSet(attributes, SemanticAttributes.NET_SOCK_PEER_PORT, (long) sockPeerPort); + } + } + + String hostName = getter.hostName(request); + Integer hostPort = getter.hostPort(request); + + int hostHeaderSeparator = -1; + if (hostHeader != null) { + hostHeaderSeparator = hostHeader.indexOf(':'); + } + if (hostName == null && hostHeader != null) { + hostName = + hostHeaderSeparator == -1 ? hostHeader : hostHeader.substring(0, hostHeaderSeparator); + } + if (hostPort == null && hostHeader != null && hostHeaderSeparator != -1) { + try { + hostPort = Integer.parseInt(hostHeader.substring(hostHeaderSeparator + 1)); + } catch (NumberFormatException e) { + logger.log(FINE, e.getMessage(), e); + } + } + + if (hostName != null) { + internalSet(attributes, SemanticAttributes.NET_HOST_NAME, hostName); + + if (hostPort != null && hostPort > 0) { + internalSet(attributes, SemanticAttributes.NET_HOST_PORT, (long) hostPort); + } + } + + String sockHostAddr = getter.sockHostAddr(request); + if (sockHostAddr != null && !sockHostAddr.equals(hostName)) { + setSockFamily = true; + + internalSet(attributes, SemanticAttributes.NET_SOCK_HOST_ADDR, sockHostAddr); + + Integer sockHostPort = getter.sockHostPort(request); + if (sockHostPort != null && sockHostPort > 0 && !sockHostPort.equals(hostPort)) { + internalSet(attributes, SemanticAttributes.NET_SOCK_HOST_PORT, (long) sockHostPort); + } + } + + if (setSockFamily) { + String sockFamily = getter.sockFamily(request); + if (sockFamily != null && !SemanticAttributes.NetSockFamilyValues.INET.equals(sockFamily)) { + internalSet(attributes, SemanticAttributes.NET_SOCK_FAMILY, sockFamily); + } + } + } + + private InternalNetServerAttributesExtractor() {} +} diff --git a/instrumentation-api-semconv/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractorTest.java b/instrumentation-api-semconv/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractorTest.java index cc09ac4dad6e..b101ce84217b 100644 --- a/instrumentation-api-semconv/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractorTest.java +++ b/instrumentation-api-semconv/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerAttributesExtractorTest.java @@ -15,6 +15,7 @@ import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesGetter; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import java.util.HashMap; import java.util.List; @@ -25,58 +26,79 @@ class HttpServerAttributesExtractorTest { - static class TestHttpServerAttributesExtractor - implements HttpServerAttributesGetter, Map> { + static class TestHttpServerAttributesGetter + implements HttpServerAttributesGetter, Map> { @Override - public String method(Map request) { - return request.get("method"); + public String method(Map request) { + return (String) request.get("method"); } @Override - public String target(Map request) { - return request.get("target"); + public String target(Map request) { + return (String) request.get("target"); } @Override - public String route(Map request) { - return request.get("route"); + public String route(Map request) { + return (String) request.get("route"); } @Override - public String scheme(Map request) { - return request.get("scheme"); + public String scheme(Map request) { + return (String) request.get("scheme"); } @Override - public List requestHeader(Map request, String name) { - String values = request.get("header." + name); + public List requestHeader(Map request, String name) { + String values = (String) request.get("header." + name); return values == null ? emptyList() : asList(values.split(",")); } @Override public Integer statusCode( - Map request, Map response, @Nullable Throwable error) { - String value = response.get("statusCode"); + Map request, Map response, @Nullable Throwable error) { + String value = (String) response.get("statusCode"); return value == null ? null : Integer.parseInt(value); } @Override - public String flavor(Map request) { - return request.get("flavor"); + public String flavor(Map request) { + return (String) request.get("flavor"); } @Override public List responseHeader( - Map request, Map response, String name) { - String values = response.get("header." + name); + Map request, Map response, String name) { + String values = (String) response.get("header." + name); return values == null ? emptyList() : asList(values.split(",")); } } + static class TestNetServerAttributesGetter + implements NetServerAttributesGetter> { + @Nullable + @Override + public String transport(Map request) { + return (String) request.get("transport"); + } + + @Nullable + @Override + public String hostName(Map request) { + return (String) request.get("hostName"); + } + + @Nullable + @Override + public Integer hostPort(Map request) { + return (Integer) request.get("hostPort"); + } + } + @Test void normal() { - Map request = new HashMap<>(); + Map request = new HashMap<>(); request.put("method", "POST"); request.put("url", "http://github.com"); request.put("target", "/repositories/1"); @@ -89,16 +111,17 @@ void normal() { request.put("header.forwarded", "for=1.1.1.1;proto=https"); request.put("header.custom-request-header", "123,456"); - Map response = new HashMap<>(); + Map response = new HashMap<>(); response.put("statusCode", "202"); response.put("header.content-length", "20"); response.put("header.custom-response-header", "654,321"); Function routeFromContext = ctx -> "/repositories/{repoId}"; - HttpServerAttributesExtractor, Map> extractor = + HttpServerAttributesExtractor, Map> extractor = new HttpServerAttributesExtractor<>( - new TestHttpServerAttributesExtractor(), + new TestHttpServerAttributesGetter(), + new TestNetServerAttributesGetter(), singletonList("Custom-Request-Header"), singletonList("Custom-Response-Header"), routeFromContext); @@ -107,6 +130,7 @@ void normal() { extractor.onStart(attributes, Context.root(), request); assertThat(attributes.build()) .containsOnly( + entry(SemanticAttributes.NET_HOST_NAME, "github.com"), entry(SemanticAttributes.HTTP_FLAVOR, "http/2"), entry(SemanticAttributes.HTTP_METHOD, "POST"), entry(SemanticAttributes.HTTP_SCHEME, "https"), @@ -121,6 +145,7 @@ void normal() { extractor.onEnd(attributes, Context.root(), request, response, null); assertThat(attributes.build()) .containsOnly( + entry(SemanticAttributes.NET_HOST_NAME, "github.com"), entry(SemanticAttributes.HTTP_METHOD, "POST"), entry(SemanticAttributes.HTTP_SCHEME, "https"), entry(SemanticAttributes.HTTP_TARGET, "/repositories/1"), @@ -141,11 +166,12 @@ void normal() { @Test void extractClientIpFromX_Forwarded_For() { - Map request = new HashMap<>(); + Map request = new HashMap<>(); request.put("header.x-forwarded-for", "1.1.1.1"); - HttpServerAttributesExtractor, Map> extractor = - HttpServerAttributesExtractor.builder(new TestHttpServerAttributesExtractor()) + HttpServerAttributesExtractor, Map> extractor = + HttpServerAttributesExtractor.builder( + new TestHttpServerAttributesGetter(), new TestNetServerAttributesGetter()) .setCapturedRequestHeaders(emptyList()) .setCapturedResponseHeaders(emptyList()) .build(); @@ -162,11 +188,12 @@ void extractClientIpFromX_Forwarded_For() { @Test void extractClientIpFromX_Forwarded_Proto() { - Map request = new HashMap<>(); + Map request = new HashMap<>(); request.put("header.x-forwarded-proto", "https"); - HttpServerAttributesExtractor, Map> extractor = - HttpServerAttributesExtractor.builder(new TestHttpServerAttributesExtractor()) + HttpServerAttributesExtractor, Map> extractor = + HttpServerAttributesExtractor.builder( + new TestHttpServerAttributesGetter(), new TestNetServerAttributesGetter()) .setCapturedRequestHeaders(emptyList()) .setCapturedResponseHeaders(emptyList()) .build(); @@ -178,4 +205,46 @@ void extractClientIpFromX_Forwarded_Proto() { extractor.onEnd(attributes, Context.root(), request, null, null); assertThat(attributes.build()).containsOnly(entry(SemanticAttributes.HTTP_SCHEME, "https")); } + + @Test + void extractNetHostAndPortFromHostHeader() { + Map request = new HashMap<>(); + request.put("header.host", "thehost:777"); + + HttpServerAttributesExtractor, Map> extractor = + HttpServerAttributesExtractor.builder( + new TestHttpServerAttributesGetter(), new TestNetServerAttributesGetter()) + .setCapturedRequestHeaders(emptyList()) + .setCapturedResponseHeaders(emptyList()) + .build(); + + AttributesBuilder attributes = Attributes.builder(); + extractor.onStart(attributes, Context.root(), request); + assertThat(attributes.build()) + .containsOnly( + entry(SemanticAttributes.NET_HOST_NAME, "thehost"), + entry(SemanticAttributes.NET_HOST_PORT, 777L)); + } + + @Test + void extractNetHostAndPortFromNetAttributesGetter() { + Map request = new HashMap<>(); + request.put("header.host", "notthehost:77777"); // this should have lower precedence + request.put("hostName", "thehost"); + request.put("hostPort", 777); + + HttpServerAttributesExtractor, Map> extractor = + HttpServerAttributesExtractor.builder( + new TestHttpServerAttributesGetter(), new TestNetServerAttributesGetter()) + .setCapturedRequestHeaders(emptyList()) + .setCapturedResponseHeaders(emptyList()) + .build(); + + AttributesBuilder attributes = Attributes.builder(); + extractor.onStart(attributes, Context.root(), request); + assertThat(attributes.build()) + .containsOnly( + entry(SemanticAttributes.NET_HOST_NAME, "thehost"), + entry(SemanticAttributes.NET_HOST_PORT, 777L)); + } } diff --git a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaHttpServerSingletons.java b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaHttpServerSingletons.java index bcbd108a2f1b..5058d6e1cac7 100644 --- a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaHttpServerSingletons.java +++ b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaHttpServerSingletons.java @@ -30,7 +30,8 @@ public final class AkkaHttpServerSingletons { HttpSpanNameExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpAttributesGetter) + HttpServerAttributesExtractor.builder( + httpAttributesGetter, new AkkaNetServerAttributesGetter()) .setCapturedRequestHeaders(CommonConfig.get().getServerRequestHeaders()) .setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders()) .build()) diff --git a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaNetServerAttributesGetter.java b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaNetServerAttributesGetter.java new file mode 100644 index 000000000000..6f26307ca79f --- /dev/null +++ b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaNetServerAttributesGetter.java @@ -0,0 +1,32 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.akkahttp.server; + +import akka.http.scaladsl.model.HttpRequest; +import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesGetter; +import javax.annotation.Nullable; + +// TODO (trask) capture net attributes? +class AkkaNetServerAttributesGetter implements NetServerAttributesGetter { + + @Nullable + @Override + public String transport(HttpRequest httpRequest) { + return null; + } + + @Nullable + @Override + public String hostName(HttpRequest httpRequest) { + return null; + } + + @Nullable + @Override + public Integer hostPort(HttpRequest httpRequest) { + return null; + } +} diff --git a/instrumentation/akka/akka-http-10.0/javaagent/src/test/scala/io/opentelemetry/javaagent/instrumentation/akkahttp/AbstractHttpServerInstrumentationTest.scala b/instrumentation/akka/akka-http-10.0/javaagent/src/test/scala/io/opentelemetry/javaagent/instrumentation/akkahttp/AbstractHttpServerInstrumentationTest.scala index c02e1dc55725..b163ee49ebbc 100644 --- a/instrumentation/akka/akka-http-10.0/javaagent/src/test/scala/io/opentelemetry/javaagent/instrumentation/akkahttp/AbstractHttpServerInstrumentationTest.scala +++ b/instrumentation/akka/akka-http-10.0/javaagent/src/test/scala/io/opentelemetry/javaagent/instrumentation/akkahttp/AbstractHttpServerInstrumentationTest.scala @@ -6,8 +6,6 @@ package io.opentelemetry.javaagent.instrumentation.akkahttp import io.opentelemetry.api.common.AttributeKey - -import collection.JavaConverters._ import io.opentelemetry.instrumentation.testing.junit.http.{ AbstractHttpServerTest, HttpServerTestOptions, diff --git a/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTelemetryBuilder.java b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTelemetryBuilder.java index 43570a5ea629..b1fbcbcb9a54 100644 --- a/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTelemetryBuilder.java +++ b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTelemetryBuilder.java @@ -25,7 +25,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor; import io.opentelemetry.instrumentation.armeria.v1_3.internal.ArmeriaNetClientAttributesGetter; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import java.util.ArrayList; @@ -51,7 +50,8 @@ public final class ArmeriaTelemetryBuilder { HttpClientAttributesExtractor.builder(ArmeriaHttpClientAttributesGetter.INSTANCE); private final HttpServerAttributesExtractorBuilder httpServerAttributesExtractorBuilder = - HttpServerAttributesExtractor.builder(ArmeriaHttpServerAttributesGetter.INSTANCE); + HttpServerAttributesExtractor.builder( + ArmeriaHttpServerAttributesGetter.INSTANCE, new ArmeriaNetServerAttributesGetter()); private Function< SpanStatusExtractor, @@ -183,8 +183,6 @@ public ArmeriaTelemetry build() { .setSpanStatusExtractor( statusExtractorTransformer.apply( HttpSpanStatusExtractor.create(serverAttributesGetter))) - .addAttributesExtractor( - NetServerAttributesExtractor.create(new ArmeriaNetServerAttributesGetter())) .addAttributesExtractor(httpServerAttributesExtractorBuilder.build()) .addOperationMetrics(HttpServerMetrics.get()) .addContextCustomizer(HttpRouteHolder.get()); diff --git a/instrumentation/grizzly-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlySingletons.java b/instrumentation/grizzly-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlySingletons.java index 08ba9864b45a..839272f8e4db 100644 --- a/instrumentation/grizzly-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlySingletons.java +++ b/instrumentation/grizzly-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlySingletons.java @@ -12,7 +12,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; import io.opentelemetry.javaagent.bootstrap.servlet.AppServerBridge; import org.glassfish.grizzly.http.HttpRequestPacket; @@ -33,11 +32,10 @@ public final class GrizzlySingletons { HttpSpanNameExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpAttributesGetter) + HttpServerAttributesExtractor.builder(httpAttributesGetter, netAttributesGetter) .setCapturedRequestHeaders(CommonConfig.get().getServerRequestHeaders()) .setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders()) .build()) - .addAttributesExtractor(NetServerAttributesExtractor.create(netAttributesGetter)) .addOperationMetrics(HttpServerMetrics.get()) .addContextCustomizer( (context, request, attributes) -> diff --git a/instrumentation/ktor/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTracing.kt b/instrumentation/ktor/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTracing.kt index 4d1eb26c8b9a..37cba1076af2 100644 --- a/instrumentation/ktor/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTracing.kt +++ b/instrumentation/ktor/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTracing.kt @@ -23,7 +23,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttribut import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor -import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor import kotlinx.coroutines.withContext class KtorServerTracing private constructor( @@ -35,7 +34,7 @@ class KtorServerTracing private constructor( internal val additionalExtractors = mutableListOf>() - internal val httpAttributesExtractorBuilder = HttpServerAttributesExtractor.builder(KtorHttpServerAttributesGetter.INSTANCE) + internal val httpAttributesExtractorBuilder = HttpServerAttributesExtractor.builder(KtorHttpServerAttributesGetter.INSTANCE, KtorNetServerAttributesGetter()) internal var statusExtractor: (SpanStatusExtractor) -> SpanStatusExtractor = { a -> a } @@ -103,7 +102,6 @@ class KtorServerTracing private constructor( with(instrumenterBuilder) { setSpanStatusExtractor(configuration.statusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))) - addAttributesExtractor(NetServerAttributesExtractor.create(KtorNetServerAttributesGetter())) addAttributesExtractor(configuration.httpAttributesExtractorBuilder.build()) addOperationMetrics(HttpServerMetrics.get()) addContextCustomizer(HttpRouteHolder.get()) diff --git a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorServerTracing.kt b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorServerTracing.kt index 6f9e19a50819..c43f7bfedfa4 100644 --- a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorServerTracing.kt +++ b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/KtorServerTracing.kt @@ -23,7 +23,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttribut import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor -import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor import kotlinx.coroutines.withContext class KtorServerTracing private constructor( @@ -35,7 +34,7 @@ class KtorServerTracing private constructor( internal val additionalExtractors = mutableListOf>() - internal val httpAttributesExtractorBuilder = HttpServerAttributesExtractor.builder(KtorHttpServerAttributesGetter.INSTANCE) + internal val httpAttributesExtractorBuilder = HttpServerAttributesExtractor.builder(KtorHttpServerAttributesGetter.INSTANCE, KtorNetServerAttributesGetter()) internal var statusExtractor: (SpanStatusExtractor) -> SpanStatusExtractor = { a -> a } @@ -103,7 +102,6 @@ class KtorServerTracing private constructor( with(instrumenterBuilder) { setSpanStatusExtractor(configuration.statusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))) - addAttributesExtractor(NetServerAttributesExtractor.create(KtorNetServerAttributesGetter())) addAttributesExtractor(configuration.httpAttributesExtractorBuilder.build()) addOperationMetrics(HttpServerMetrics.get()) addContextCustomizer(HttpRouteHolder.get()) diff --git a/instrumentation/liberty/liberty-dispatcher-20.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/liberty/dispatcher/LibertyDispatcherSingletons.java b/instrumentation/liberty/liberty-dispatcher-20.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/liberty/dispatcher/LibertyDispatcherSingletons.java index 41121d172f71..940975f35409 100644 --- a/instrumentation/liberty/liberty-dispatcher-20.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/liberty/dispatcher/LibertyDispatcherSingletons.java +++ b/instrumentation/liberty/liberty-dispatcher-20.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/liberty/dispatcher/LibertyDispatcherSingletons.java @@ -12,7 +12,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; public final class LibertyDispatcherSingletons { @@ -33,11 +32,10 @@ public final class LibertyDispatcherSingletons { HttpSpanNameExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpAttributesGetter) + HttpServerAttributesExtractor.builder(httpAttributesGetter, netAttributesGetter) .setCapturedRequestHeaders(CommonConfig.get().getServerRequestHeaders()) .setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders()) .build()) - .addAttributesExtractor(NetServerAttributesExtractor.create(netAttributesGetter)) .addContextCustomizer(HttpRouteHolder.get()) .addOperationMetrics(HttpServerMetrics.get()) .buildServerInstrumenter(LibertyDispatcherRequestGetter.INSTANCE); diff --git a/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/server/NettyServerSingletons.java b/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/server/NettyServerSingletons.java index 6097da909434..73bcc241d8ca 100644 --- a/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/server/NettyServerSingletons.java +++ b/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/server/NettyServerSingletons.java @@ -12,7 +12,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor; import io.opentelemetry.instrumentation.netty.common.internal.NettyErrorHolder; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; import io.opentelemetry.javaagent.instrumentation.netty.v3_8.HttpRequestAndChannel; @@ -33,12 +32,11 @@ final class NettyServerSingletons { HttpSpanNameExtractor.create(httpServerAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpServerAttributesGetter)) .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpServerAttributesGetter) + HttpServerAttributesExtractor.builder( + httpServerAttributesGetter, new NettyNetServerAttributesGetter()) .setCapturedRequestHeaders(CommonConfig.get().getServerRequestHeaders()) .setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders()) .build()) - .addAttributesExtractor( - NetServerAttributesExtractor.create(new NettyNetServerAttributesGetter())) .addOperationMetrics(HttpServerMetrics.get()) .addContextCustomizer( (context, requestAndChannel, startAttributes) -> NettyErrorHolder.init(context)) diff --git a/instrumentation/netty/netty-4-common/library/src/main/java/io/opentelemetry/instrumentation/netty/v4/common/internal/server/NettyServerInstrumenterFactory.java b/instrumentation/netty/netty-4-common/library/src/main/java/io/opentelemetry/instrumentation/netty/v4/common/internal/server/NettyServerInstrumenterFactory.java index 03e7084b115d..3655196e3041 100644 --- a/instrumentation/netty/netty-4-common/library/src/main/java/io/opentelemetry/instrumentation/netty/v4/common/internal/server/NettyServerInstrumenterFactory.java +++ b/instrumentation/netty/netty-4-common/library/src/main/java/io/opentelemetry/instrumentation/netty/v4/common/internal/server/NettyServerInstrumenterFactory.java @@ -13,7 +13,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor; import io.opentelemetry.instrumentation.netty.common.internal.NettyErrorHolder; import io.opentelemetry.instrumentation.netty.v4.common.HttpRequestAndChannel; import java.util.List; @@ -36,12 +35,11 @@ public static Instrumenter create( openTelemetry, instrumentationName, HttpSpanNameExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpAttributesGetter) + HttpServerAttributesExtractor.builder( + httpAttributesGetter, new NettyNetServerAttributesGetter()) .setCapturedRequestHeaders(capturedRequestHeaders) .setCapturedResponseHeaders(capturedResponseHeaders) .build()) - .addAttributesExtractor( - NetServerAttributesExtractor.create(new NettyNetServerAttributesGetter())) .addOperationMetrics(HttpServerMetrics.get()) .addContextCustomizer((context, request, attributes) -> NettyErrorHolder.init(context)) .addContextCustomizer(HttpRouteHolder.get()) diff --git a/instrumentation/opentelemetry-instrumentation-api/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/testing/AgentSpanTestingInstrumenter.java b/instrumentation/opentelemetry-instrumentation-api/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/testing/AgentSpanTestingInstrumenter.java index 8eb1f9d60a04..009578fa42db 100644 --- a/instrumentation/opentelemetry-instrumentation-api/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/testing/AgentSpanTestingInstrumenter.java +++ b/instrumentation/opentelemetry-instrumentation-api/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/testing/AgentSpanTestingInstrumenter.java @@ -30,7 +30,8 @@ public final class AgentSpanTestingInstrumenter { private static final Instrumenter HTTP_SERVER_INSTRUMENTER = Instrumenter.builder(GlobalOpenTelemetry.get(), "test", request -> request) .addAttributesExtractor( - HttpServerAttributesExtractor.create(MockHttpServerAttributesGetter.INSTANCE)) + HttpServerAttributesExtractor.create( + MockHttpServerAttributesGetter.INSTANCE, MockNetServerAttributesGetter.INSTANCE)) .addContextCustomizer(HttpRouteHolder.get()) .addContextCustomizer( (context, request, startAttributes) -> context.with(REQUEST_CONTEXT_KEY, request)) diff --git a/instrumentation/opentelemetry-instrumentation-api/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/testing/MockNetServerAttributesGetter.java b/instrumentation/opentelemetry-instrumentation-api/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/testing/MockNetServerAttributesGetter.java new file mode 100644 index 000000000000..e49a3a5001a9 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-api/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/testing/MockNetServerAttributesGetter.java @@ -0,0 +1,32 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.testing; + +import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesGetter; +import javax.annotation.Nullable; + +// only needed so that HttpServerAttributesExtractor can be added to the HTTP server instrumenter +enum MockNetServerAttributesGetter implements NetServerAttributesGetter { + INSTANCE; + + @Nullable + @Override + public String transport(String s) { + return null; + } + + @Nullable + @Override + public String hostName(String s) { + return null; + } + + @Nullable + @Override + public Integer hostPort(String s) { + return null; + } +} diff --git a/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/RatpackTelemetryBuilder.java b/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/RatpackTelemetryBuilder.java index ab0353959345..fcd1855ad27b 100644 --- a/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/RatpackTelemetryBuilder.java +++ b/instrumentation/ratpack/ratpack-1.7/library/src/main/java/io/opentelemetry/instrumentation/ratpack/RatpackTelemetryBuilder.java @@ -17,7 +17,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor; import io.opentelemetry.instrumentation.ratpack.internal.RatpackHttpNetAttributesGetter; import io.opentelemetry.instrumentation.ratpack.internal.RatpackNetAttributesGetter; import java.util.ArrayList; @@ -41,7 +40,8 @@ public final class RatpackTelemetryBuilder { HttpClientAttributesExtractor.builder(RatpackHttpClientAttributesGetter.INSTANCE); private final HttpServerAttributesExtractorBuilder httpServerAttributesExtractorBuilder = - HttpServerAttributesExtractor.builder(RatpackHttpAttributesGetter.INSTANCE); + HttpServerAttributesExtractor.builder( + RatpackHttpAttributesGetter.INSTANCE, new RatpackNetAttributesGetter()); private final List> additionalHttpClientExtractors = new ArrayList<>(); @@ -114,14 +114,12 @@ public RatpackTelemetryBuilder setCapturedClientResponseHeaders(List res /** Returns a new {@link RatpackTelemetry} with the configuration of this builder. */ public RatpackTelemetry build() { - RatpackNetAttributesGetter netAttributes = new RatpackNetAttributesGetter(); RatpackHttpAttributesGetter httpAttributes = RatpackHttpAttributesGetter.INSTANCE; Instrumenter instrumenter = Instrumenter.builder( openTelemetry, INSTRUMENTATION_NAME, HttpSpanNameExtractor.create(httpAttributes)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributes)) - .addAttributesExtractor(NetServerAttributesExtractor.create(netAttributes)) .addAttributesExtractor(httpServerAttributesExtractorBuilder.build()) .addAttributesExtractors(additionalExtractors) .addOperationMetrics(HttpServerMetrics.get()) diff --git a/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/RestletTelemetryBuilder.java b/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/RestletTelemetryBuilder.java index e1cd5bf05455..3305851a7a56 100644 --- a/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/RestletTelemetryBuilder.java +++ b/instrumentation/restlet/restlet-1.1/library/src/main/java/io/opentelemetry/instrumentation/restlet/v1_1/RestletTelemetryBuilder.java @@ -14,7 +14,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor; import java.util.ArrayList; import java.util.List; import org.restlet.data.Request; @@ -30,7 +29,8 @@ public final class RestletTelemetryBuilder { new ArrayList<>(); private final HttpServerAttributesExtractorBuilder httpAttributesExtractorBuilder = - HttpServerAttributesExtractor.builder(RestletHttpAttributesGetter.INSTANCE); + HttpServerAttributesExtractor.builder( + RestletHttpAttributesGetter.INSTANCE, new RestletNetAttributesGetter()); RestletTelemetryBuilder(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; @@ -75,7 +75,6 @@ public RestletTelemetryBuilder setCapturedResponseHeaders(List responseH */ public RestletTelemetry build() { RestletHttpAttributesGetter httpAttributesGetter = RestletHttpAttributesGetter.INSTANCE; - RestletNetAttributesGetter netAttributesGetter = new RestletNetAttributesGetter(); Instrumenter instrumenter = Instrumenter.builder( @@ -84,7 +83,6 @@ public RestletTelemetry build() { HttpSpanNameExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .addAttributesExtractor(httpAttributesExtractorBuilder.build()) - .addAttributesExtractor(NetServerAttributesExtractor.create(netAttributesGetter)) .addAttributesExtractors(additionalExtractors) .addOperationMetrics(HttpServerMetrics.get()) .buildServerInstrumenter(RestletHeadersGetter.INSTANCE); diff --git a/instrumentation/restlet/restlet-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/restlet/v2_0/RestletSingletons.java b/instrumentation/restlet/restlet-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/restlet/v2_0/RestletSingletons.java index 1ac56276f78c..1526fd2a5b2a 100644 --- a/instrumentation/restlet/restlet-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/restlet/v2_0/RestletSingletons.java +++ b/instrumentation/restlet/restlet-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/restlet/v2_0/RestletSingletons.java @@ -11,6 +11,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor; import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletHttpAttributesGetter; import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletInstrumenterFactory; +import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletNetAttributesGetter; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath; import java.util.Collections; @@ -22,7 +23,8 @@ public final class RestletSingletons { private static final Instrumenter INSTRUMENTER = RestletInstrumenterFactory.newServerInstrumenter( GlobalOpenTelemetry.get(), - HttpServerAttributesExtractor.builder(RestletHttpAttributesGetter.INSTANCE) + HttpServerAttributesExtractor.builder( + RestletHttpAttributesGetter.INSTANCE, new RestletNetAttributesGetter()) .setCapturedRequestHeaders(CommonConfig.get().getServerRequestHeaders()) .setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders()) .build(), diff --git a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/RestletTelemetryBuilder.java b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/RestletTelemetryBuilder.java index 1f5ae816106b..86236231a2ac 100644 --- a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/RestletTelemetryBuilder.java +++ b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/RestletTelemetryBuilder.java @@ -13,6 +13,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractorBuilder; import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletHttpAttributesGetter; import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletInstrumenterFactory; +import io.opentelemetry.instrumentation.restlet.v2_0.internal.RestletNetAttributesGetter; import java.util.ArrayList; import java.util.List; import org.restlet.Request; @@ -26,7 +27,8 @@ public final class RestletTelemetryBuilder { new ArrayList<>(); private final HttpServerAttributesExtractorBuilder httpAttributesExtractorBuilder = - HttpServerAttributesExtractor.builder(RestletHttpAttributesGetter.INSTANCE); + HttpServerAttributesExtractor.builder( + RestletHttpAttributesGetter.INSTANCE, new RestletNetAttributesGetter()); RestletTelemetryBuilder(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; diff --git a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletInstrumenterFactory.java b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletInstrumenterFactory.java index d1d671643dea..4c811963f9e9 100644 --- a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletInstrumenterFactory.java +++ b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletInstrumenterFactory.java @@ -12,7 +12,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor; import java.util.List; import org.restlet.Request; import org.restlet.Response; @@ -31,13 +30,11 @@ public static Instrumenter newServerInstrumenter( List> additionalExtractors) { RestletHttpAttributesGetter httpAttributesGetter = RestletHttpAttributesGetter.INSTANCE; - RestletNetAttributesGetter netAttributesGetter = new RestletNetAttributesGetter(); return Instrumenter.builder( openTelemetry, INSTRUMENTATION_NAME, HttpSpanNameExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .addAttributesExtractor(httpServerAttributesExtractor) - .addAttributesExtractor(NetServerAttributesExtractor.create(netAttributesGetter)) .addAttributesExtractors(additionalExtractors) .addOperationMetrics(HttpServerMetrics.get()) .buildServerInstrumenter(new RestletHeadersGetter()); diff --git a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletNetAttributesGetter.java b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletNetAttributesGetter.java index 845ca8b2613c..d956ea6018b9 100644 --- a/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletNetAttributesGetter.java +++ b/instrumentation/restlet/restlet-2.0/library/src/main/java/io/opentelemetry/instrumentation/restlet/v2_0/internal/RestletNetAttributesGetter.java @@ -14,7 +14,11 @@ import javax.annotation.Nullable; import org.restlet.Request; -final class RestletNetAttributesGetter implements NetServerAttributesGetter { +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +public final class RestletNetAttributesGetter implements NetServerAttributesGetter { private static final Class HTTP_REQUEST_CLASS; private static final MethodHandle GET_HTTP_CALL; diff --git a/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/ServletInstrumenterBuilder.java b/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/ServletInstrumenterBuilder.java index a9faca745612..0da91e124e28 100644 --- a/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/ServletInstrumenterBuilder.java +++ b/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/ServletInstrumenterBuilder.java @@ -18,7 +18,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; import java.util.ArrayList; import java.util.List; @@ -61,11 +60,10 @@ public Instrumenter, ServletResponseContext(); private final HttpServerAttributesExtractorBuilder httpAttributesExtractorBuilder = - HttpServerAttributesExtractor.builder(SpringWebMvcHttpAttributesGetter.INSTANCE); + HttpServerAttributesExtractor.builder( + SpringWebMvcHttpAttributesGetter.INSTANCE, SpringWebMvcNetAttributesGetter.INSTANCE); SpringWebMvcTelemetryBuilder(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; @@ -85,8 +85,6 @@ public SpringWebMvcTelemetry build() { HttpSpanNameExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .addAttributesExtractor(httpAttributesExtractorBuilder.build()) - .addAttributesExtractor( - NetServerAttributesExtractor.create(SpringWebMvcNetAttributesGetter.INSTANCE)) .addAttributesExtractors(additionalExtractors) .addOperationMetrics(HttpServerMetrics.get()) .addContextCustomizer(HttpRouteHolder.get()) diff --git a/instrumentation/tomcat/tomcat-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tomcat/common/TomcatInstrumenterFactory.java b/instrumentation/tomcat/tomcat-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tomcat/common/TomcatInstrumenterFactory.java index 503b88a99935..a9959b5fef5c 100644 --- a/instrumentation/tomcat/tomcat-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tomcat/common/TomcatInstrumenterFactory.java +++ b/instrumentation/tomcat/tomcat-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tomcat/common/TomcatInstrumenterFactory.java @@ -12,7 +12,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; import io.opentelemetry.javaagent.bootstrap.servlet.AppServerBridge; import io.opentelemetry.javaagent.instrumentation.servlet.ServletAccessor; @@ -36,11 +35,10 @@ public static Instrumenter create( .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .setErrorCauseExtractor(new ServletErrorCauseExtractor<>(accessor)) .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpAttributesGetter) + HttpServerAttributesExtractor.builder(httpAttributesGetter, netAttributesGetter) .setCapturedRequestHeaders(CommonConfig.get().getServerRequestHeaders()) .setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders()) .build()) - .addAttributesExtractor(NetServerAttributesExtractor.create(netAttributesGetter)) .addContextCustomizer(HttpRouteHolder.get()) .addContextCustomizer( (context, request, attributes) -> diff --git a/instrumentation/undertow-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowSingletons.java b/instrumentation/undertow-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowSingletons.java index 200a083b69c2..06be9d773008 100644 --- a/instrumentation/undertow-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowSingletons.java +++ b/instrumentation/undertow-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/undertow/UndertowSingletons.java @@ -12,7 +12,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; import io.opentelemetry.javaagent.bootstrap.servlet.AppServerBridge; import io.opentelemetry.javaagent.bootstrap.undertow.UndertowActiveHandlers; @@ -34,11 +33,10 @@ public final class UndertowSingletons { HttpSpanNameExtractor.create(httpAttributesGetter)) .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)) .addAttributesExtractor( - HttpServerAttributesExtractor.builder(httpAttributesGetter) + HttpServerAttributesExtractor.builder(httpAttributesGetter, netAttributesGetter) .setCapturedRequestHeaders(CommonConfig.get().getServerRequestHeaders()) .setCapturedResponseHeaders(CommonConfig.get().getServerResponseHeaders()) .build()) - .addAttributesExtractor(NetServerAttributesExtractor.create(netAttributesGetter)) .addContextCustomizer(HttpRouteHolder.get()) .addContextCustomizer( (context, request, attributes) -> { diff --git a/instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/latestDepTest/groovy/VertxReactivePropagationTest.groovy b/instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/latestDepTest/groovy/VertxReactivePropagationTest.groovy index 1d8f28cfa528..1d11e5c44abf 100644 --- a/instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/latestDepTest/groovy/VertxReactivePropagationTest.groovy +++ b/instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/latestDepTest/groovy/VertxReactivePropagationTest.groovy @@ -67,7 +67,8 @@ class VertxReactivePropagationTest extends AgentInstrumentationSpecification { "net.sock.peer.addr" "127.0.0.1" "net.sock.peer.port" Long "net.sock.host.addr" "127.0.0.1" - "net.sock.host.port" Long + "net.host.name" "localhost" + "net.host.port" Long "$SemanticAttributes.HTTP_TARGET" "/listProducts" "$SemanticAttributes.HTTP_METHOD" "GET" "$SemanticAttributes.HTTP_STATUS_CODE" 200 @@ -159,7 +160,8 @@ class VertxReactivePropagationTest extends AgentInstrumentationSpecification { "net.sock.peer.addr" "127.0.0.1" "net.sock.peer.port" Long "net.sock.host.addr" "127.0.0.1" - "net.sock.host.port" Long + "net.host.name" "localhost" + "net.host.port" Long "$SemanticAttributes.HTTP_TARGET" "$baseUrl?$TEST_REQUEST_ID_PARAMETER=$requestId" "$SemanticAttributes.HTTP_METHOD" "GET" "$SemanticAttributes.HTTP_STATUS_CODE" 200 diff --git a/instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/version35Test/groovy/VertxReactivePropagationTest.groovy b/instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/version35Test/groovy/VertxReactivePropagationTest.groovy index 1d8f28cfa528..1d11e5c44abf 100644 --- a/instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/version35Test/groovy/VertxReactivePropagationTest.groovy +++ b/instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/version35Test/groovy/VertxReactivePropagationTest.groovy @@ -67,7 +67,8 @@ class VertxReactivePropagationTest extends AgentInstrumentationSpecification { "net.sock.peer.addr" "127.0.0.1" "net.sock.peer.port" Long "net.sock.host.addr" "127.0.0.1" - "net.sock.host.port" Long + "net.host.name" "localhost" + "net.host.port" Long "$SemanticAttributes.HTTP_TARGET" "/listProducts" "$SemanticAttributes.HTTP_METHOD" "GET" "$SemanticAttributes.HTTP_STATUS_CODE" 200 @@ -159,7 +160,8 @@ class VertxReactivePropagationTest extends AgentInstrumentationSpecification { "net.sock.peer.addr" "127.0.0.1" "net.sock.peer.port" Long "net.sock.host.addr" "127.0.0.1" - "net.sock.host.port" Long + "net.host.name" "localhost" + "net.host.port" Long "$SemanticAttributes.HTTP_TARGET" "$baseUrl?$TEST_REQUEST_ID_PARAMETER=$requestId" "$SemanticAttributes.HTTP_METHOD" "GET" "$SemanticAttributes.HTTP_STATUS_CODE" 200 diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/AbstractHttpServerTest.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/AbstractHttpServerTest.java index d9a03e2eab4e..b3330fc308b3 100644 --- a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/AbstractHttpServerTest.java +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/AbstractHttpServerTest.java @@ -588,10 +588,8 @@ protected SpanDataAssert assertServerSpan( SemanticAttributes.NET_TRANSPORT, SemanticAttributes.NetTransportValues.IP_TCP); } + assertThat(attrs).containsEntry(SemanticAttributes.NET_HOST_NAME, "localhost"); // TODO: Move to test knob rather than always treating as optional - if (attrs.get(SemanticAttributes.NET_HOST_NAME) != null) { - assertThat(attrs).containsEntry(SemanticAttributes.NET_HOST_NAME, "localhost"); - } if (attrs.get(SemanticAttributes.NET_HOST_PORT) != null) { assertThat(attrs).containsEntry(SemanticAttributes.NET_HOST_PORT, port); }