From 556636b0c0e5c183b6b9dfad3e2bbbbe9091d2da Mon Sep 17 00:00:00 2001 From: Mateusz Rzeszutek Date: Thu, 20 May 2021 14:52:52 +0200 Subject: [PATCH 1/5] [WIP] Add peer.service to Instrumenter API --- .../net/PeerServiceAttributesExtractor.java | 60 +++++++++++++++++++ .../v2_0/ApacheHttpClientInstrumenters.java | 6 +- .../armeria/v1_3/ArmeriaTracingBuilder.java | 5 ++ .../jdbc/JdbcInstrumenters.java | 11 ++-- 4 files changed, 77 insertions(+), 5 deletions(-) create mode 100644 instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/PeerServiceAttributesExtractor.java diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/PeerServiceAttributesExtractor.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/PeerServiceAttributesExtractor.java new file mode 100644 index 000000000000..e4571ad1aa34 --- /dev/null +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/PeerServiceAttributesExtractor.java @@ -0,0 +1,60 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.instrumenter.net; + +import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.instrumentation.api.config.Config; +import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import java.util.Map; + +public final class PeerServiceAttributesExtractor + extends AttributesExtractor { + private static final Map JAVAAGENT_PEER_SERVICE_MAPPING = + Config.get().getMapProperty("otel.instrumentation.common.peer-service-mapping"); + + private final Map peerServiceMapping; + private final NetAttributesExtractor netAttributesExtractor; + + // visible for tests + PeerServiceAttributesExtractor( + Map peerServiceMapping, + NetAttributesExtractor netAttributesExtractor) { + this.peerServiceMapping = peerServiceMapping; + this.netAttributesExtractor = netAttributesExtractor; + } + + public static AttributesExtractor create( + NetAttributesExtractor netAttributesExtractor) { + return new PeerServiceAttributesExtractor<>( + JAVAAGENT_PEER_SERVICE_MAPPING, netAttributesExtractor); + } + + @Override + protected void onStart(AttributesBuilder attributes, REQUEST request) { + onEnd(attributes, request, null); + } + + @Override + protected void onEnd(AttributesBuilder attributes, REQUEST request, RESPONSE response) { + String peerName = netAttributesExtractor.peerName(request, response); + String peerService = mapToPeerService(peerName); + if (peerService == null) { + String peerIp = netAttributesExtractor.peerIp(request, response); + peerService = mapToPeerService(peerIp); + } + if (peerService != null) { + attributes.put(SemanticAttributes.PEER_SERVICE, peerService); + } + } + + private String mapToPeerService(String endpoint) { + if (endpoint == null) { + return null; + } + return peerServiceMapping.get(endpoint); + } +} diff --git a/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientInstrumenters.java b/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientInstrumenters.java index 50496056cca5..6a1feac5ff0f 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientInstrumenters.java +++ b/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientInstrumenters.java @@ -12,6 +12,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.net.PeerServiceAttributesExtractor; import org.apache.commons.httpclient.HttpMethod; public final class ApacheHttpClientInstrumenters { @@ -27,13 +28,16 @@ public final class ApacheHttpClientInstrumenters { HttpSpanNameExtractor.create(httpAttributesExtractor); SpanStatusExtractor spanStatusExtractor = HttpSpanStatusExtractor.create(httpAttributesExtractor); + ApacheHttpClientNetAttributesExtractor netAttributesExtractor = + new ApacheHttpClientNetAttributesExtractor(); INSTRUMENTER = Instrumenter.newBuilder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, spanNameExtractor) .setSpanStatusExtractor(spanStatusExtractor) .addAttributesExtractor(httpAttributesExtractor) - .addAttributesExtractor(new ApacheHttpClientNetAttributesExtractor()) + .addAttributesExtractor(netAttributesExtractor) + .addAttributesExtractor(PeerServiceAttributesExtractor.create(netAttributesExtractor)) .newClientInstrumenter(new HttpHeaderSetter()); } diff --git a/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTracingBuilder.java b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTracingBuilder.java index 5b0a87775cef..7e8d098b695d 100644 --- a/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTracingBuilder.java +++ b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTracingBuilder.java @@ -18,6 +18,7 @@ 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.PeerServiceAttributesExtractor; import java.util.ArrayList; import java.util.List; import java.util.function.Function; @@ -63,6 +64,9 @@ public ArmeriaTracingBuilder addAttributeExtractor( public ArmeriaTracing build() { ArmeriaHttpAttributesExtractor httpAttributesExtractor = new ArmeriaHttpAttributesExtractor(); ArmeriaNetAttributesExtractor netAttributesExtractor = new ArmeriaNetAttributesExtractor(); + AttributesExtractor + peerServiceAttributesExtractor = + PeerServiceAttributesExtractor.create(netAttributesExtractor); SpanNameExtractor spanNameExtractor = HttpSpanNameExtractor.create(httpAttributesExtractor); @@ -81,6 +85,7 @@ public ArmeriaTracing build() { .setSpanStatusExtractor(spanStatusExtractor) .addAttributesExtractor(httpAttributesExtractor) .addAttributesExtractor(netAttributesExtractor) + .addAttributesExtractor(peerServiceAttributesExtractor) .addAttributesExtractors(additionalExtractors)); serverInstrumenterBuilder.addRequestMetrics(HttpServerMetrics.get()); diff --git a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcInstrumenters.java b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcInstrumenters.java index 6138dba480ff..edcdd7ce63e8 100644 --- a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcInstrumenters.java +++ b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcInstrumenters.java @@ -11,6 +11,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.db.DbAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.db.DbSpanNameExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.net.PeerServiceAttributesExtractor; public final class JdbcInstrumenters { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.javaagent.jdbc"; @@ -18,14 +19,16 @@ public final class JdbcInstrumenters { private static final Instrumenter INSTRUMENTER; static { - DbAttributesExtractor attributesExtractor = new JdbcAttributesExtractor(); - SpanNameExtractor spanName = DbSpanNameExtractor.create(attributesExtractor); + DbAttributesExtractor dbAttributesExtractor = new JdbcAttributesExtractor(); + SpanNameExtractor spanName = DbSpanNameExtractor.create(dbAttributesExtractor); + JdbcNetAttributesExtractor netAttributesExtractor = new JdbcNetAttributesExtractor(); INSTRUMENTER = Instrumenter.newBuilder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, spanName) - .addAttributesExtractor(attributesExtractor) - .addAttributesExtractor(new JdbcNetAttributesExtractor()) + .addAttributesExtractor(dbAttributesExtractor) + .addAttributesExtractor(netAttributesExtractor) + .addAttributesExtractor(PeerServiceAttributesExtractor.create(netAttributesExtractor)) .newInstrumenter(SpanKindExtractor.alwaysClient()); } From 9cb275a4ceac7326b617b96cdea0e3dbb0397a2a Mon Sep 17 00:00:00 2001 From: Mateusz Rzeszutek Date: Fri, 21 May 2021 11:36:10 +0200 Subject: [PATCH 2/5] Move PeerServiceAttributesExtractor to javaagent-api and use reflection to add it --- ...etSocketAddressNetAttributesExtractor.java | 6 +-- .../net/NetAttributesExtractor.java | 6 +-- .../net/NetAttributesExtractorTest.java | 6 +-- .../v2_0/ApacheHttpClientInstrumenters.java | 2 +- ...pacheHttpClientNetAttributesExtractor.java | 6 +-- ...pacheHttpClientNetAttributesExtractor.java | 6 +-- .../armeria/v1_3/ArmeriaDecorators.java | 48 +++++++++++++++++-- .../armeria/v1_3/ArmeriaTracingBuilder.java | 5 -- .../jdbc/JdbcInstrumenters.java | 2 +- .../jdbc/JdbcNetAttributesExtractor.java | 6 +-- .../PeerServiceAttributesExtractor.java | 3 +- 11 files changed, 65 insertions(+), 31 deletions(-) rename {instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net => javaagent-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/instrumenter}/PeerServiceAttributesExtractor.java (93%) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/InetSocketAddressNetAttributesExtractor.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/InetSocketAddressNetAttributesExtractor.java index 509d4d496ebb..92163af06155 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/InetSocketAddressNetAttributesExtractor.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/InetSocketAddressNetAttributesExtractor.java @@ -29,7 +29,7 @@ public abstract class InetSocketAddressNetAttributesExtractor @Override @Nullable - protected final String peerName(REQUEST request, @Nullable RESPONSE response) { + public final String peerName(REQUEST request, @Nullable RESPONSE response) { InetSocketAddress address = getAddress(request, response); if (address == null) { return null; @@ -42,7 +42,7 @@ protected final String peerName(REQUEST request, @Nullable RESPONSE response) { @Override @Nullable - protected final Integer peerPort(REQUEST request, @Nullable RESPONSE response) { + public final Integer peerPort(REQUEST request, @Nullable RESPONSE response) { InetSocketAddress address = getAddress(request, response); if (address == null) { return null; @@ -52,7 +52,7 @@ protected final Integer peerPort(REQUEST request, @Nullable RESPONSE response) { @Override @Nullable - protected final String peerIp(REQUEST request, @Nullable RESPONSE response) { + public final String peerIp(REQUEST request, @Nullable RESPONSE response) { InetSocketAddress address = getAddress(request, response); if (address == null) { return null; diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetAttributesExtractor.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetAttributesExtractor.java index 4f0993ceb4c5..305424f04abf 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetAttributesExtractor.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetAttributesExtractor.java @@ -50,7 +50,7 @@ protected final void onEnd( * phases of processing. */ @Nullable - protected abstract String peerName(REQUEST request, @Nullable RESPONSE response); + public abstract String peerName(REQUEST request, @Nullable RESPONSE response); /** * This method will be called twice: both when the request starts ({@code response} is always null @@ -58,7 +58,7 @@ protected final void onEnd( * phases of processing. */ @Nullable - protected abstract Integer peerPort(REQUEST request, @Nullable RESPONSE response); + public abstract Integer peerPort(REQUEST request, @Nullable RESPONSE response); /** * This method will be called twice: both when the request starts ({@code response} is always null @@ -66,5 +66,5 @@ protected final void onEnd( * phases of processing. */ @Nullable - protected abstract String peerIp(REQUEST request, @Nullable RESPONSE response); + public abstract String peerIp(REQUEST request, @Nullable RESPONSE response); } diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetAttributesExtractorTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetAttributesExtractorTest.java index c9cb162444ad..4dc394fb0a97 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetAttributesExtractorTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetAttributesExtractorTest.java @@ -26,7 +26,7 @@ protected String transport(Map request) { } @Override - protected String peerName(Map request, Map response) { + public String peerName(Map request, Map response) { if (response != null) { return response.get("peerName"); } @@ -34,7 +34,7 @@ protected String peerName(Map request, Map respo } @Override - protected Integer peerPort(Map request, Map response) { + public Integer peerPort(Map request, Map response) { if (response != null) { return Integer.valueOf(response.get("peerPort")); } @@ -42,7 +42,7 @@ protected Integer peerPort(Map request, Map resp } @Override - protected String peerIp(Map request, Map response) { + public String peerIp(Map request, Map response) { if (response != null) { return response.get("peerIp"); } diff --git a/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientInstrumenters.java b/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientInstrumenters.java index 6a1feac5ff0f..c4a8f24a324f 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientInstrumenters.java +++ b/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientInstrumenters.java @@ -12,7 +12,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.net.PeerServiceAttributesExtractor; +import io.opentelemetry.javaagent.instrumentation.api.instrumenter.PeerServiceAttributesExtractor; import org.apache.commons.httpclient.HttpMethod; public final class ApacheHttpClientInstrumenters { diff --git a/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientNetAttributesExtractor.java b/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientNetAttributesExtractor.java index cb76cad37ef9..5d0bd72f808d 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientNetAttributesExtractor.java +++ b/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientNetAttributesExtractor.java @@ -20,19 +20,19 @@ protected String transport(HttpMethod request) { } @Override - protected @Nullable String peerName(HttpMethod request, @Nullable HttpMethod response) { + public @Nullable String peerName(HttpMethod request, @Nullable HttpMethod response) { HostConfiguration hostConfiguration = request.getHostConfiguration(); return hostConfiguration != null ? hostConfiguration.getHost() : null; } @Override - protected @Nullable Integer peerPort(HttpMethod request, @Nullable HttpMethod response) { + public @Nullable Integer peerPort(HttpMethod request, @Nullable HttpMethod response) { HostConfiguration hostConfiguration = request.getHostConfiguration(); return hostConfiguration != null ? hostConfiguration.getPort() : null; } @Override - protected @Nullable String peerIp(HttpMethod request, @Nullable HttpMethod response) { + public @Nullable String peerIp(HttpMethod request, @Nullable HttpMethod response) { return null; } } diff --git a/instrumentation/apache-httpclient/apache-httpclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v4_0/ApacheHttpClientNetAttributesExtractor.java b/instrumentation/apache-httpclient/apache-httpclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v4_0/ApacheHttpClientNetAttributesExtractor.java index 5f167eaab973..9a942fa4608b 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v4_0/ApacheHttpClientNetAttributesExtractor.java +++ b/instrumentation/apache-httpclient/apache-httpclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v4_0/ApacheHttpClientNetAttributesExtractor.java @@ -26,12 +26,12 @@ protected String transport(HttpUriRequest request) { } @Override - protected @Nullable String peerName(HttpUriRequest request, @Nullable HttpResponse response) { + public @Nullable String peerName(HttpUriRequest request, @Nullable HttpResponse response) { return request.getURI().getHost(); } @Override - protected Integer peerPort(HttpUriRequest request, @Nullable HttpResponse response) { + public Integer peerPort(HttpUriRequest request, @Nullable HttpResponse response) { URI uri = request.getURI(); int port = uri.getPort(); if (port != -1) { @@ -49,7 +49,7 @@ protected Integer peerPort(HttpUriRequest request, @Nullable HttpResponse respon } @Override - protected @Nullable String peerIp(HttpUriRequest request, @Nullable HttpResponse response) { + public @Nullable String peerIp(HttpUriRequest request, @Nullable HttpResponse response) { return null; } } diff --git a/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaDecorators.java b/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaDecorators.java index e21a556b0ac0..37076eb08574 100644 --- a/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaDecorators.java +++ b/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaDecorators.java @@ -6,20 +6,58 @@ package io.opentelemetry.javaagent.instrumentation.armeria.v1_3; import com.linecorp.armeria.client.HttpClient; +import com.linecorp.armeria.common.RequestContext; +import com.linecorp.armeria.common.logging.RequestLog; import com.linecorp.armeria.server.HttpService; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor; import io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaTracing; +import io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaTracingBuilder; +import io.opentelemetry.javaagent.instrumentation.api.instrumenter.PeerServiceAttributesExtractor; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.util.function.Function; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; // Holds singleton references to decorators to match against during suppression. // https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/903 public final class ArmeriaDecorators { + private static final Logger log = LoggerFactory.getLogger(ArmeriaDecorators.class); - private static final ArmeriaTracing TRACING = ArmeriaTracing.create(GlobalOpenTelemetry.get()); + public static final Function CLIENT_DECORATOR; - public static final Function CLIENT_DECORATOR = - TRACING.newClientDecorator(); + public static final Function SERVER_DECORATOR; - public static final Function SERVER_DECORATOR = - TRACING.newServiceDecorator(); + static { + ArmeriaTracingBuilder builder = ArmeriaTracing.newBuilder(GlobalOpenTelemetry.get()); + + Constructor> constructor = null; + try { + Class> + netAttributesExtractorClass = + (Class>) + Class.forName( + "io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaNetAttributesExtractor"); + constructor = netAttributesExtractorClass.getDeclaredConstructor(); + constructor.setAccessible(true); + NetAttributesExtractor netAttributesExtractor = + constructor.newInstance(); + builder.addAttributeExtractor(PeerServiceAttributesExtractor.create(netAttributesExtractor)); + } catch (ClassNotFoundException + | NoSuchMethodException + | IllegalAccessException + | InstantiationException + | InvocationTargetException e) { + log.warn("Could not add PeerServiceAttributesExtractor to armeria", e); + } finally { + if (constructor != null) { + constructor.setAccessible(false); + } + } + + ArmeriaTracing tracing = builder.build(); + CLIENT_DECORATOR = tracing.newClientDecorator(); + SERVER_DECORATOR = tracing.newServiceDecorator(); + } } diff --git a/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTracingBuilder.java b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTracingBuilder.java index 7e8d098b695d..5b0a87775cef 100644 --- a/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTracingBuilder.java +++ b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTracingBuilder.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.PeerServiceAttributesExtractor; import java.util.ArrayList; import java.util.List; import java.util.function.Function; @@ -64,9 +63,6 @@ public ArmeriaTracingBuilder addAttributeExtractor( public ArmeriaTracing build() { ArmeriaHttpAttributesExtractor httpAttributesExtractor = new ArmeriaHttpAttributesExtractor(); ArmeriaNetAttributesExtractor netAttributesExtractor = new ArmeriaNetAttributesExtractor(); - AttributesExtractor - peerServiceAttributesExtractor = - PeerServiceAttributesExtractor.create(netAttributesExtractor); SpanNameExtractor spanNameExtractor = HttpSpanNameExtractor.create(httpAttributesExtractor); @@ -85,7 +81,6 @@ public ArmeriaTracing build() { .setSpanStatusExtractor(spanStatusExtractor) .addAttributesExtractor(httpAttributesExtractor) .addAttributesExtractor(netAttributesExtractor) - .addAttributesExtractor(peerServiceAttributesExtractor) .addAttributesExtractors(additionalExtractors)); serverInstrumenterBuilder.addRequestMetrics(HttpServerMetrics.get()); diff --git a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcInstrumenters.java b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcInstrumenters.java index edcdd7ce63e8..54c3bd0a67b3 100644 --- a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcInstrumenters.java +++ b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcInstrumenters.java @@ -11,7 +11,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.db.DbAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.db.DbSpanNameExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.net.PeerServiceAttributesExtractor; +import io.opentelemetry.javaagent.instrumentation.api.instrumenter.PeerServiceAttributesExtractor; public final class JdbcInstrumenters { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.javaagent.jdbc"; diff --git a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcNetAttributesExtractor.java b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcNetAttributesExtractor.java index df93a6b96fc4..06b0573c7e9f 100644 --- a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcNetAttributesExtractor.java +++ b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcNetAttributesExtractor.java @@ -18,19 +18,19 @@ protected String transport(DbRequest dbRequest) { @Nullable @Override - protected String peerName(DbRequest request, @Nullable Void response) { + public String peerName(DbRequest request, @Nullable Void response) { return request.getDbInfo().getHost(); } @Nullable @Override - protected Integer peerPort(DbRequest request, @Nullable Void response) { + public Integer peerPort(DbRequest request, @Nullable Void response) { return request.getDbInfo().getPort(); } @Nullable @Override - protected String peerIp(DbRequest request, @Nullable Void response) { + public String peerIp(DbRequest request, @Nullable Void response) { return null; } } diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/PeerServiceAttributesExtractor.java b/javaagent-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/instrumenter/PeerServiceAttributesExtractor.java similarity index 93% rename from instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/PeerServiceAttributesExtractor.java rename to javaagent-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/instrumenter/PeerServiceAttributesExtractor.java index e4571ad1aa34..ef62255931e2 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/PeerServiceAttributesExtractor.java +++ b/javaagent-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/instrumenter/PeerServiceAttributesExtractor.java @@ -3,11 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.api.instrumenter.net; +package io.opentelemetry.javaagent.instrumentation.api.instrumenter; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.instrumentation.api.config.Config; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import java.util.Map; From 7842edf24d2fddf8fac9c7b1958074863726de00 Mon Sep 17 00:00:00 2001 From: Mateusz Rzeszutek Date: Mon, 24 May 2021 15:14:26 +0200 Subject: [PATCH 3/5] Finish PeerServiceAttributesExtractor --- ...etSocketAddressNetAttributesExtractor.java | 2 +- .../net/NetAttributesExtractor.java | 2 +- ...cketAddressNetAttributesExtractorTest.java | 2 +- .../net/NetAttributesExtractorTest.java | 2 +- ...pacheHttpClientNetAttributesExtractor.java | 2 +- .../v4_0/ApacheHttpClientInstrumenters.java | 6 +- ...pacheHttpClientNetAttributesExtractor.java | 2 +- .../armeria/v1_3/ArmeriaDecorators.java | 35 +---- .../v1_3/ArmeriaNetAttributesExtractor.java | 4 +- .../jdbc/JdbcNetAttributesExtractor.java | 2 +- .../PeerServiceAttributesExtractor.java | 29 +++- ...PeerServiceAttributesExtractorFactory.java | 49 ++++++ .../PeerServiceAttributesExtractorTest.java | 139 ++++++++++++++++++ 13 files changed, 236 insertions(+), 40 deletions(-) create mode 100644 javaagent-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/instrumenter/ReflectionPeerServiceAttributesExtractorFactory.java create mode 100644 javaagent-api/src/test/groovy/io/opentelemetry/javaagent/instrumentation/api/instrumenter/PeerServiceAttributesExtractorTest.java diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/InetSocketAddressNetAttributesExtractor.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/InetSocketAddressNetAttributesExtractor.java index 92163af06155..2047b0239e67 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/InetSocketAddressNetAttributesExtractor.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/InetSocketAddressNetAttributesExtractor.java @@ -25,7 +25,7 @@ public abstract class InetSocketAddressNetAttributesExtractor * phases of processing. */ @Nullable - protected abstract InetSocketAddress getAddress(REQUEST request, @Nullable RESPONSE response); + public abstract InetSocketAddress getAddress(REQUEST request, @Nullable RESPONSE response); @Override @Nullable diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetAttributesExtractor.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetAttributesExtractor.java index 305424f04abf..9fb03c66f9cc 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetAttributesExtractor.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetAttributesExtractor.java @@ -42,7 +42,7 @@ protected final void onEnd( } @Nullable - protected abstract String transport(REQUEST request); + public abstract String transport(REQUEST request); /** * This method will be called twice: both when the request starts ({@code response} is always null diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/InetSocketAddressNetAttributesExtractorTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/InetSocketAddressNetAttributesExtractorTest.java index 9743e1de71be..dfde3f76f462 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/InetSocketAddressNetAttributesExtractorTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/InetSocketAddressNetAttributesExtractorTest.java @@ -29,7 +29,7 @@ protected InetSocketAddress getAddress( } @Override - protected String transport(InetSocketAddress inetSocketAddress) { + public String transport(InetSocketAddress inetSocketAddress) { return SemanticAttributes.NetTransportValues.IP_TCP; } }; diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetAttributesExtractorTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetAttributesExtractorTest.java index 4dc394fb0a97..a81a2e5ae9e8 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetAttributesExtractorTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/NetAttributesExtractorTest.java @@ -21,7 +21,7 @@ static class TestNetAttributesExtractor extends NetAttributesExtractor, Map> { @Override - protected String transport(Map request) { + public String transport(Map request) { return request.get("transport"); } diff --git a/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientNetAttributesExtractor.java b/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientNetAttributesExtractor.java index 5d0bd72f808d..d8c1ce772d0a 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientNetAttributesExtractor.java +++ b/instrumentation/apache-httpclient/apache-httpclient-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v2_0/ApacheHttpClientNetAttributesExtractor.java @@ -15,7 +15,7 @@ final class ApacheHttpClientNetAttributesExtractor extends NetAttributesExtractor { @Override - protected String transport(HttpMethod request) { + public String transport(HttpMethod request) { return SemanticAttributes.NetTransportValues.IP_TCP; } diff --git a/instrumentation/apache-httpclient/apache-httpclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v4_0/ApacheHttpClientInstrumenters.java b/instrumentation/apache-httpclient/apache-httpclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v4_0/ApacheHttpClientInstrumenters.java index 50fcdc33483d..777db4adec26 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v4_0/ApacheHttpClientInstrumenters.java +++ b/instrumentation/apache-httpclient/apache-httpclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v4_0/ApacheHttpClientInstrumenters.java @@ -12,6 +12,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; +import io.opentelemetry.javaagent.instrumentation.api.instrumenter.PeerServiceAttributesExtractor; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpUriRequest; @@ -28,13 +29,16 @@ public final class ApacheHttpClientInstrumenters { HttpSpanNameExtractor.create(httpAttributesExtractor); SpanStatusExtractor spanStatusExtractor = HttpSpanStatusExtractor.create(httpAttributesExtractor); + ApacheHttpClientNetAttributesExtractor netAttributesExtractor = + new ApacheHttpClientNetAttributesExtractor(); INSTRUMENTER = Instrumenter.newBuilder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, spanNameExtractor) .setSpanStatusExtractor(spanStatusExtractor) .addAttributesExtractor(httpAttributesExtractor) - .addAttributesExtractor(new ApacheHttpClientNetAttributesExtractor()) + .addAttributesExtractor(netAttributesExtractor) + .addAttributesExtractor(PeerServiceAttributesExtractor.create(netAttributesExtractor)) .newClientInstrumenter(new HttpHeaderSetter()); } diff --git a/instrumentation/apache-httpclient/apache-httpclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v4_0/ApacheHttpClientNetAttributesExtractor.java b/instrumentation/apache-httpclient/apache-httpclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v4_0/ApacheHttpClientNetAttributesExtractor.java index 9a942fa4608b..3a1f152ec676 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v4_0/ApacheHttpClientNetAttributesExtractor.java +++ b/instrumentation/apache-httpclient/apache-httpclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v4_0/ApacheHttpClientNetAttributesExtractor.java @@ -21,7 +21,7 @@ final class ApacheHttpClientNetAttributesExtractor LoggerFactory.getLogger(ApacheHttpClientNetAttributesExtractor.class); @Override - protected String transport(HttpUriRequest request) { + public String transport(HttpUriRequest request) { return SemanticAttributes.NetTransportValues.IP_TCP; } diff --git a/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaDecorators.java b/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaDecorators.java index 37076eb08574..9b6b32213c51 100644 --- a/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaDecorators.java +++ b/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaDecorators.java @@ -10,21 +10,15 @@ import com.linecorp.armeria.common.logging.RequestLog; import com.linecorp.armeria.server.HttpService; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaTracing; import io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaTracingBuilder; import io.opentelemetry.javaagent.instrumentation.api.instrumenter.PeerServiceAttributesExtractor; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; import java.util.function.Function; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; // Holds singleton references to decorators to match against during suppression. // https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/903 public final class ArmeriaDecorators { - private static final Logger log = LoggerFactory.getLogger(ArmeriaDecorators.class); - public static final Function CLIENT_DECORATOR; public static final Function SERVER_DECORATOR; @@ -32,28 +26,11 @@ public final class ArmeriaDecorators { static { ArmeriaTracingBuilder builder = ArmeriaTracing.newBuilder(GlobalOpenTelemetry.get()); - Constructor> constructor = null; - try { - Class> - netAttributesExtractorClass = - (Class>) - Class.forName( - "io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaNetAttributesExtractor"); - constructor = netAttributesExtractorClass.getDeclaredConstructor(); - constructor.setAccessible(true); - NetAttributesExtractor netAttributesExtractor = - constructor.newInstance(); - builder.addAttributeExtractor(PeerServiceAttributesExtractor.create(netAttributesExtractor)); - } catch (ClassNotFoundException - | NoSuchMethodException - | IllegalAccessException - | InstantiationException - | InvocationTargetException e) { - log.warn("Could not add PeerServiceAttributesExtractor to armeria", e); - } finally { - if (constructor != null) { - constructor.setAccessible(false); - } + AttributesExtractor peerServiceAttributesExtractor = + PeerServiceAttributesExtractor.createUsingReflection( + "io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaNetAttributesExtractor"); + if (peerServiceAttributesExtractor != null) { + builder.addAttributeExtractor(peerServiceAttributesExtractor); } ArmeriaTracing tracing = builder.build(); diff --git a/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaNetAttributesExtractor.java b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaNetAttributesExtractor.java index 2b4c22bc7542..4151e907f566 100644 --- a/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaNetAttributesExtractor.java +++ b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaNetAttributesExtractor.java @@ -17,13 +17,13 @@ final class ArmeriaNetAttributesExtractor extends InetSocketAddressNetAttributesExtractor { @Override - protected String transport(RequestContext requestContext) { + public String transport(RequestContext requestContext) { return SemanticAttributes.NetTransportValues.IP_TCP; } @Override @Nullable - protected InetSocketAddress getAddress( + public InetSocketAddress getAddress( RequestContext requestContext, @Nullable RequestLog requestLog) { SocketAddress address = requestContext.remoteAddress(); if (address instanceof InetSocketAddress) { diff --git a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcNetAttributesExtractor.java b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcNetAttributesExtractor.java index 06b0573c7e9f..83cfd5aa873f 100644 --- a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcNetAttributesExtractor.java +++ b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcNetAttributesExtractor.java @@ -12,7 +12,7 @@ final class JdbcNetAttributesExtractor extends NetAttributesExtractorthe + * specification. + * + *

Peer service name mappings can be configured using the {@code + * otel.instrumentation.common.peer-service-mapping} configuration property. The format used is a + * comma-separated list of {@code host=name} pairs. + */ public final class PeerServiceAttributesExtractor extends AttributesExtractor { private static final Map JAVAAGENT_PEER_SERVICE_MAPPING = @@ -28,12 +38,29 @@ public final class PeerServiceAttributesExtractor this.netAttributesExtractor = netAttributesExtractor; } - public static AttributesExtractor create( + /** + * Returns a new {@link PeerServiceAttributesExtractor} that will use the passed {@code + * netAttributesExtractor} instance to determine the value of the {@code peer.service} attribute. + */ + public static PeerServiceAttributesExtractor create( NetAttributesExtractor netAttributesExtractor) { return new PeerServiceAttributesExtractor<>( JAVAAGENT_PEER_SERVICE_MAPPING, netAttributesExtractor); } + /** + * Returns a new {@link PeerServiceAttributesExtractor} that will create a new instance of type + * {@code netAttributesExtractorImplClassName} (which must extend {@link NetAttributesExtractor}) + * and use it to determine the value of the {@code peer.service} attribute. + */ + @Nullable + public static + PeerServiceAttributesExtractor createUsingReflection( + String netAttributesExtractorImplClassName) { + return ReflectionPeerServiceAttributesExtractorFactory.create( + netAttributesExtractorImplClassName); + } + @Override protected void onStart(AttributesBuilder attributes, REQUEST request) { onEnd(attributes, request, null); diff --git a/javaagent-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/instrumenter/ReflectionPeerServiceAttributesExtractorFactory.java b/javaagent-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/instrumenter/ReflectionPeerServiceAttributesExtractorFactory.java new file mode 100644 index 000000000000..5bdcf2e19dea --- /dev/null +++ b/javaagent-api/src/main/java/io/opentelemetry/javaagent/instrumentation/api/instrumenter/ReflectionPeerServiceAttributesExtractorFactory.java @@ -0,0 +1,49 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.api.instrumenter; + +import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +final class ReflectionPeerServiceAttributesExtractorFactory { + private static final Logger log = + LoggerFactory.getLogger(ReflectionPeerServiceAttributesExtractorFactory.class); + + @Nullable + static PeerServiceAttributesExtractor create( + String netAttributesImplClassName) { + Constructor> constructor = null; + try { + Class> netAttributesExtractorClass = + (Class>) + Class.forName(netAttributesImplClassName); + constructor = netAttributesExtractorClass.getDeclaredConstructor(); + constructor.setAccessible(true); + NetAttributesExtractor netAttributesExtractor = constructor.newInstance(); + return PeerServiceAttributesExtractor.create(netAttributesExtractor); + } catch (ClassNotFoundException + | NoSuchMethodException + | IllegalAccessException + | InstantiationException + | InvocationTargetException e) { + log.warn( + "Could not add PeerServiceAttributesExtractor wrapping {}", + netAttributesImplClassName, + e); + return null; + } finally { + if (constructor != null) { + constructor.setAccessible(false); + } + } + } + + private ReflectionPeerServiceAttributesExtractorFactory() {} +} diff --git a/javaagent-api/src/test/groovy/io/opentelemetry/javaagent/instrumentation/api/instrumenter/PeerServiceAttributesExtractorTest.java b/javaagent-api/src/test/groovy/io/opentelemetry/javaagent/instrumentation/api/instrumenter/PeerServiceAttributesExtractorTest.java new file mode 100644 index 000000000000..300f9a7e28cd --- /dev/null +++ b/javaagent-api/src/test/groovy/io/opentelemetry/javaagent/instrumentation/api/instrumenter/PeerServiceAttributesExtractorTest.java @@ -0,0 +1,139 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.api.instrumenter; + +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; +import static java.util.Collections.singletonMap; +import static org.assertj.core.api.Assertions.entry; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import java.util.HashMap; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class PeerServiceAttributesExtractorTest { + @Mock NetAttributesExtractor netAttributesExtractor; + + @Test + void shouldNotSetAnyValueIfNetExtractorReturnsNulls() { + // given + Map peerServiceMapping = singletonMap("1.2.3.4", "myService"); + + PeerServiceAttributesExtractor underTest = + new PeerServiceAttributesExtractor<>(peerServiceMapping, netAttributesExtractor); + + // when + AttributesBuilder attributes = Attributes.builder(); + underTest.onStart(attributes, "request"); + underTest.onEnd(attributes, "request", "response"); + + // then + assertTrue(attributes.build().isEmpty()); + } + + @Test + void shouldNotSetAnyValueIfPeerNameDoesNotMatch() { + // given + Map peerServiceMapping = singletonMap("example.com", "myService"); + + PeerServiceAttributesExtractor underTest = + new PeerServiceAttributesExtractor<>(peerServiceMapping, netAttributesExtractor); + + given(netAttributesExtractor.peerName(any(), any())).willReturn("example2.com"); + + // when + AttributesBuilder startAttributes = Attributes.builder(); + underTest.onStart(startAttributes, "request"); + AttributesBuilder endAttributes = Attributes.builder(); + underTest.onEnd(endAttributes, "request", "response"); + + // then + assertTrue(startAttributes.build().isEmpty()); + assertTrue(endAttributes.build().isEmpty()); + } + + @Test + void shouldNotSetAnyValueIfPeerIpDoesNotMatch() { + // given + Map peerServiceMapping = singletonMap("1.2.3.4", "myService"); + + PeerServiceAttributesExtractor underTest = + new PeerServiceAttributesExtractor<>(peerServiceMapping, netAttributesExtractor); + + given(netAttributesExtractor.peerIp(any(), any())).willReturn("1.2.3.5"); + + // when + AttributesBuilder startAttributes = Attributes.builder(); + underTest.onStart(startAttributes, "request"); + AttributesBuilder endAttributes = Attributes.builder(); + underTest.onEnd(endAttributes, "request", "response"); + + // then + assertTrue(startAttributes.build().isEmpty()); + assertTrue(endAttributes.build().isEmpty()); + } + + @Test + void shouldSetPeerNameIfItMatches() { + // given + Map peerServiceMapping = new HashMap<>(); + peerServiceMapping.put("example.com", "myService"); + peerServiceMapping.put("1.2.3.4", "someOtherService"); + + PeerServiceAttributesExtractor underTest = + new PeerServiceAttributesExtractor<>(peerServiceMapping, netAttributesExtractor); + + given(netAttributesExtractor.peerName(any(), any())).willReturn("example.com"); + + // when + AttributesBuilder startAttributes = Attributes.builder(); + underTest.onStart(startAttributes, "request"); + AttributesBuilder endAttributes = Attributes.builder(); + underTest.onEnd(endAttributes, "request", "response"); + + // then + assertThat(startAttributes.build()) + .containsOnly(entry(SemanticAttributes.PEER_SERVICE, "myService")); + assertThat(endAttributes.build()) + .containsOnly(entry(SemanticAttributes.PEER_SERVICE, "myService")); + } + + @Test + void shouldSetPeerIpIfItMatchesAndNameDoesNot() { + // given + Map peerServiceMapping = new HashMap<>(); + peerServiceMapping.put("example.com", "myService"); + peerServiceMapping.put("1.2.3.4", "someOtherService"); + + PeerServiceAttributesExtractor underTest = + new PeerServiceAttributesExtractor<>(peerServiceMapping, netAttributesExtractor); + + given(netAttributesExtractor.peerName(any(), any())).willReturn("test.com"); + given(netAttributesExtractor.peerIp(any(), any())).willReturn("1.2.3.4"); + + // when + AttributesBuilder startAttributes = Attributes.builder(); + underTest.onStart(startAttributes, "request"); + AttributesBuilder endAttributes = Attributes.builder(); + underTest.onEnd(endAttributes, "request", "response"); + + // then + assertThat(startAttributes.build()) + .containsOnly(entry(SemanticAttributes.PEER_SERVICE, "someOtherService")); + assertThat(endAttributes.build()) + .containsOnly(entry(SemanticAttributes.PEER_SERVICE, "someOtherService")); + } +} From 7d429e1f01d5da57b9cb1f334525527f14abf006 Mon Sep 17 00:00:00 2001 From: Mateusz Rzeszutek Date: Mon, 24 May 2021 16:35:47 +0200 Subject: [PATCH 4/5] Fix tests --- .../net/InetSocketAddressNetAttributesExtractorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/InetSocketAddressNetAttributesExtractorTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/InetSocketAddressNetAttributesExtractorTest.java index dfde3f76f462..292441d223be 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/InetSocketAddressNetAttributesExtractorTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/InetSocketAddressNetAttributesExtractorTest.java @@ -23,7 +23,7 @@ class InetSocketAddressNetAttributesExtractorTest { extractor = new InetSocketAddressNetAttributesExtractor() { @Override - protected InetSocketAddress getAddress( + public InetSocketAddress getAddress( InetSocketAddress request, InetSocketAddress response) { return response != null ? response : request; } From 486af3fa8b342a0893f059bd8cdb4521572c2962 Mon Sep 17 00:00:00 2001 From: Mateusz Rzeszutek Date: Tue, 25 May 2021 13:30:10 +0200 Subject: [PATCH 5/5] Add peer.service to apache-httpclient-5.0, jedis-1.4, lettuce-4.0 --- .../v5_0/ApacheHttpClientInstrumenters.java | 6 +++++- .../v5_0/ApacheHttpClientNetAttributesExtractor.java | 8 ++++---- .../instrumentation/jedis/v1_4/JedisInstrumenters.java | 5 ++++- .../jedis/v1_4/JedisNetAttributesExtractor.java | 8 ++++---- .../lettuce/v4_0/LettuceInstrumenters.java | 5 ++++- .../lettuce/v4_0/LettuceNetAttributesExtractor.java | 8 ++++---- 6 files changed, 25 insertions(+), 15 deletions(-) diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v5_0/ApacheHttpClientInstrumenters.java b/instrumentation/apache-httpclient/apache-httpclient-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v5_0/ApacheHttpClientInstrumenters.java index 80a75b080091..c4ae1f501f82 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v5_0/ApacheHttpClientInstrumenters.java +++ b/instrumentation/apache-httpclient/apache-httpclient-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v5_0/ApacheHttpClientInstrumenters.java @@ -12,6 +12,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor; +import io.opentelemetry.javaagent.instrumentation.api.instrumenter.PeerServiceAttributesExtractor; import org.apache.hc.core5.http.ClassicHttpRequest; import org.apache.hc.core5.http.HttpResponse; @@ -28,13 +29,16 @@ public final class ApacheHttpClientInstrumenters { HttpSpanNameExtractor.create(httpAttributesExtractor); SpanStatusExtractor spanStatusExtractor = HttpSpanStatusExtractor.create(httpAttributesExtractor); + ApacheHttpClientNetAttributesExtractor netAttributesExtractor = + new ApacheHttpClientNetAttributesExtractor(); INSTRUMENTER = Instrumenter.newBuilder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, spanNameExtractor) .setSpanStatusExtractor(spanStatusExtractor) .addAttributesExtractor(httpAttributesExtractor) - .addAttributesExtractor(new ApacheHttpClientNetAttributesExtractor()) + .addAttributesExtractor(netAttributesExtractor) + .addAttributesExtractor(PeerServiceAttributesExtractor.create(netAttributesExtractor)) .newClientInstrumenter(new HttpHeaderSetter()); } diff --git a/instrumentation/apache-httpclient/apache-httpclient-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v5_0/ApacheHttpClientNetAttributesExtractor.java b/instrumentation/apache-httpclient/apache-httpclient-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v5_0/ApacheHttpClientNetAttributesExtractor.java index b764ed085948..951330a4a47b 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v5_0/ApacheHttpClientNetAttributesExtractor.java +++ b/instrumentation/apache-httpclient/apache-httpclient-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v5_0/ApacheHttpClientNetAttributesExtractor.java @@ -20,17 +20,17 @@ final class ApacheHttpClientNetAttributesExtractor LoggerFactory.getLogger(ApacheHttpClientNetAttributesExtractor.class); @Override - protected String transport(ClassicHttpRequest request) { + public String transport(ClassicHttpRequest request) { return SemanticAttributes.NetTransportValues.IP_TCP; } @Override - protected @Nullable String peerName(ClassicHttpRequest request, @Nullable HttpResponse response) { + public @Nullable String peerName(ClassicHttpRequest request, @Nullable HttpResponse response) { return request.getAuthority().getHostName(); } @Override - protected Integer peerPort(ClassicHttpRequest request, @Nullable HttpResponse response) { + public Integer peerPort(ClassicHttpRequest request, @Nullable HttpResponse response) { int port = request.getAuthority().getPort(); if (port != -1) { return port; @@ -51,7 +51,7 @@ protected Integer peerPort(ClassicHttpRequest request, @Nullable HttpResponse re } @Override - protected @Nullable String peerIp(ClassicHttpRequest request, @Nullable HttpResponse response) { + public @Nullable String peerIp(ClassicHttpRequest request, @Nullable HttpResponse response) { return null; } } diff --git a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisInstrumenters.java b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisInstrumenters.java index 3568a7bfaa0e..c70a24e7d6ab 100644 --- a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisInstrumenters.java +++ b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisInstrumenters.java @@ -11,6 +11,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.db.DbAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.db.DbSpanNameExtractor; +import io.opentelemetry.javaagent.instrumentation.api.instrumenter.PeerServiceAttributesExtractor; public final class JedisInstrumenters { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.javaagent.jedis-1.4"; @@ -20,12 +21,14 @@ public final class JedisInstrumenters { static { DbAttributesExtractor attributesExtractor = new JedisDbAttributesExtractor(); SpanNameExtractor spanName = DbSpanNameExtractor.create(attributesExtractor); + JedisNetAttributesExtractor netAttributesExtractor = new JedisNetAttributesExtractor(); INSTRUMENTER = Instrumenter.newBuilder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, spanName) .addAttributesExtractor(attributesExtractor) - .addAttributesExtractor(new JedisNetAttributesExtractor()) + .addAttributesExtractor(netAttributesExtractor) + .addAttributesExtractor(PeerServiceAttributesExtractor.create(netAttributesExtractor)) .newInstrumenter(SpanKindExtractor.alwaysClient()); } diff --git a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisNetAttributesExtractor.java b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisNetAttributesExtractor.java index 611451cb8067..02051c92a37c 100644 --- a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisNetAttributesExtractor.java +++ b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisNetAttributesExtractor.java @@ -12,23 +12,23 @@ final class JedisNetAttributesExtractor extends NetAttributesExtractornewBuilder( GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, redisUri -> "CONNECT") - .addAttributesExtractor(new LettuceNetAttributesExtractor()) + .addAttributesExtractor(netAttributesExtractor) + .addAttributesExtractor(PeerServiceAttributesExtractor.create(netAttributesExtractor)) .addAttributesExtractor(new LettuceConnectAttributesExtractor()) .newInstrumenter(SpanKindExtractor.alwaysClient()); } diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceNetAttributesExtractor.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceNetAttributesExtractor.java index 3755c4689842..67c1e9ade5a9 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceNetAttributesExtractor.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceNetAttributesExtractor.java @@ -13,23 +13,23 @@ final class LettuceNetAttributesExtractor extends NetAttributesExtractor