Split NetAttributesExtractor into NetClientAttributesExtractor and NetServerAttributesExtractor (#4287)

* Net Extractors

* Either request or response but not both

* Fix merge conflicts

* Separate by OnStart/OnEnd

* PeerServiceAttributes

* Fix test

* Restructure to client/server

* Fix merge conflict in main

* more

* peer.service

* Feedback

* peer.service is only for clients

* Fix merge conflict

* rename

* Armeria

* peer.service is only for clients

* rename

* WIP

* Sync Dubbo with Armeria

* More Dubbo and Armeria

* gRPC

* Revert some Dubbo changes

* more peer.service

* Fix test

* Fix merge

* Fixes
This commit is contained in:
Trask Stalnaker 2021-10-07 15:40:15 -07:00 committed by GitHub
parent 581a5e3980
commit 63a2383905
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
77 changed files with 835 additions and 407 deletions

View File

@ -11,7 +11,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetServerAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.net.InetSocketAddress;
import java.util.Collections;
@ -120,13 +120,13 @@ public class InstrumenterBenchmark {
}
static class ConstantNetAttributesExtractor
extends InetSocketAddressNetAttributesExtractor<Void, Void> {
extends InetSocketAddressNetServerAttributesExtractor<Void, Void> {
private static final InetSocketAddress ADDRESS =
InetSocketAddress.createUnresolved("localhost", 8080);
@Override
public @Nullable InetSocketAddress getAddress(Void unused, @Nullable Void unused2) {
public @Nullable InetSocketAddress getAddress(Void unused) {
return ADDRESS;
}

View File

@ -9,7 +9,7 @@ import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.db.DbAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor;
import org.checkerframework.checker.nullness.qual.Nullable;
/**
@ -22,7 +22,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
*
* @see DbAttributesExtractor
* @see HttpClientAttributesExtractor
* @see NetAttributesExtractor
* @see NetServerAttributesExtractor
*/
public abstract class AttributesExtractor<REQUEST, RESPONSE> {
/**
@ -51,4 +51,13 @@ public abstract class AttributesExtractor<REQUEST, RESPONSE> {
attributes.put(key, value);
}
}
/**
* Returns an {@link AttributesExtractor} implementation that always extracts the provided
* constant value.
*/
public static <REQUEST, RESPONSE, T> AttributesExtractor<REQUEST, RESPONSE> constant(
AttributeKey<T> attributeKey, T attributeValue) {
return new ConstantAttributesExtractor<>(attributeKey, attributeValue);
}
}

View File

@ -0,0 +1,34 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.api.instrumenter;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.AttributesBuilder;
import org.checkerframework.checker.nullness.qual.Nullable;
final class ConstantAttributesExtractor<REQUEST, RESPONSE, T>
extends AttributesExtractor<REQUEST, RESPONSE> {
private final AttributeKey<T> attributeKey;
private final T attributeValue;
ConstantAttributesExtractor(AttributeKey<T> attributeKey, T attributeValue) {
this.attributeKey = attributeKey;
this.attributeValue = attributeValue;
}
@Override
protected void onStart(AttributesBuilder attributes, REQUEST request) {
attributes.put(attributeKey, attributeValue);
}
@Override
protected void onEnd(
AttributesBuilder attributes,
REQUEST request,
@Nullable RESPONSE response,
@Nullable Throwable error) {}
}

View File

@ -7,7 +7,7 @@ package io.opentelemetry.instrumentation.api.instrumenter;
import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.util.Map;
import org.checkerframework.checker.nullness.qual.Nullable;
@ -27,14 +27,14 @@ public final class PeerServiceAttributesExtractor<REQUEST, RESPONSE>
Config.get().getMap("otel.instrumentation.common.peer-service-mapping");
private final Map<String, String> peerServiceMapping;
private final NetAttributesExtractor<REQUEST, RESPONSE> netAttributesExtractor;
private final NetClientAttributesExtractor<REQUEST, RESPONSE> netClientAttributesExtractor;
// visible for tests
PeerServiceAttributesExtractor(
Map<String, String> peerServiceMapping,
NetAttributesExtractor<REQUEST, RESPONSE> netAttributesExtractor) {
NetClientAttributesExtractor<REQUEST, RESPONSE> netClientAttributesExtractor) {
this.peerServiceMapping = peerServiceMapping;
this.netAttributesExtractor = netAttributesExtractor;
this.netClientAttributesExtractor = netClientAttributesExtractor;
}
/**
@ -42,15 +42,13 @@ public final class PeerServiceAttributesExtractor<REQUEST, RESPONSE>
* netAttributesExtractor} instance to determine the value of the {@code peer.service} attribute.
*/
public static <REQUEST, RESPONSE> PeerServiceAttributesExtractor<REQUEST, RESPONSE> create(
NetAttributesExtractor<REQUEST, RESPONSE> netAttributesExtractor) {
NetClientAttributesExtractor<REQUEST, RESPONSE> netAttributesExtractor) {
return new PeerServiceAttributesExtractor<>(
JAVAAGENT_PEER_SERVICE_MAPPING, netAttributesExtractor);
}
@Override
protected void onStart(AttributesBuilder attributes, REQUEST request) {
onEnd(attributes, request, null, null);
}
protected void onStart(AttributesBuilder attributes, REQUEST request) {}
@Override
protected void onEnd(
@ -58,10 +56,10 @@ public final class PeerServiceAttributesExtractor<REQUEST, RESPONSE>
REQUEST request,
@Nullable RESPONSE response,
@Nullable Throwable error) {
String peerName = netAttributesExtractor.peerName(request, response);
String peerName = netClientAttributesExtractor.peerName(request, response);
String peerService = mapToPeerService(peerName);
if (peerService == null) {
String peerIp = netAttributesExtractor.peerIp(request, response);
String peerIp = netClientAttributesExtractor.peerIp(request, response);
peerService = mapToPeerService(peerIp);
}
if (peerService != null) {

View File

@ -13,17 +13,12 @@ import org.checkerframework.checker.nullness.qual.Nullable;
* Extractor of <a
* href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/span-general.md#general-network-connection-attributes">Network
* attributes</a> from a {@link InetSocketAddress}. Most network libraries will provide access to a
* {@link InetSocketAddress} so this is a convenient alternative to {@link NetAttributesExtractor}.
* There is no meaning to implement both in the same instrumentation.
* {@link InetSocketAddress} so this is a convenient alternative to {@link
* NetClientAttributesExtractor}. There is no meaning to implement both in the same instrumentation.
*/
public abstract class InetSocketAddressNetAttributesExtractor<REQUEST, RESPONSE>
extends NetAttributesExtractor<REQUEST, RESPONSE> {
public abstract class InetSocketAddressNetClientAttributesExtractor<REQUEST, RESPONSE>
extends NetClientAttributesExtractor<REQUEST, RESPONSE> {
/**
* This method will be called twice: both when the request starts ({@code response} is always null
* then) and when the response ends. This way it is possible to capture net attributes in both
* phases of processing.
*/
@Nullable
public abstract InetSocketAddress getAddress(REQUEST request, @Nullable RESPONSE response);

View File

@ -0,0 +1,61 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.api.instrumenter.net;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import org.checkerframework.checker.nullness.qual.Nullable;
/**
* Extractor of <a
* href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/span-general.md#general-network-connection-attributes">Network
* attributes</a> from a {@link InetSocketAddress}. Most network libraries will provide access to a
* {@link InetSocketAddress} so this is a convenient alternative to {@link
* NetServerAttributesExtractor}. There is no meaning to implement both in the same instrumentation.
*/
public abstract class InetSocketAddressNetServerAttributesExtractor<REQUEST, RESPONSE>
extends NetServerAttributesExtractor<REQUEST, RESPONSE> {
@Nullable
public abstract InetSocketAddress getAddress(REQUEST request);
@Override
@Nullable
public final String peerName(REQUEST request) {
InetSocketAddress address = getAddress(request);
if (address == null) {
return null;
}
if (address.getAddress() != null) {
return address.getAddress().getHostName();
}
return address.getHostString();
}
@Override
@Nullable
public final Integer peerPort(REQUEST request) {
InetSocketAddress address = getAddress(request);
if (address == null) {
return null;
}
return address.getPort();
}
@Override
@Nullable
public final String peerIp(REQUEST request) {
InetSocketAddress address = getAddress(request);
if (address == null) {
return null;
}
InetAddress remoteAddress = address.getAddress();
if (remoteAddress != null) {
return remoteAddress.getHostAddress();
}
return null;
}
}

View File

@ -14,28 +14,13 @@ import org.checkerframework.checker.nullness.qual.Nullable;
* Extractor of <a
* href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/span-general.md#general-network-connection-attributes">Network
* attributes</a>. It is common to have access to {@link java.net.InetSocketAddress}, in which case
* it is more convenient to use {@link InetSocketAddressNetAttributesExtractor}.
* it is more convenient to use {@link InetSocketAddressNetClientAttributesExtractor}.
*/
public abstract class NetAttributesExtractor<REQUEST, RESPONSE>
public abstract class NetClientAttributesExtractor<REQUEST, RESPONSE>
extends AttributesExtractor<REQUEST, RESPONSE> {
@Override
protected final void onStart(AttributesBuilder attributes, REQUEST request) {
set(attributes, SemanticAttributes.NET_TRANSPORT, transport(request));
String peerIp = peerIp(request, null);
String peerName = peerName(request, null);
if (peerName != null && !peerName.equals(peerIp)) {
set(attributes, SemanticAttributes.NET_PEER_NAME, peerName);
}
set(attributes, SemanticAttributes.NET_PEER_IP, peerIp);
Integer peerPort = peerPort(request, null);
if (peerPort != null) {
set(attributes, SemanticAttributes.NET_PEER_PORT, (long) peerPort);
}
}
protected final void onStart(AttributesBuilder attributes, REQUEST request) {}
@Override
protected final void onEnd(
@ -44,6 +29,8 @@ public abstract class NetAttributesExtractor<REQUEST, RESPONSE>
@Nullable RESPONSE response,
@Nullable Throwable error) {
set(attributes, SemanticAttributes.NET_TRANSPORT, transport(request, response));
String peerIp = peerIp(request, response);
String peerName = peerName(request, response);
@ -59,29 +46,14 @@ public abstract class NetAttributesExtractor<REQUEST, RESPONSE>
}
@Nullable
public abstract String transport(REQUEST request);
public abstract String transport(REQUEST request, @Nullable RESPONSE response);
/**
* This method will be called twice: both when the request starts ({@code response} is always null
* then) and when the response ends. This way it is possible to capture net attributes in both
* phases of processing.
*/
@Nullable
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
* then) and when the response ends. This way it is possible to capture net attributes in both
* phases of processing.
*/
@Nullable
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
* then) and when the response ends. This way it is possible to capture net attributes in both
* phases of processing.
*/
@Nullable
public abstract String peerIp(REQUEST request, @Nullable RESPONSE response);
}

View File

@ -0,0 +1,58 @@
/*
* 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.instrumenter.AttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import org.checkerframework.checker.nullness.qual.Nullable;
/**
* Extractor of <a
* href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/span-general.md#general-network-connection-attributes">Network
* attributes</a>. It is common to have access to {@link java.net.InetSocketAddress}, in which case
* it is more convenient to use {@link InetSocketAddressNetServerAttributesExtractor}.
*/
public abstract class NetServerAttributesExtractor<REQUEST, RESPONSE>
extends AttributesExtractor<REQUEST, RESPONSE> {
@Override
protected final void onStart(AttributesBuilder attributes, REQUEST request) {
set(attributes, SemanticAttributes.NET_TRANSPORT, transport(request));
String peerIp = peerIp(request);
String peerName = peerName(request);
if (peerName != null && !peerName.equals(peerIp)) {
set(attributes, SemanticAttributes.NET_PEER_NAME, peerName);
}
set(attributes, SemanticAttributes.NET_PEER_IP, peerIp);
Integer peerPort = peerPort(request);
if (peerPort != null) {
set(attributes, SemanticAttributes.NET_PEER_PORT, (long) peerPort);
}
}
@Override
protected final void onEnd(
AttributesBuilder attributes,
REQUEST request,
@Nullable RESPONSE response,
@Nullable Throwable error) {}
@Nullable
public abstract String transport(REQUEST request);
@Nullable
public abstract String peerName(REQUEST request);
@Nullable
public abstract Integer peerPort(REQUEST request);
@Nullable
public abstract String peerIp(REQUEST request);
}

View File

@ -27,7 +27,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttribut
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessageOperation;
import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcAttributesExtractor;
import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
import io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension;
@ -154,7 +154,7 @@ class InstrumenterTest {
MessagingAttributesExtractor<Map<String, String>, Map<String, String>> mockMessagingAttributes;
@Mock RpcAttributesExtractor<Map<String, String>, Map<String, String>> mockRpcAttributes;
@Mock NetAttributesExtractor<Map<String, String>, Map<String, String>> mockNetAttributes;
@Mock NetServerAttributesExtractor<Map<String, String>, Map<String, String>> mockNetAttributes;
@Test
void server() {
@ -668,7 +668,7 @@ class InstrumenterTest {
}
private static final class ConstantNetPeerIpExtractor<REQUEST, RESPONSE>
extends NetAttributesExtractor<REQUEST, RESPONSE> {
extends NetServerAttributesExtractor<REQUEST, RESPONSE> {
private final String peerIp;
@ -682,17 +682,17 @@ class InstrumenterTest {
}
@Override
public String peerName(REQUEST request, RESPONSE response) {
public String peerName(REQUEST request) {
return null;
}
@Override
public Integer peerPort(REQUEST request, RESPONSE response) {
public Integer peerPort(REQUEST request) {
return null;
}
@Override
public String peerIp(REQUEST request, RESPONSE response) {
public String peerIp(REQUEST request) {
return peerIp;
}
}

View File

@ -14,7 +14,7 @@ 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.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.util.HashMap;
import java.util.Map;
@ -25,7 +25,7 @@ import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
class PeerServiceAttributesExtractorTest {
@Mock NetAttributesExtractor<String, String> netAttributesExtractor;
@Mock NetClientAttributesExtractor<String, String> netAttributesExtractor;
@Test
void shouldNotSetAnyValueIfNetExtractorReturnsNulls() {
@ -105,8 +105,7 @@ class PeerServiceAttributesExtractorTest {
underTest.onEnd(endAttributes, "request", "response", null);
// then
assertThat(startAttributes.build())
.containsOnly(entry(SemanticAttributes.PEER_SERVICE, "myService"));
assertThat(startAttributes.build()).isEmpty();
assertThat(endAttributes.build())
.containsOnly(entry(SemanticAttributes.PEER_SERVICE, "myService"));
}
@ -131,8 +130,7 @@ class PeerServiceAttributesExtractorTest {
underTest.onEnd(endAttributes, "request", "response", null);
// then
assertThat(startAttributes.build())
.containsOnly(entry(SemanticAttributes.PEER_SERVICE, "someOtherService"));
assertThat(startAttributes.build()).isEmpty();
assertThat(endAttributes.build())
.containsOnly(entry(SemanticAttributes.PEER_SERVICE, "someOtherService"));
}

View File

@ -0,0 +1,99 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.api.instrumenter.net;
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
import static org.assertj.core.api.Assertions.entry;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.net.InetSocketAddress;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
class InetSocketAddressNetClientAttributesExtractorTest {
private final InetSocketAddressNetClientAttributesExtractor<InetSocketAddress, InetSocketAddress>
extractor =
new InetSocketAddressNetClientAttributesExtractor<
InetSocketAddress, InetSocketAddress>() {
@Override
public InetSocketAddress getAddress(
InetSocketAddress request, InetSocketAddress response) {
return response;
}
@Override
public String transport(InetSocketAddress request, InetSocketAddress response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}
};
@Test
void noInetSocketAddress() {
AttributesBuilder attributes = Attributes.builder();
extractor.onEnd(attributes, null, null, null);
assertThat(attributes.build())
.containsOnly(
entry(SemanticAttributes.NET_TRANSPORT, SemanticAttributes.NetTransportValues.IP_TCP));
}
@Test
void fullAddress() {
// given
InetSocketAddress request = new InetSocketAddress("github.com", 123);
assertThat(request.getAddress().getHostAddress()).isNotNull();
InetSocketAddress response = new InetSocketAddress("api.github.com", 456);
assertThat(request.getAddress().getHostAddress()).isNotNull();
// when
AttributesBuilder startAttributes = Attributes.builder();
extractor.onStart(startAttributes, request);
AttributesBuilder endAttributes = Attributes.builder();
extractor.onEnd(endAttributes, request, response, null);
// then
assertThat(startAttributes.build()).isEmpty();
assertThat(endAttributes.build())
.containsOnly(
entry(SemanticAttributes.NET_TRANSPORT, SemanticAttributes.NetTransportValues.IP_TCP),
entry(SemanticAttributes.NET_PEER_IP, response.getAddress().getHostAddress()),
entry(SemanticAttributes.NET_PEER_NAME, "api.github.com"),
entry(SemanticAttributes.NET_PEER_PORT, 456L));
}
@Test
void unresolved() {
// given
InetSocketAddress request = InetSocketAddress.createUnresolved("github.com", 123);
assertThat(request.getAddress()).isNull();
InetSocketAddress response = InetSocketAddress.createUnresolved("api.github.com", 456);
assertThat(request.getAddress()).isNull();
// when
AttributesBuilder startAttributes = Attributes.builder();
extractor.onStart(startAttributes, request);
AttributesBuilder endAttributes = Attributes.builder();
extractor.onEnd(endAttributes, request, response, null);
// then
assertThat(startAttributes.build()).isEmpty();
assertThat(endAttributes.build())
.containsOnly(
entry(SemanticAttributes.NET_TRANSPORT, SemanticAttributes.NetTransportValues.IP_TCP),
entry(SemanticAttributes.NET_PEER_NAME, "api.github.com"),
entry(SemanticAttributes.NET_PEER_PORT, 456L));
}
}

View File

@ -17,19 +17,19 @@ import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
class InetSocketAddressNetAttributesExtractorTest {
class InetSocketAddressNetServerAttributesExtractorTest {
private final InetSocketAddressNetAttributesExtractor<InetSocketAddress, InetSocketAddress>
private final InetSocketAddressNetServerAttributesExtractor<InetSocketAddress, InetSocketAddress>
extractor =
new InetSocketAddressNetAttributesExtractor<InetSocketAddress, InetSocketAddress>() {
new InetSocketAddressNetServerAttributesExtractor<
InetSocketAddress, InetSocketAddress>() {
@Override
public InetSocketAddress getAddress(
InetSocketAddress request, InetSocketAddress response) {
return response != null ? response : request;
public InetSocketAddress getAddress(InetSocketAddress request) {
return request;
}
@Override
public String transport(InetSocketAddress inetSocketAddress) {
public String transport(InetSocketAddress request) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}
};
@ -38,7 +38,6 @@ class InetSocketAddressNetAttributesExtractorTest {
void noInetSocketAddress() {
AttributesBuilder attributes = Attributes.builder();
extractor.onStart(attributes, null);
extractor.onEnd(attributes, null, null, null);
assertThat(attributes.build())
.containsOnly(
entry(SemanticAttributes.NET_TRANSPORT, SemanticAttributes.NetTransportValues.IP_TCP));
@ -47,43 +46,45 @@ class InetSocketAddressNetAttributesExtractorTest {
@Test
void fullAddress() {
// given
InetSocketAddress address = new InetSocketAddress("github.com", 123);
assertThat(address.getAddress().getHostAddress()).isNotNull();
InetSocketAddress request = new InetSocketAddress("github.com", 123);
assertThat(request.getAddress().getHostAddress()).isNotNull();
InetSocketAddress response = new InetSocketAddress("api.github.com", 456);
assertThat(request.getAddress().getHostAddress()).isNotNull();
// when
AttributesBuilder startAttributes = Attributes.builder();
extractor.onStart(startAttributes, address);
extractor.onStart(startAttributes, request);
AttributesBuilder endAttributes = Attributes.builder();
extractor.onEnd(endAttributes, null, address, null);
extractor.onEnd(endAttributes, request, response, null);
// then
assertThat(startAttributes.build())
.containsOnly(
entry(SemanticAttributes.NET_TRANSPORT, SemanticAttributes.NetTransportValues.IP_TCP),
entry(SemanticAttributes.NET_PEER_IP, address.getAddress().getHostAddress()),
entry(SemanticAttributes.NET_PEER_IP, request.getAddress().getHostAddress()),
entry(SemanticAttributes.NET_PEER_NAME, "github.com"),
entry(SemanticAttributes.NET_PEER_PORT, 123L));
assertThat(endAttributes.build())
.containsOnly(
entry(SemanticAttributes.NET_PEER_IP, address.getAddress().getHostAddress()),
entry(SemanticAttributes.NET_PEER_NAME, "github.com"),
entry(SemanticAttributes.NET_PEER_PORT, 123L));
assertThat(endAttributes.build()).isEmpty();
}
@Test
void unresolved() {
// given
InetSocketAddress address = InetSocketAddress.createUnresolved("github.com", 123);
assertThat(address.getAddress()).isNull();
InetSocketAddress request = InetSocketAddress.createUnresolved("github.com", 123);
assertThat(request.getAddress()).isNull();
InetSocketAddress response = InetSocketAddress.createUnresolved("api.github.com", 456);
assertThat(request.getAddress()).isNull();
// when
AttributesBuilder startAttributes = Attributes.builder();
extractor.onStart(startAttributes, address);
extractor.onStart(startAttributes, request);
AttributesBuilder endAttributes = Attributes.builder();
extractor.onEnd(endAttributes, null, address, null);
extractor.onEnd(endAttributes, request, response, null);
// then
assertThat(startAttributes.build())
@ -92,9 +93,6 @@ class InetSocketAddressNetAttributesExtractorTest {
entry(SemanticAttributes.NET_PEER_NAME, "github.com"),
entry(SemanticAttributes.NET_PEER_PORT, 123L));
assertThat(endAttributes.build())
.containsOnly(
entry(SemanticAttributes.NET_PEER_NAME, "github.com"),
entry(SemanticAttributes.NET_PEER_PORT, 123L));
assertThat(endAttributes.build()).isEmpty();
}
}

View File

@ -15,14 +15,14 @@ import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.Test;
class NetAttributesExtractorTest {
class NetClientAttributesExtractorTest {
static class TestNetAttributesExtractor
extends NetAttributesExtractor<Map<String, String>, Map<String, String>> {
static class TestNetClientAttributesExtractor
extends NetClientAttributesExtractor<Map<String, String>, Map<String, String>> {
@Override
public String transport(Map<String, String> request) {
return request.get("transport");
public String transport(Map<String, String> request, Map<String, String> response) {
return response.get("transport");
}
@Override
@ -30,7 +30,7 @@ class NetAttributesExtractorTest {
if (response != null) {
return response.get("peerName");
}
return request.get("peerName");
return null;
}
@Override
@ -38,7 +38,7 @@ class NetAttributesExtractorTest {
if (response != null) {
return Integer.valueOf(response.get("peerPort"));
}
return Integer.valueOf(request.get("peerPort"));
return null;
}
@Override
@ -46,7 +46,7 @@ class NetAttributesExtractorTest {
if (response != null) {
return response.get("peerIp");
}
return request.get("peerIp");
return null;
}
}
@ -64,7 +64,7 @@ class NetAttributesExtractorTest {
response.put("peerPort", "42");
response.put("peerIp", "4.3.2.1");
TestNetAttributesExtractor extractor = new TestNetAttributesExtractor();
TestNetClientAttributesExtractor extractor = new TestNetClientAttributesExtractor();
// when
AttributesBuilder startAttributes = Attributes.builder();
@ -74,12 +74,7 @@ class NetAttributesExtractorTest {
extractor.onEnd(endAttributes, request, response, null);
// then
assertThat(startAttributes.build())
.containsOnly(
entry(SemanticAttributes.NET_TRANSPORT, "TCP"),
entry(SemanticAttributes.NET_PEER_NAME, "github.com"),
entry(SemanticAttributes.NET_PEER_PORT, 123L),
entry(SemanticAttributes.NET_PEER_IP, "1.2.3.4"));
assertThat(startAttributes.build()).isEmpty();
assertThat(endAttributes.build())
.containsOnly(
@ -102,7 +97,7 @@ class NetAttributesExtractorTest {
response.put("peerPort", "42");
response.put("peerIp", "4.3.2.1");
TestNetAttributesExtractor extractor = new TestNetAttributesExtractor();
TestNetClientAttributesExtractor extractor = new TestNetClientAttributesExtractor();
// when
AttributesBuilder startAttributes = Attributes.builder();
@ -112,11 +107,7 @@ class NetAttributesExtractorTest {
extractor.onEnd(endAttributes, request, response, null);
// then
assertThat(startAttributes.build())
.containsOnly(
entry(SemanticAttributes.NET_TRANSPORT, "TCP"),
entry(SemanticAttributes.NET_PEER_PORT, 123L),
entry(SemanticAttributes.NET_PEER_IP, "1.2.3.4"));
assertThat(startAttributes.build()).isEmpty();
assertThat(endAttributes.build())
.containsOnly(

View File

@ -0,0 +1,110 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.api.instrumenter.net;
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
import static org.assertj.core.api.Assertions.entry;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.Test;
class NetServerAttributesExtractorTest {
static class TestNetServerAttributesExtractor
extends NetServerAttributesExtractor<Map<String, String>, Map<String, String>> {
@Override
public String transport(Map<String, String> request) {
return request.get("transport");
}
@Override
public String peerName(Map<String, String> request) {
return request.get("peerName");
}
@Override
public Integer peerPort(Map<String, String> request) {
return Integer.valueOf(request.get("peerPort"));
}
@Override
public String peerIp(Map<String, String> request) {
return request.get("peerIp");
}
}
@Test
void normal() {
// given
Map<String, String> request = new HashMap<>();
request.put("transport", "TCP");
request.put("peerName", "github.com");
request.put("peerPort", "123");
request.put("peerIp", "1.2.3.4");
Map<String, String> response = new HashMap<>();
response.put("peerName", "opentelemetry.io");
response.put("peerPort", "42");
response.put("peerIp", "4.3.2.1");
TestNetServerAttributesExtractor extractor = new TestNetServerAttributesExtractor();
// when
AttributesBuilder startAttributes = Attributes.builder();
extractor.onStart(startAttributes, request);
AttributesBuilder endAttributes = Attributes.builder();
extractor.onEnd(endAttributes, request, response, null);
// then
assertThat(startAttributes.build())
.containsOnly(
entry(SemanticAttributes.NET_TRANSPORT, "TCP"),
entry(SemanticAttributes.NET_PEER_NAME, "github.com"),
entry(SemanticAttributes.NET_PEER_PORT, 123L),
entry(SemanticAttributes.NET_PEER_IP, "1.2.3.4"));
assertThat(endAttributes.build()).isEmpty();
}
@Test
public void doesNotSetDuplicateAttributes() {
// given
Map<String, String> request = new HashMap<>();
request.put("transport", "TCP");
request.put("peerName", "1.2.3.4");
request.put("peerIp", "1.2.3.4");
request.put("peerPort", "123");
Map<String, String> response = new HashMap<>();
response.put("peerName", "4.3.2.1");
response.put("peerPort", "42");
response.put("peerIp", "4.3.2.1");
TestNetServerAttributesExtractor extractor = new TestNetServerAttributesExtractor();
// when
AttributesBuilder startAttributes = Attributes.builder();
extractor.onStart(startAttributes, request);
AttributesBuilder endAttributes = Attributes.builder();
extractor.onEnd(endAttributes, request, response, null);
// then
assertThat(startAttributes.build())
.containsOnly(
entry(SemanticAttributes.NET_TRANSPORT, "TCP"),
entry(SemanticAttributes.NET_PEER_PORT, 123L),
entry(SemanticAttributes.NET_PEER_IP, "1.2.3.4"));
assertThat(endAttributes.build()).isEmpty();
}
}

View File

@ -7,8 +7,6 @@ package io.opentelemetry.javaagent.instrumentation.apachedubbo.v2_7;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.apachedubbo.v2_7.DubboTracing;
import io.opentelemetry.instrumentation.apachedubbo.v2_7.internal.DubboNetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.PeerServiceAttributesExtractor;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.Filter;
import org.apache.dubbo.rpc.Invocation;
@ -21,12 +19,7 @@ public class OpenTelemetryFilter implements Filter {
private final Filter delegate;
public OpenTelemetryFilter() {
DubboNetAttributesExtractor netAttributesExtractor = new DubboNetAttributesExtractor();
delegate =
DubboTracing.newBuilder(GlobalOpenTelemetry.get())
.addAttributesExtractor(PeerServiceAttributesExtractor.create(netAttributesExtractor))
.build()
.newFilter();
delegate = DubboTracing.create(GlobalOpenTelemetry.get()).newFilter();
}
@Override

View File

@ -6,15 +6,20 @@
package io.opentelemetry.instrumentation.apachedubbo.v2_7;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.apachedubbo.v2_7.internal.DubboNetAttributesExtractor;
import io.opentelemetry.instrumentation.apachedubbo.v2_7.internal.DubboNetClientAttributesExtractor;
import io.opentelemetry.instrumentation.apachedubbo.v2_7.internal.DubboNetServerAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.PeerServiceAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.rpc.RpcSpanNameExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
import org.apache.dubbo.rpc.Result;
import org.checkerframework.checker.nullness.qual.Nullable;
/** A builder of {@link DubboTracing}. */
public final class DubboTracingBuilder {
@ -22,6 +27,7 @@ public final class DubboTracingBuilder {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.apache-dubbo-2.7";
private final OpenTelemetry openTelemetry;
@Nullable private String peerService;
private final List<AttributesExtractor<DubboRequest, Result>> attributesExtractors =
new ArrayList<>();
@ -29,6 +35,11 @@ public final class DubboTracingBuilder {
this.openTelemetry = openTelemetry;
}
/** Sets the {@code peer.service} attribute for http client spans. */
public void setPeerService(String peerService) {
this.peerService = peerService;
}
/**
* Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented
* items.
@ -42,19 +53,37 @@ public final class DubboTracingBuilder {
/** Returns a new {@link DubboTracing} with the settings of this {@link DubboTracingBuilder}. */
public DubboTracing build() {
DubboRpcAttributesExtractor rpcAttributesExtractor = new DubboRpcAttributesExtractor();
DubboNetAttributesExtractor netAttributesExtractor = new DubboNetAttributesExtractor();
SpanNameExtractor<DubboRequest> spanNameExtractor =
RpcSpanNameExtractor.create(rpcAttributesExtractor);
InstrumenterBuilder<DubboRequest, Result> builder =
Instrumenter.<DubboRequest, Result>newBuilder(
openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
.addAttributesExtractor(rpcAttributesExtractor)
.addAttributesExtractor(netAttributesExtractor)
.addAttributesExtractors(attributesExtractors);
DubboNetClientAttributesExtractor netClientAttributesExtractor =
new DubboNetClientAttributesExtractor();
InstrumenterBuilder<DubboRequest, Result> serverInstrumenterBuilder =
Instrumenter.newBuilder(openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor);
InstrumenterBuilder<DubboRequest, Result> clientInstrumenterBuilder =
Instrumenter.newBuilder(openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor);
Stream.of(serverInstrumenterBuilder, clientInstrumenterBuilder)
.forEach(
instrumenter ->
instrumenter
.addAttributesExtractors(rpcAttributesExtractor)
.addAttributesExtractors(attributesExtractors));
serverInstrumenterBuilder.addAttributesExtractor(new DubboNetServerAttributesExtractor());
clientInstrumenterBuilder.addAttributesExtractor(netClientAttributesExtractor);
if (peerService != null) {
clientInstrumenterBuilder.addAttributesExtractor(
AttributesExtractor.constant(SemanticAttributes.PEER_SERVICE, peerService));
} else {
clientInstrumenterBuilder.addAttributesExtractor(
PeerServiceAttributesExtractor.create(netClientAttributesExtractor));
}
return new DubboTracing(
builder.newServerInstrumenter(new DubboHeadersGetter()),
builder.newClientInstrumenter(new DubboHeadersSetter()));
serverInstrumenterBuilder.newServerInstrumenter(new DubboHeadersGetter()),
clientInstrumenterBuilder.newClientInstrumenter(new DubboHeadersSetter()));
}
}

View File

@ -0,0 +1,26 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.apachedubbo.v2_7.internal;
import io.opentelemetry.instrumentation.apachedubbo.v2_7.DubboRequest;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetClientAttributesExtractor;
import java.net.InetSocketAddress;
import org.apache.dubbo.rpc.Result;
import org.checkerframework.checker.nullness.qual.Nullable;
public final class DubboNetClientAttributesExtractor
extends InetSocketAddressNetClientAttributesExtractor<DubboRequest, Result> {
@Override
public @Nullable InetSocketAddress getAddress(DubboRequest request, @Nullable Result response) {
return request.context().getRemoteAddress();
}
@Override
public @Nullable String transport(DubboRequest request, @Nullable Result response) {
return null;
}
}

View File

@ -6,16 +6,16 @@
package io.opentelemetry.instrumentation.apachedubbo.v2_7.internal;
import io.opentelemetry.instrumentation.apachedubbo.v2_7.DubboRequest;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetServerAttributesExtractor;
import java.net.InetSocketAddress;
import org.apache.dubbo.rpc.Result;
import org.checkerframework.checker.nullness.qual.Nullable;
public final class DubboNetAttributesExtractor
extends InetSocketAddressNetAttributesExtractor<DubboRequest, Result> {
public final class DubboNetServerAttributesExtractor
extends InetSocketAddressNetServerAttributesExtractor<DubboRequest, Result> {
@Override
public @Nullable InetSocketAddress getAddress(DubboRequest request, @Nullable Result result) {
public @Nullable InetSocketAddress getAddress(DubboRequest request) {
return request.context().getRemoteAddress();
}

View File

@ -5,16 +5,16 @@
package io.opentelemetry.javaagent.instrumentation.apachehttpasyncclient;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import org.apache.http.HttpResponse;
import org.checkerframework.checker.nullness.qual.Nullable;
final class ApacheHttpAsyncClientNetAttributesExtractor
extends NetAttributesExtractor<ApacheHttpClientRequest, HttpResponse> {
extends NetClientAttributesExtractor<ApacheHttpClientRequest, HttpResponse> {
@Override
public String transport(ApacheHttpClientRequest request) {
public String transport(ApacheHttpClientRequest request, @Nullable HttpResponse response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}

View File

@ -5,17 +5,17 @@
package io.opentelemetry.javaagent.instrumentation.apachehttpclient.v2_0;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpMethod;
import org.checkerframework.checker.nullness.qual.Nullable;
final class ApacheHttpClientNetAttributesExtractor
extends NetAttributesExtractor<HttpMethod, HttpMethod> {
extends NetClientAttributesExtractor<HttpMethod, HttpMethod> {
@Override
public String transport(HttpMethod request) {
public String transport(HttpMethod request, @Nullable HttpMethod response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}

View File

@ -5,16 +5,16 @@
package io.opentelemetry.javaagent.instrumentation.apachehttpclient.v4_0;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import org.apache.http.HttpResponse;
import org.checkerframework.checker.nullness.qual.Nullable;
final class ApacheHttpClientNetAttributesExtractor
extends NetAttributesExtractor<ApacheHttpClientRequest, HttpResponse> {
extends NetClientAttributesExtractor<ApacheHttpClientRequest, HttpResponse> {
@Override
public String transport(ApacheHttpClientRequest request) {
public String transport(ApacheHttpClientRequest request, @Nullable HttpResponse response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}

View File

@ -5,16 +5,16 @@
package io.opentelemetry.instrumentation.apachehttpclient.v4_3;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import org.apache.http.HttpResponse;
import org.checkerframework.checker.nullness.qual.Nullable;
final class ApacheHttpClientNetAttributesExtractor
extends NetAttributesExtractor<ApacheHttpClientRequest, HttpResponse> {
extends NetClientAttributesExtractor<ApacheHttpClientRequest, HttpResponse> {
@Override
public String transport(ApacheHttpClientRequest request) {
public String transport(ApacheHttpClientRequest request, @Nullable HttpResponse response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}

View File

@ -5,7 +5,7 @@
package io.opentelemetry.javaagent.instrumentation.apachehttpclient.v5_0;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import org.apache.hc.core5.http.ClassicHttpRequest;
import org.apache.hc.core5.http.HttpResponse;
@ -14,13 +14,13 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
final class ApacheHttpClientNetAttributesExtractor
extends NetAttributesExtractor<ClassicHttpRequest, HttpResponse> {
extends NetClientAttributesExtractor<ClassicHttpRequest, HttpResponse> {
private static final Logger logger =
LoggerFactory.getLogger(ApacheHttpClientNetAttributesExtractor.class);
@Override
public String transport(ClassicHttpRequest request) {
public String transport(ClassicHttpRequest request, @Nullable HttpResponse response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}

View File

@ -6,13 +6,9 @@
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.PeerServiceAttributesExtractor;
import io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaTracing;
import io.opentelemetry.instrumentation.armeria.v1_3.internal.ArmeriaNetAttributesExtractor;
import java.util.function.Function;
// Holds singleton references to decorators to match against during suppression.
@ -23,13 +19,7 @@ public final class ArmeriaSingletons {
public static final Function<? super HttpService, ? extends HttpService> SERVER_DECORATOR;
static {
PeerServiceAttributesExtractor<RequestContext, RequestLog> peerServiceAttributesExtractor =
PeerServiceAttributesExtractor.create(new ArmeriaNetAttributesExtractor());
ArmeriaTracing tracing =
ArmeriaTracing.newBuilder(GlobalOpenTelemetry.get())
.addAttributeExtractor(peerServiceAttributesExtractor)
.build();
ArmeriaTracing tracing = ArmeriaTracing.create(GlobalOpenTelemetry.get());
CLIENT_DECORATOR = tracing.newClientDecorator();
SERVER_DECORATOR = tracing.newServiceDecorator();

View File

@ -14,23 +14,28 @@ import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.PeerServiceAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
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.armeria.v1_3.internal.ArmeriaNetAttributesExtractor;
import io.opentelemetry.instrumentation.armeria.v1_3.internal.ArmeriaNetClientAttributesExtractor;
import io.opentelemetry.instrumentation.armeria.v1_3.internal.ArmeriaNetServerAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;
import org.checkerframework.checker.nullness.qual.Nullable;
public final class ArmeriaTracingBuilder {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.armeria-1.3";
private final OpenTelemetry openTelemetry;
@Nullable private String peerService;
private CapturedHttpHeaders capturedHttpClientHeaders = CapturedHttpHeaders.client(Config.get());
private CapturedHttpHeaders capturedHttpServerHeaders = CapturedHttpHeaders.server(Config.get());
@ -65,6 +70,11 @@ public final class ArmeriaTracingBuilder {
return this;
}
/** Sets the {@code peer.service} attribute for http client spans. */
public void setPeerService(String peerService) {
this.peerService = peerService;
}
/**
* Configure the HTTP client instrumentation to capture chosen HTTP request and response headers
* as span attributes.
@ -92,18 +102,16 @@ public final class ArmeriaTracingBuilder {
}
public ArmeriaTracing build() {
ArmeriaHttpClientAttributesExtractor clientAttributesExtractor =
ArmeriaHttpClientAttributesExtractor httpClientAttributesExtractor =
new ArmeriaHttpClientAttributesExtractor(capturedHttpClientHeaders);
ArmeriaHttpServerAttributesExtractor serverAttributesExtractor =
new ArmeriaHttpServerAttributesExtractor(capturedHttpServerHeaders);
ArmeriaNetAttributesExtractor netAttributesExtractor = new ArmeriaNetAttributesExtractor();
InstrumenterBuilder<ClientRequestContext, RequestLog> clientInstrumenterBuilder =
Instrumenter.newBuilder(
openTelemetry,
INSTRUMENTATION_NAME,
HttpSpanNameExtractor.create(clientAttributesExtractor));
HttpSpanNameExtractor.create(httpClientAttributesExtractor));
InstrumenterBuilder<ServiceRequestContext, RequestLog> serverInstrumenterBuilder =
Instrumenter.newBuilder(
openTelemetry,
@ -111,25 +119,34 @@ public final class ArmeriaTracingBuilder {
HttpSpanNameExtractor.create(serverAttributesExtractor));
Stream.of(clientInstrumenterBuilder, serverInstrumenterBuilder)
.forEach(
instrumenter ->
instrumenter
.addAttributesExtractor(netAttributesExtractor)
.addAttributesExtractors(additionalExtractors));
.forEach(instrumenter -> instrumenter.addAttributesExtractors(additionalExtractors));
ArmeriaNetClientAttributesExtractor netClientAttributesExtractor =
new ArmeriaNetClientAttributesExtractor();
clientInstrumenterBuilder
.setSpanStatusExtractor(
statusExtractorTransformer.apply(
HttpSpanStatusExtractor.create(clientAttributesExtractor)))
.addAttributesExtractor(clientAttributesExtractor)
HttpSpanStatusExtractor.create(httpClientAttributesExtractor)))
.addAttributesExtractor(netClientAttributesExtractor)
.addAttributesExtractor(httpClientAttributesExtractor)
.addRequestMetrics(HttpClientMetrics.get());
serverInstrumenterBuilder
.setSpanStatusExtractor(
statusExtractorTransformer.apply(
HttpSpanStatusExtractor.create(serverAttributesExtractor)))
.addAttributesExtractor(new ArmeriaNetServerAttributesExtractor())
.addAttributesExtractor(serverAttributesExtractor)
.addRequestMetrics(HttpServerMetrics.get());
if (peerService != null) {
clientInstrumenterBuilder.addAttributesExtractor(
AttributesExtractor.constant(SemanticAttributes.PEER_SERVICE, peerService));
} else {
clientInstrumenterBuilder.addAttributesExtractor(
PeerServiceAttributesExtractor.create(netClientAttributesExtractor));
}
return new ArmeriaTracing(
clientInstrumenterBuilder.newClientInstrumenter(new ClientRequestContextSetter()),
serverInstrumenterBuilder.newServerInstrumenter(new RequestContextGetter()));

View File

@ -7,17 +7,17 @@ package io.opentelemetry.instrumentation.armeria.v1_3.internal;
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.logging.RequestLog;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import org.checkerframework.checker.nullness.qual.Nullable;
public final class ArmeriaNetAttributesExtractor
extends InetSocketAddressNetAttributesExtractor<RequestContext, RequestLog> {
public final class ArmeriaNetClientAttributesExtractor
extends InetSocketAddressNetClientAttributesExtractor<RequestContext, RequestLog> {
@Override
public String transport(RequestContext ctx) {
public String transport(RequestContext ctx, @Nullable RequestLog requestLog) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}

View File

@ -0,0 +1,33 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.armeria.v1_3.internal;
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.logging.RequestLog;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetServerAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import org.checkerframework.checker.nullness.qual.Nullable;
public final class ArmeriaNetServerAttributesExtractor
extends InetSocketAddressNetServerAttributesExtractor<RequestContext, RequestLog> {
@Override
public String transport(RequestContext ctx) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}
@Override
@Nullable
public InetSocketAddress getAddress(RequestContext ctx) {
SocketAddress address = ctx.remoteAddress();
if (address instanceof InetSocketAddress) {
return (InetSocketAddress) address;
}
return null;
}
}

View File

@ -7,15 +7,15 @@ package io.opentelemetry.javaagent.instrumentation.asynchttpclient.v1_9;
import com.ning.http.client.Request;
import com.ning.http.client.Response;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import org.checkerframework.checker.nullness.qual.Nullable;
final class AsyncHttpClientNetAttributesExtractor
extends NetAttributesExtractor<Request, Response> {
extends NetClientAttributesExtractor<Request, Response> {
@Override
public String transport(Request request) {
public String transport(Request request, @Nullable Response response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}

View File

@ -5,23 +5,23 @@
package io.opentelemetry.javaagent.instrumentation.asynchttpclient.v2_0;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.net.InetSocketAddress;
import org.asynchttpclient.Response;
import org.checkerframework.checker.nullness.qual.Nullable;
final class AsyncHttpClientNetAttributesExtractor
extends InetSocketAddressNetAttributesExtractor<RequestContext, Response> {
extends InetSocketAddressNetClientAttributesExtractor<RequestContext, Response> {
@Override
public String transport(RequestContext requestContext) {
public String transport(RequestContext request, @Nullable Response response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}
@Override
public @Nullable InetSocketAddress getAddress(
RequestContext requestContext, @Nullable Response response) {
RequestContext request, @Nullable Response response) {
if (response != null && response.getRemoteAddress() instanceof InetSocketAddress) {
return (InetSocketAddress) response.getRemoteAddress();
}

View File

@ -14,7 +14,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttribut
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import org.asynchttpclient.Response;
public final class AsyncHttpClientSingletons {
@ -29,7 +29,7 @@ public final class AsyncHttpClientSingletons {
HttpSpanNameExtractor.create(httpAttributesExtractor);
SpanStatusExtractor<RequestContext, Response> spanStatusExtractor =
HttpSpanStatusExtractor.create(httpAttributesExtractor);
NetAttributesExtractor<RequestContext, Response> netAttributesExtractor =
NetClientAttributesExtractor<RequestContext, Response> netAttributesExtractor =
new AsyncHttpClientNetAttributesExtractor();
INSTRUMENTER =

View File

@ -6,16 +6,16 @@
package io.opentelemetry.javaagent.instrumentation.cassandra.v3_0;
import com.datastax.driver.core.ExecutionInfo;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetClientAttributesExtractor;
import java.net.InetSocketAddress;
import org.checkerframework.checker.nullness.qual.Nullable;
final class CassandraNetAttributesExtractor
extends InetSocketAddressNetAttributesExtractor<CassandraRequest, ExecutionInfo> {
extends InetSocketAddressNetClientAttributesExtractor<CassandraRequest, ExecutionInfo> {
@Override
@Nullable
public String transport(CassandraRequest request) {
public String transport(CassandraRequest request, @Nullable ExecutionInfo executionInfo) {
return null;
}

View File

@ -7,17 +7,17 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0;
import com.datastax.oss.driver.api.core.cql.ExecutionInfo;
import com.datastax.oss.driver.api.core.metadata.Node;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetClientAttributesExtractor;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import org.checkerframework.checker.nullness.qual.Nullable;
final class CassandraNetAttributesExtractor
extends InetSocketAddressNetAttributesExtractor<CassandraRequest, ExecutionInfo> {
extends InetSocketAddressNetClientAttributesExtractor<CassandraRequest, ExecutionInfo> {
@Override
@Nullable
public String transport(CassandraRequest request) {
public String transport(CassandraRequest request, @Nullable ExecutionInfo executionInfo) {
return null;
}

View File

@ -12,27 +12,27 @@ import org.elasticsearch.client.Response;
final class ElasticsearchRestAttributesExtractor extends DbAttributesExtractor<String, Response> {
@Override
protected String system(String s) {
protected String system(String operation) {
return SemanticAttributes.DbSystemValues.ELASTICSEARCH;
}
@Override
protected @Nullable String user(String s) {
protected @Nullable String user(String operation) {
return null;
}
@Override
protected @Nullable String name(String s) {
protected @Nullable String name(String operation) {
return null;
}
@Override
protected @Nullable String connectionString(String s) {
protected @Nullable String connectionString(String operation) {
return null;
}
@Override
protected @Nullable String statement(String s) {
protected @Nullable String statement(String operation) {
return null;
}

View File

@ -19,8 +19,8 @@ public final class ElasticsearchRestInstrumenterFactory {
ElasticsearchRestAttributesExtractor attributesExtractor =
new ElasticsearchRestAttributesExtractor();
SpanNameExtractor<String> spanNameExtractor = DbSpanNameExtractor.create(attributesExtractor);
ElasticsearchRestNetAttributesExtractor netAttributesExtractor =
new ElasticsearchRestNetAttributesExtractor();
ElasticsearchRestNetResponseAttributesExtractor netAttributesExtractor =
new ElasticsearchRestNetResponseAttributesExtractor();
return Instrumenter.<String, Response>newBuilder(
GlobalOpenTelemetry.get(), instrumentationName, spanNameExtractor)

View File

@ -5,20 +5,20 @@
package io.opentelemetry.javaagent.instrumentation.elasticsearch.rest;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.elasticsearch.client.Response;
final class ElasticsearchRestNetAttributesExtractor
extends NetAttributesExtractor<String, Response> {
final class ElasticsearchRestNetResponseAttributesExtractor
extends NetClientAttributesExtractor<String, Response> {
@Override
public String transport(String s) {
public String transport(String operation, Response response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}
@Override
public @Nullable String peerName(String s, @Nullable Response response) {
public @Nullable String peerName(String operation, @Nullable Response response) {
if (response != null) {
return response.getHost().getHostName();
}
@ -26,7 +26,7 @@ final class ElasticsearchRestNetAttributesExtractor
}
@Override
public @Nullable Integer peerPort(String s, @Nullable Response response) {
public @Nullable Integer peerPort(String operation, @Nullable Response response) {
if (response != null) {
return response.getHost().getPort();
}
@ -34,7 +34,7 @@ final class ElasticsearchRestNetAttributesExtractor
}
@Override
public @Nullable String peerIp(String s, @Nullable Response response) {
public @Nullable String peerIp(String operation, @Nullable Response response) {
if (response != null && response.getHost().getAddress() != null) {
return response.getHost().getAddress().getHostAddress();
}

View File

@ -6,7 +6,7 @@
package io.opentelemetry.javaagent.instrumentation.elasticsearch.transport.v5_0;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.javaagent.instrumentation.elasticsearch.transport.ElasticTransportNetAttributesExtractor;
import io.opentelemetry.javaagent.instrumentation.elasticsearch.transport.ElasticTransportNetResponseAttributesExtractor;
import io.opentelemetry.javaagent.instrumentation.elasticsearch.transport.ElasticTransportRequest;
import io.opentelemetry.javaagent.instrumentation.elasticsearch.transport.ElasticsearchTransportInstrumenterFactory;
import org.elasticsearch.action.ActionResponse;
@ -17,7 +17,7 @@ public final class Elasticsearch5TransportSingletons {
ElasticsearchTransportInstrumenterFactory.create(
"io.opentelemetry.elasticsearch-transport-5.0",
new Elasticsearch5TransportExperimentalAttributesExtractor(),
new ElasticTransportNetAttributesExtractor());
new ElasticTransportNetResponseAttributesExtractor());
public static Instrumenter<ElasticTransportRequest, ActionResponse> instrumenter() {
return INSTRUMENTER;

View File

@ -6,7 +6,7 @@
package io.opentelemetry.javaagent.instrumentation.elasticsearch.transport.v5_3;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.javaagent.instrumentation.elasticsearch.transport.ElasticTransportNetAttributesExtractor;
import io.opentelemetry.javaagent.instrumentation.elasticsearch.transport.ElasticTransportNetResponseAttributesExtractor;
import io.opentelemetry.javaagent.instrumentation.elasticsearch.transport.ElasticTransportRequest;
import io.opentelemetry.javaagent.instrumentation.elasticsearch.transport.ElasticsearchTransportInstrumenterFactory;
import org.elasticsearch.action.ActionResponse;
@ -17,7 +17,7 @@ public final class Elasticsearch53TransportSingletons {
ElasticsearchTransportInstrumenterFactory.create(
"io.opentelemetry.elasticsearch-transport-5.3",
new Elasticsearch53TransportExperimentalAttributesExtractor(),
new ElasticTransportNetAttributesExtractor());
new ElasticTransportNetResponseAttributesExtractor());
public static Instrumenter<ElasticTransportRequest, ActionResponse> instrumenter() {
return INSTRUMENTER;

View File

@ -5,22 +5,23 @@
package io.opentelemetry.javaagent.instrumentation.elasticsearch.transport.v6_0;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetClientAttributesExtractor;
import io.opentelemetry.javaagent.instrumentation.elasticsearch.transport.ElasticTransportRequest;
import java.net.InetSocketAddress;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.elasticsearch.action.ActionResponse;
public class Elasticsearch6TransportNetAttributesExtractor
extends InetSocketAddressNetAttributesExtractor<ElasticTransportRequest, ActionResponse> {
extends InetSocketAddressNetClientAttributesExtractor<ElasticTransportRequest, ActionResponse> {
@Override
public @Nullable String transport(ElasticTransportRequest elasticTransportRequest) {
public @Nullable String transport(
ElasticTransportRequest request, @Nullable ActionResponse response) {
return null;
}
@Override
public @Nullable InetSocketAddress getAddress(
ElasticTransportRequest elasticTransportRequest, @Nullable ActionResponse response) {
ElasticTransportRequest request, @Nullable ActionResponse response) {
if (response != null && response.remoteAddress() != null) {
return response.remoteAddress().address();
}

View File

@ -5,20 +5,21 @@
package io.opentelemetry.javaagent.instrumentation.elasticsearch.transport;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.elasticsearch.action.ActionResponse;
public class ElasticTransportNetAttributesExtractor
extends NetAttributesExtractor<ElasticTransportRequest, ActionResponse> {
public class ElasticTransportNetResponseAttributesExtractor
extends NetClientAttributesExtractor<ElasticTransportRequest, ActionResponse> {
@Override
public @Nullable String transport(ElasticTransportRequest elasticTransportRequest) {
public @Nullable String transport(
ElasticTransportRequest request, @Nullable ActionResponse response) {
return null;
}
@Override
public @Nullable String peerName(
ElasticTransportRequest elasticTransportRequest, @Nullable ActionResponse response) {
ElasticTransportRequest request, @Nullable ActionResponse response) {
if (response != null && response.remoteAddress() != null) {
return response.remoteAddress().getHost();
}
@ -27,7 +28,7 @@ public class ElasticTransportNetAttributesExtractor
@Override
public @Nullable Integer peerPort(
ElasticTransportRequest elasticTransportRequest, @Nullable ActionResponse response) {
ElasticTransportRequest request, @Nullable ActionResponse response) {
if (response != null && response.remoteAddress() != null) {
return response.remoteAddress().getPort();
}
@ -36,7 +37,7 @@ public class ElasticTransportNetAttributesExtractor
@Override
public @Nullable String peerIp(
ElasticTransportRequest elasticTransportRequest, @Nullable ActionResponse response) {
ElasticTransportRequest request, @Nullable ActionResponse response) {
if (response != null && response.remoteAddress() != null) {
return response.remoteAddress().getAddress();
}

View File

@ -12,7 +12,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.db.DbSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import org.elasticsearch.action.ActionResponse;
public final class ElasticsearchTransportInstrumenterFactory {
@ -23,7 +22,7 @@ public final class ElasticsearchTransportInstrumenterFactory {
public static Instrumenter<ElasticTransportRequest, ActionResponse> create(
String instrumentationName,
AttributesExtractor<ElasticTransportRequest, ActionResponse> experimentalAttributesExtractor,
NetAttributesExtractor<ElasticTransportRequest, ActionResponse> netAttributesExtractor) {
AttributesExtractor<ElasticTransportRequest, ActionResponse> netAttributesExtractor) {
ElasticsearchTransportAttributesExtractor attributesExtractor =
new ElasticsearchTransportAttributesExtractor();

View File

@ -7,15 +7,15 @@ package io.opentelemetry.javaagent.instrumentation.googlehttpclient;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpResponse;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import org.checkerframework.checker.nullness.qual.Nullable;
final class GoogleHttpClientNetAttributesExtractor
extends NetAttributesExtractor<HttpRequest, HttpResponse> {
extends NetClientAttributesExtractor<HttpRequest, HttpResponse> {
@Override
public String transport(HttpRequest request) {
public String transport(HttpRequest request, @Nullable HttpResponse response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}

View File

@ -8,14 +8,10 @@ package io.opentelemetry.javaagent.instrumentation.grpc.v1_6;
import io.grpc.ClientInterceptor;
import io.grpc.Context;
import io.grpc.ServerInterceptor;
import io.grpc.Status;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.api.instrumenter.PeerServiceAttributesExtractor;
import io.opentelemetry.instrumentation.grpc.v1_6.GrpcRequest;
import io.opentelemetry.instrumentation.grpc.v1_6.GrpcTracing;
import io.opentelemetry.instrumentation.grpc.v1_6.internal.ContextStorageBridge;
import io.opentelemetry.instrumentation.grpc.v1_6.internal.GrpcNetAttributesExtractor;
// Holds singleton references.
public final class GrpcSingletons {
@ -29,13 +25,10 @@ public final class GrpcSingletons {
static {
boolean experimentalSpanAttributes =
Config.get().getBoolean("otel.instrumentation.grpc.experimental-span-attributes", false);
PeerServiceAttributesExtractor<GrpcRequest, Status> peerServiceAttributesExtractor =
PeerServiceAttributesExtractor.create(new GrpcNetAttributesExtractor());
GrpcTracing tracing =
GrpcTracing.newBuilder(GlobalOpenTelemetry.get())
.setCaptureExperimentalSpanAttributes(experimentalSpanAttributes)
.addAttributeExtractor(peerServiceAttributesExtractor)
.build();
CLIENT_INTERCEPTOR = tracing.newClientInterceptor();

View File

@ -10,10 +10,15 @@ import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.PeerServiceAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
import io.opentelemetry.instrumentation.grpc.v1_6.internal.GrpcNetAttributesExtractor;
import io.opentelemetry.instrumentation.grpc.v1_6.internal.GrpcNetClientAttributesExtractor;
import io.opentelemetry.instrumentation.grpc.v1_6.internal.GrpcNetServerAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
import org.checkerframework.checker.nullness.qual.Nullable;
/** A builder of {@link GrpcTracing}. */
public final class GrpcTracingBuilder {
@ -21,6 +26,7 @@ public final class GrpcTracingBuilder {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.grpc-1.6";
private final OpenTelemetry openTelemetry;
@Nullable private String peerService;
private final List<AttributesExtractor<? super GrpcRequest, ? super Status>>
additionalExtractors = new ArrayList<>();
@ -41,6 +47,11 @@ public final class GrpcTracingBuilder {
return this;
}
/** Sets the {@code peer.service} attribute for http client spans. */
public void setPeerService(String peerService) {
this.peerService = peerService;
}
/**
* Sets whether experimental attributes should be set to spans. These attributes may be changed or
* removed in the future, so only enable this if you know you do not require attributes filled by
@ -54,20 +65,39 @@ public final class GrpcTracingBuilder {
/** Returns a new {@link GrpcTracing} with the settings of this {@link GrpcTracingBuilder}. */
public GrpcTracing build() {
InstrumenterBuilder<GrpcRequest, Status> instrumenterBuilder =
InstrumenterBuilder<GrpcRequest, Status> clientInstrumenterBuilder =
Instrumenter.newBuilder(openTelemetry, INSTRUMENTATION_NAME, new GrpcSpanNameExtractor());
instrumenterBuilder
.setSpanStatusExtractor(new GrpcSpanStatusExtractor())
.addAttributesExtractors(
new GrpcNetAttributesExtractor(),
new GrpcRpcAttributesExtractor(),
new GrpcAttributesExtractor())
.addAttributesExtractors(additionalExtractors);
InstrumenterBuilder<GrpcRequest, Status> serverInstrumenterBuilder =
Instrumenter.newBuilder(openTelemetry, INSTRUMENTATION_NAME, new GrpcSpanNameExtractor());
Stream.of(clientInstrumenterBuilder, serverInstrumenterBuilder)
.forEach(
instrumenter ->
instrumenter
.setSpanStatusExtractor(new GrpcSpanStatusExtractor())
.addAttributesExtractors(
new GrpcRpcAttributesExtractor(), new GrpcAttributesExtractor())
.addAttributesExtractors(additionalExtractors));
GrpcNetClientAttributesExtractor netClientAttributesExtractor =
new GrpcNetClientAttributesExtractor();
clientInstrumenterBuilder.addAttributesExtractor(netClientAttributesExtractor);
serverInstrumenterBuilder.addAttributesExtractor(new GrpcNetServerAttributesExtractor());
if (peerService != null) {
clientInstrumenterBuilder.addAttributesExtractor(
AttributesExtractor.constant(SemanticAttributes.PEER_SERVICE, peerService));
} else {
clientInstrumenterBuilder.addAttributesExtractor(
PeerServiceAttributesExtractor.create(netClientAttributesExtractor));
}
return new GrpcTracing(
instrumenterBuilder.newServerInstrumenter(GrpcExtractAdapter.GETTER),
serverInstrumenterBuilder.newServerInstrumenter(GrpcExtractAdapter.GETTER),
// gRPC client interceptors require two phases, one to set up request and one to execute.
// So we go ahead and inject manually in this instrumentation.
instrumenterBuilder.newInstrumenter(SpanKindExtractor.alwaysClient()),
clientInstrumenterBuilder.newInstrumenter(SpanKindExtractor.alwaysClient()),
openTelemetry.getPropagators(),
captureExperimentalSpanAttributes);
}

View File

@ -0,0 +1,32 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.grpc.v1_6.internal;
import io.grpc.Status;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetClientAttributesExtractor;
import io.opentelemetry.instrumentation.grpc.v1_6.GrpcRequest;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import org.checkerframework.checker.nullness.qual.Nullable;
public final class GrpcNetClientAttributesExtractor
extends InetSocketAddressNetClientAttributesExtractor<GrpcRequest, Status> {
@Override
@Nullable
public InetSocketAddress getAddress(GrpcRequest request, @Nullable Status response) {
SocketAddress address = request.getRemoteAddress();
if (address instanceof InetSocketAddress) {
return (InetSocketAddress) address;
}
return null;
}
@Override
public String transport(GrpcRequest request, @Nullable Status response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}
}

View File

@ -6,18 +6,18 @@
package io.opentelemetry.instrumentation.grpc.v1_6.internal;
import io.grpc.Status;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetServerAttributesExtractor;
import io.opentelemetry.instrumentation.grpc.v1_6.GrpcRequest;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import org.checkerframework.checker.nullness.qual.Nullable;
public final class GrpcNetAttributesExtractor
extends InetSocketAddressNetAttributesExtractor<GrpcRequest, Status> {
public final class GrpcNetServerAttributesExtractor
extends InetSocketAddressNetServerAttributesExtractor<GrpcRequest, Status> {
@Override
@Nullable
public InetSocketAddress getAddress(GrpcRequest request, @Nullable Status status) {
public InetSocketAddress getAddress(GrpcRequest request) {
SocketAddress address = request.getRemoteAddress();
if (address instanceof InetSocketAddress) {
return (InetSocketAddress) address;

View File

@ -5,29 +5,30 @@
package io.opentelemetry.javaagent.instrumentation.httpurlconnection;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.net.HttpURLConnection;
import org.checkerframework.checker.nullness.qual.Nullable;
class HttpUrlNetAttributesExtractor extends NetAttributesExtractor<HttpURLConnection, Integer> {
class HttpUrlNetAttributesExtractor
extends NetClientAttributesExtractor<HttpURLConnection, Integer> {
@Override
public @Nullable String transport(HttpURLConnection connection) {
public @Nullable String transport(HttpURLConnection connection, @Nullable Integer status) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}
@Override
public String peerName(HttpURLConnection connection, @Nullable Integer statusCode) {
public String peerName(HttpURLConnection connection, @Nullable Integer status) {
return connection.getURL().getHost();
}
@Override
public Integer peerPort(HttpURLConnection connection, @Nullable Integer statusCode) {
public Integer peerPort(HttpURLConnection connection, @Nullable Integer status) {
return connection.getURL().getPort();
}
@Override
public @Nullable String peerIp(HttpURLConnection connection, @Nullable Integer statusCode) {
public @Nullable String peerIp(HttpURLConnection connection, @Nullable Integer status) {
return null;
}
}

View File

@ -5,7 +5,7 @@
package io.opentelemetry.javaagent.instrumentation.httpclient;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
@ -14,24 +14,22 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class JdkHttpNetAttributesExtractor
extends NetAttributesExtractor<HttpRequest, HttpResponse<?>> {
extends NetClientAttributesExtractor<HttpRequest, HttpResponse<?>> {
private static final Logger logger = LoggerFactory.getLogger(JdkHttpNetAttributesExtractor.class);
@Override
public String transport(HttpRequest httpRequest) {
public String transport(HttpRequest httpRequest, @Nullable HttpResponse<?> response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}
@Override
public @Nullable String peerName(
HttpRequest httpRequest, @Nullable HttpResponse<?> httpResponse) {
public @Nullable String peerName(HttpRequest httpRequest, @Nullable HttpResponse<?> response) {
return httpRequest.uri().getHost();
}
@Override
public @Nullable Integer peerPort(
HttpRequest httpRequest, @Nullable HttpResponse<?> httpResponse) {
public @Nullable Integer peerPort(HttpRequest httpRequest, @Nullable HttpResponse<?> response) {
int port = httpRequest.uri().getPort();
if (port != -1) {
return port;
@ -52,7 +50,7 @@ public class JdkHttpNetAttributesExtractor
}
@Override
public @Nullable String peerIp(HttpRequest httpRequest, @Nullable HttpResponse<?> httpResponse) {
public @Nullable String peerIp(HttpRequest httpRequest, @Nullable HttpResponse<?> response) {
return null;
}
}

View File

@ -7,15 +7,15 @@ package io.opentelemetry.javaagent.instrumentation.jaxrsclient.v1_1;
import com.sun.jersey.api.client.ClientRequest;
import com.sun.jersey.api.client.ClientResponse;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import org.checkerframework.checker.nullness.qual.Nullable;
final class JaxRsClientNetAttributesExtractor
extends NetAttributesExtractor<ClientRequest, ClientResponse> {
extends NetClientAttributesExtractor<ClientRequest, ClientResponse> {
@Override
public String transport(ClientRequest request) {
public String transport(ClientRequest request, @Nullable ClientResponse response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}

View File

@ -5,17 +5,17 @@
package io.opentelemetry.javaagent.instrumentation.jaxrsclient.v2_0;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientResponseContext;
import org.checkerframework.checker.nullness.qual.Nullable;
final class JaxRsClientNetAttributesExtractor
extends NetAttributesExtractor<ClientRequestContext, ClientResponseContext> {
extends NetClientAttributesExtractor<ClientRequestContext, ClientResponseContext> {
@Override
public String transport(ClientRequestContext request) {
public String transport(ClientRequestContext request, @Nullable ClientResponseContext response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}

View File

@ -5,17 +5,17 @@
package io.opentelemetry.javaagent.instrumentation.jaxrsclient.v2_0;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import javax.ws.rs.core.Response;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.jboss.resteasy.client.jaxrs.internal.ClientInvocation;
final class ResteasyClientNetAttributesExtractor
extends NetAttributesExtractor<ClientInvocation, Response> {
extends NetClientAttributesExtractor<ClientInvocation, Response> {
@Override
public String transport(ClientInvocation request) {
public String transport(ClientInvocation request, @Nullable Response response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}

View File

@ -5,14 +5,15 @@
package io.opentelemetry.instrumentation.jdbc.internal;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import org.checkerframework.checker.nullness.qual.Nullable;
public final class JdbcNetAttributesExtractor extends NetAttributesExtractor<DbRequest, Void> {
public final class JdbcNetAttributesExtractor
extends NetClientAttributesExtractor<DbRequest, Void> {
@Nullable
@Override
public String transport(DbRequest request) {
public String transport(DbRequest request, @Nullable Void unused) {
return null;
}

View File

@ -5,14 +5,14 @@
package io.opentelemetry.javaagent.instrumentation.jedis.v1_4;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import org.checkerframework.checker.nullness.qual.Nullable;
final class JedisNetAttributesExtractor extends NetAttributesExtractor<JedisRequest, Void> {
final class JedisNetAttributesExtractor extends NetClientAttributesExtractor<JedisRequest, Void> {
@Override
@Nullable
public String transport(JedisRequest request) {
public String transport(JedisRequest request, @Nullable Void unused) {
return null;
}

View File

@ -5,14 +5,14 @@
package io.opentelemetry.javaagent.instrumentation.jedis.v3_0;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.net.InetSocketAddress;
import java.net.Socket;
import org.checkerframework.checker.nullness.qual.Nullable;
final class JedisNetAttributesExtractor
extends InetSocketAddressNetAttributesExtractor<JedisRequest, Void> {
extends InetSocketAddressNetClientAttributesExtractor<JedisRequest, Void> {
@Override
public @Nullable InetSocketAddress getAddress(JedisRequest jedisRequest, @Nullable Void unused) {
@ -24,7 +24,7 @@ final class JedisNetAttributesExtractor
}
@Override
public String transport(JedisRequest jedisRequest) {
public String transport(JedisRequest jedisRequest, @Nullable Void unused) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}
}

View File

@ -5,17 +5,17 @@
package io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.eclipse.jetty.client.api.Request;
import org.eclipse.jetty.client.api.Response;
public class JettyHttpClientNetAttributesExtractor
extends NetAttributesExtractor<Request, Response> {
extends NetClientAttributesExtractor<Request, Response> {
@Override
public String transport(Request request) {
public String transport(Request request, @Nullable Response response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}

View File

@ -6,29 +6,30 @@
package io.opentelemetry.javaagent.instrumentation.kubernetesclient;
import io.kubernetes.client.openapi.ApiResponse;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import okhttp3.Request;
import org.checkerframework.checker.nullness.qual.Nullable;
class KubernetesNetAttributesExtractor extends NetAttributesExtractor<Request, ApiResponse<?>> {
class KubernetesNetAttributesExtractor
extends NetClientAttributesExtractor<Request, ApiResponse<?>> {
@Override
public String transport(Request request) {
public String transport(Request request, @Nullable ApiResponse<?> response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}
@Override
public String peerName(Request request, @Nullable ApiResponse<?> apiResponse) {
public String peerName(Request request, @Nullable ApiResponse<?> response) {
return request.url().host();
}
@Override
public Integer peerPort(Request request, @Nullable ApiResponse<?> apiResponse) {
public Integer peerPort(Request request, @Nullable ApiResponse<?> response) {
return request.url().port();
}
@Override
public @Nullable String peerIp(Request request, @Nullable ApiResponse<?> apiResponse) {
public @Nullable String peerIp(Request request, @Nullable ApiResponse<?> response) {
return null;
}
}

View File

@ -6,14 +6,15 @@
package io.opentelemetry.javaagent.instrumentation.lettuce.v4_0;
import com.lambdaworks.redis.RedisURI;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import org.checkerframework.checker.nullness.qual.Nullable;
final class LettuceConnectNetAttributesExtractor extends NetAttributesExtractor<RedisURI, Void> {
final class LettuceConnectNetAttributesExtractor
extends NetClientAttributesExtractor<RedisURI, Void> {
@Override
@Nullable
public String transport(RedisURI redisUri) {
public String transport(RedisURI redisUri, @Nullable Void unused) {
return null;
}

View File

@ -6,14 +6,15 @@
package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0;
import io.lettuce.core.RedisURI;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import org.checkerframework.checker.nullness.qual.Nullable;
final class LettuceConnectNetAttributesExtractor extends NetAttributesExtractor<RedisURI, Void> {
final class LettuceConnectNetAttributesExtractor
extends NetClientAttributesExtractor<RedisURI, Void> {
@Override
@Nullable
public String transport(RedisURI redisUri) {
public String transport(RedisURI redisUri, @Nullable Void unused) {
return null;
}

View File

@ -81,7 +81,6 @@ public class LibertyDispatcherLinkInstrumentation implements TypeInstrumentation
scope.close();
LibertyResponse response = new LibertyResponse(httpDispatcherLink, statusCode);
request.setCompleted();
Throwable t = failure != null ? failure : throwable;
instrumenter().end(context, request, response, t);

View File

@ -5,12 +5,12 @@
package io.opentelemetry.javaagent.instrumentation.liberty.dispatcher;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import org.checkerframework.checker.nullness.qual.Nullable;
public class LibertyDispatcherNetAttributesExtractor
extends NetAttributesExtractor<LibertyRequest, LibertyResponse> {
extends NetServerAttributesExtractor<LibertyRequest, LibertyResponse> {
@Override
public String transport(LibertyRequest libertyRequest) {
@ -18,32 +18,17 @@ public class LibertyDispatcherNetAttributesExtractor
}
@Override
public @Nullable String peerName(
LibertyRequest libertyRequest, @Nullable LibertyResponse libertyResponse) {
// condition limits calling peerName to onStart because in onEnd it may throw a NPE
if (!libertyRequest.isCompleted()) {
return libertyRequest.peerName();
}
return null;
public @Nullable String peerName(LibertyRequest libertyRequest) {
return libertyRequest.peerName();
}
@Override
public @Nullable Integer peerPort(
LibertyRequest libertyRequest, @Nullable LibertyResponse libertyResponse) {
// condition limits calling getServerPort to onStart because in onEnd it may throw a NPE
if (!libertyRequest.isCompleted()) {
return libertyRequest.getServerPort();
}
return null;
public @Nullable Integer peerPort(LibertyRequest libertyRequest) {
return libertyRequest.getServerPort();
}
@Override
public @Nullable String peerIp(
LibertyRequest libertyRequest, @Nullable LibertyResponse libertyResponse) {
// condition limits calling peerIp to onStart because in onEnd it may throw a NPE
if (!libertyRequest.isCompleted()) {
return libertyRequest.peerIp();
}
return null;
public @Nullable String peerIp(LibertyRequest libertyRequest) {
return libertyRequest.peerIp();
}
}

View File

@ -9,14 +9,13 @@ import static io.opentelemetry.instrumentation.api.servlet.ServerSpanNaming.Sour
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.PeerServiceAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
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.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor;
import io.opentelemetry.instrumentation.api.servlet.ServerSpanNaming;
public final class LibertyDispatcherSingletons {
@ -31,7 +30,7 @@ public final class LibertyDispatcherSingletons {
HttpSpanNameExtractor.create(httpAttributesExtractor);
SpanStatusExtractor<LibertyRequest, LibertyResponse> spanStatusExtractor =
HttpSpanStatusExtractor.create(httpAttributesExtractor);
NetAttributesExtractor<LibertyRequest, LibertyResponse> netAttributesExtractor =
NetServerAttributesExtractor<LibertyRequest, LibertyResponse> netAttributesExtractor =
new LibertyDispatcherNetAttributesExtractor();
INSTRUMENTER =
@ -40,7 +39,6 @@ public final class LibertyDispatcherSingletons {
.setSpanStatusExtractor(spanStatusExtractor)
.addAttributesExtractor(httpAttributesExtractor)
.addAttributesExtractor(netAttributesExtractor)
.addAttributesExtractor(PeerServiceAttributesExtractor.create(netAttributesExtractor))
.addContextCustomizer(
(context, request, attributes) -> ServerSpanNaming.init(context, CONTAINER))
.addRequestMetrics(HttpServerMetrics.get())

View File

@ -15,7 +15,6 @@ import java.util.List;
public class LibertyRequest {
private final HttpDispatcherLink httpDispatcherLink;
private final HttpRequestMessage httpRequestMessage;
private boolean completed;
public LibertyRequest(
HttpDispatcherLink httpDispatcherLink, HttpRequestMessage httpRequestMessage) {
@ -79,12 +78,4 @@ public class LibertyRequest {
public String getProtocol() {
return httpRequestMessage.getVersion();
}
public boolean isCompleted() {
return completed;
}
public void setCompleted() {
completed = true;
}
}

View File

@ -7,13 +7,14 @@ package io.opentelemetry.javaagent.instrumentation.okhttp.v2_2;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import org.checkerframework.checker.nullness.qual.Nullable;
public final class OkHttp2NetAttributesExtractor extends NetAttributesExtractor<Request, Response> {
public final class OkHttp2NetAttributesExtractor
extends NetClientAttributesExtractor<Request, Response> {
@Override
public String transport(Request request) {
public String transport(Request request, @Nullable Response response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}

View File

@ -20,7 +20,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttribut
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
public final class OkHttp2Singletons {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.okhttp-2.2";
@ -35,7 +35,7 @@ public final class OkHttp2Singletons {
HttpSpanNameExtractor.create(httpAttributesExtractor);
SpanStatusExtractor<Request, Response> spanStatusExtractor =
HttpSpanStatusExtractor.create(httpAttributesExtractor);
NetAttributesExtractor<Request, Response> netAttributesExtractor =
NetClientAttributesExtractor<Request, Response> netAttributesExtractor =
new OkHttp2NetAttributesExtractor();
OpenTelemetry openTelemetry = GlobalOpenTelemetry.get();

View File

@ -5,15 +5,16 @@
package io.opentelemetry.instrumentation.okhttp.v3_0.internal;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import okhttp3.Request;
import okhttp3.Response;
import org.checkerframework.checker.nullness.qual.Nullable;
public final class OkHttpNetAttributesExtractor extends NetAttributesExtractor<Request, Response> {
public final class OkHttpNetAttributesExtractor
extends NetClientAttributesExtractor<Request, Response> {
@Override
public String transport(Request request) {
public String transport(Request request, @Nullable Response response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}

View File

@ -5,7 +5,7 @@
package io.opentelemetry.javaagent.instrumentation.playws;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetClientAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.net.InetSocketAddress;
import org.checkerframework.checker.nullness.qual.Nullable;
@ -13,10 +13,10 @@ import play.shaded.ahc.org.asynchttpclient.Request;
import play.shaded.ahc.org.asynchttpclient.Response;
final class PlayWsClientNetAttributesExtractor
extends InetSocketAddressNetAttributesExtractor<Request, Response> {
extends InetSocketAddressNetClientAttributesExtractor<Request, Response> {
@Override
public String transport(Request request) {
public String transport(Request request, @Nullable Response response) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}

View File

@ -5,13 +5,14 @@
package io.opentelemetry.instrumentation.ratpack.internal;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import org.checkerframework.checker.nullness.qual.Nullable;
import ratpack.http.Request;
import ratpack.http.Response;
public final class RatpackNetAttributesExtractor extends NetAttributesExtractor<Request, Response> {
public final class RatpackNetAttributesExtractor
extends NetServerAttributesExtractor<Request, Response> {
@Override
@Nullable
public String transport(Request request) {
@ -20,18 +21,18 @@ public final class RatpackNetAttributesExtractor extends NetAttributesExtractor<
@Override
@Nullable
public String peerName(Request request, @Nullable Response response) {
public String peerName(Request request) {
return null;
}
@Override
public Integer peerPort(Request request, @Nullable Response response) {
public Integer peerPort(Request request) {
return request.getRemoteAddress().getPort();
}
@Override
@Nullable
public String peerIp(Request request, @Nullable Response response) {
public String peerIp(Request request) {
return null;
}
}

View File

@ -5,12 +5,12 @@
package io.opentelemetry.javaagent.instrumentation.redisson;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetClientAttributesExtractor;
import java.net.InetSocketAddress;
import org.checkerframework.checker.nullness.qual.Nullable;
final class RedissonNetAttributesExtractor
extends InetSocketAddressNetAttributesExtractor<RedissonRequest, Void> {
extends InetSocketAddressNetClientAttributesExtractor<RedissonRequest, Void> {
@Override
public InetSocketAddress getAddress(RedissonRequest request, @Nullable Void unused) {
@ -19,7 +19,7 @@ final class RedissonNetAttributesExtractor
@Nullable
@Override
public String transport(RedissonRequest request) {
public String transport(RedissonRequest request, @Nullable Void unused) {
return null;
}
}

View File

@ -5,30 +5,30 @@
package io.opentelemetry.instrumentation.restlet.v1_0;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.restlet.data.Request;
import org.restlet.data.Response;
final class RestletNetAttributesExtractor extends NetAttributesExtractor<Request, Response> {
final class RestletNetAttributesExtractor extends NetServerAttributesExtractor<Request, Response> {
@Override
public String transport(Request request) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}
@Override
public @Nullable String peerName(Request request, @Nullable Response response) {
public @Nullable String peerName(Request request) {
return null;
}
@Override
public Integer peerPort(Request request, @Nullable Response response) {
public Integer peerPort(Request request) {
return request.getClientInfo().getPort();
}
@Override
public @Nullable String peerIp(Request request, @Nullable Response response) {
public @Nullable String peerIp(Request request) {
return request.getClientInfo().getAddress();
}
}

View File

@ -14,7 +14,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor;
import java.util.ArrayList;
import java.util.List;
import org.restlet.data.Request;
@ -66,7 +66,7 @@ public final class RestletTracingBuilder {
HttpSpanNameExtractor.create(httpAttributesExtractor);
SpanStatusExtractor<Request, Response> spanStatusExtractor =
HttpSpanStatusExtractor.create(httpAttributesExtractor);
NetAttributesExtractor<Request, Response> netAttributesExtractor =
NetServerAttributesExtractor<Request, Response> netAttributesExtractor =
new RestletNetAttributesExtractor();
Instrumenter<Request, Response> instrumenter =

View File

@ -10,7 +10,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.ContextCustomizer;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.PeerServiceAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
@ -73,7 +72,6 @@ public final class ServletInstrumenterBuilder<REQUEST, RESPONSE> {
.setErrorCauseExtractor(errorCauseExtractor)
.addAttributesExtractor(httpAttributesExtractor)
.addAttributesExtractor(netAttributesExtractor)
.addAttributesExtractor(PeerServiceAttributesExtractor.create(netAttributesExtractor))
.addAttributesExtractor(additionalAttributesExtractor)
.addRequestMetrics(HttpServerMetrics.get());
for (ContextCustomizer<? super ServletRequestContext<REQUEST>> contextCustomizer :

View File

@ -5,12 +5,12 @@
package io.opentelemetry.javaagent.instrumentation.servlet;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor;
import io.opentelemetry.instrumentation.servlet.ServletAccessor;
import org.checkerframework.checker.nullness.qual.Nullable;
public class ServletNetAttributesExtractor<REQUEST, RESPONSE>
extends NetAttributesExtractor<
extends NetServerAttributesExtractor<
ServletRequestContext<REQUEST>, ServletResponseContext<RESPONSE>> {
private final ServletAccessor<REQUEST, RESPONSE> accessor;
@ -25,24 +25,18 @@ public class ServletNetAttributesExtractor<REQUEST, RESPONSE>
}
@Override
public @Nullable String peerName(
ServletRequestContext<REQUEST> requestContext,
@Nullable ServletResponseContext<RESPONSE> responseContext) {
public @Nullable String peerName(ServletRequestContext<REQUEST> requestContext) {
// return accessor.getRequestRemoteHost(requestContext.request());
return null;
}
@Override
public @Nullable Integer peerPort(
ServletRequestContext<REQUEST> requestContext,
@Nullable ServletResponseContext<RESPONSE> responseContext) {
public @Nullable Integer peerPort(ServletRequestContext<REQUEST> requestContext) {
return accessor.getRequestRemotePort(requestContext.request());
}
@Override
public @Nullable String peerIp(
ServletRequestContext<REQUEST> requestContext,
@Nullable ServletResponseContext<RESPONSE> responseContext) {
public @Nullable String peerIp(ServletRequestContext<REQUEST> requestContext) {
return accessor.getRequestRemoteAddr(requestContext.request());
}
}

View File

@ -5,34 +5,31 @@
package io.opentelemetry.instrumentation.spring.web;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpResponse;
final class SpringWebNetAttributesExtractor
extends NetAttributesExtractor<HttpRequest, ClientHttpResponse> {
extends NetServerAttributesExtractor<HttpRequest, ClientHttpResponse> {
@Override
public String transport(HttpRequest httpRequest) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}
@Override
public @Nullable String peerName(
HttpRequest httpRequest, @Nullable ClientHttpResponse clientHttpResponse) {
public @Nullable String peerName(HttpRequest httpRequest) {
return httpRequest.getURI().getHost();
}
@Override
public Integer peerPort(
HttpRequest httpRequest, @Nullable ClientHttpResponse clientHttpResponse) {
public Integer peerPort(HttpRequest httpRequest) {
return httpRequest.getURI().getPort();
}
@Override
public @Nullable String peerIp(
HttpRequest httpRequest, @Nullable ClientHttpResponse clientHttpResponse) {
public @Nullable String peerIp(HttpRequest httpRequest) {
return null;
}
}

View File

@ -5,33 +5,31 @@
package io.opentelemetry.instrumentation.spring.webmvc;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.checkerframework.checker.nullness.qual.Nullable;
final class SpringWebMvcNetAttributesExtractor
extends NetAttributesExtractor<HttpServletRequest, HttpServletResponse> {
extends NetServerAttributesExtractor<HttpServletRequest, HttpServletResponse> {
@Override
public String transport(HttpServletRequest request) {
return SemanticAttributes.NetTransportValues.IP_TCP;
}
@Override
public @Nullable String peerName(
HttpServletRequest request, @Nullable HttpServletResponse response) {
public @Nullable String peerName(HttpServletRequest request) {
return request.getRemoteHost();
}
@Override
public Integer peerPort(HttpServletRequest request, @Nullable HttpServletResponse response) {
public Integer peerPort(HttpServletRequest request) {
return request.getRemotePort();
}
@Override
public @Nullable String peerIp(
HttpServletRequest request, @Nullable HttpServletResponse response) {
public @Nullable String peerIp(HttpServletRequest request) {
return request.getRemoteAddr();
}
}

View File

@ -10,14 +10,13 @@ import static io.opentelemetry.instrumentation.api.servlet.ServerSpanNaming.Sour
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.PeerServiceAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
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.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor;
import io.opentelemetry.instrumentation.api.servlet.AppServerBridge;
import io.opentelemetry.instrumentation.api.servlet.ServerSpanNaming;
import io.opentelemetry.instrumentation.servlet.ServletAccessor;
@ -39,7 +38,7 @@ public final class TomcatInstrumenterBuilder {
HttpSpanNameExtractor.create(httpAttributesExtractor);
SpanStatusExtractor<Request, Response> spanStatusExtractor =
HttpSpanStatusExtractor.create(httpAttributesExtractor);
NetAttributesExtractor<Request, Response> netAttributesExtractor =
NetServerAttributesExtractor<Request, Response> netAttributesExtractor =
new TomcatNetAttributesExtractor();
AttributesExtractor<Request, Response> additionalAttributeExtractor =
new TomcatAdditionalAttributesExtractor<>(accessor, servletEntityProvider);
@ -50,7 +49,6 @@ public final class TomcatInstrumenterBuilder {
.setErrorCauseExtractor(new ServletErrorCauseExtractor<>(accessor))
.addAttributesExtractor(httpAttributesExtractor)
.addAttributesExtractor(netAttributesExtractor)
.addAttributesExtractor(PeerServiceAttributesExtractor.create(netAttributesExtractor))
.addAttributesExtractor(additionalAttributeExtractor)
.addContextCustomizer(
(context, request, attributes) -> {

View File

@ -5,13 +5,13 @@
package io.opentelemetry.javaagent.instrumentation.tomcat.common;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor;
import org.apache.coyote.ActionCode;
import org.apache.coyote.Request;
import org.apache.coyote.Response;
import org.checkerframework.checker.nullness.qual.Nullable;
public class TomcatNetAttributesExtractor extends NetAttributesExtractor<Request, Response> {
public class TomcatNetAttributesExtractor extends NetServerAttributesExtractor<Request, Response> {
@Override
public @Nullable String transport(Request request) {
@ -20,7 +20,7 @@ public class TomcatNetAttributesExtractor extends NetAttributesExtractor<Request
}
@Override
public @Nullable String peerName(Request request, @Nullable Response response) {
public @Nullable String peerName(Request request) {
/*
request.action(ActionCode.REQ_HOST_ATTRIBUTE, request);
return request.remoteHost().toString();
@ -29,13 +29,13 @@ public class TomcatNetAttributesExtractor extends NetAttributesExtractor<Request
}
@Override
public @Nullable Integer peerPort(Request request, @Nullable Response response) {
public @Nullable Integer peerPort(Request request) {
request.action(ActionCode.REQ_REMOTEPORT_ATTRIBUTE, request);
return request.getRemotePort();
}
@Override
public @Nullable String peerIp(Request request, @Nullable Response response) {
public @Nullable String peerIp(Request request) {
request.action(ActionCode.REQ_HOST_ADDR_ATTRIBUTE, request);
return request.remoteAddr().toString();
}

View File

@ -5,18 +5,17 @@
package io.opentelemetry.javaagent.instrumentation.undertow;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetServerAttributesExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import io.undertow.server.HttpServerExchange;
import java.net.InetSocketAddress;
import org.checkerframework.checker.nullness.qual.Nullable;
public class UndertowNetAttributesExtractor
extends InetSocketAddressNetAttributesExtractor<HttpServerExchange, HttpServerExchange> {
extends InetSocketAddressNetServerAttributesExtractor<HttpServerExchange, HttpServerExchange> {
@Override
public @Nullable InetSocketAddress getAddress(
HttpServerExchange exchange, @Nullable HttpServerExchange unused) {
public @Nullable InetSocketAddress getAddress(HttpServerExchange exchange) {
return exchange.getConnection().getPeerAddress(InetSocketAddress.class);
}

View File

@ -9,14 +9,13 @@ import static io.opentelemetry.instrumentation.api.servlet.ServerSpanNaming.Sour
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.PeerServiceAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
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.NetAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesExtractor;
import io.opentelemetry.instrumentation.api.servlet.AppServerBridge;
import io.opentelemetry.instrumentation.api.servlet.ServerSpanNaming;
import io.opentelemetry.javaagent.bootstrap.undertow.UndertowActiveHandlers;
@ -34,7 +33,7 @@ public final class UndertowSingletons {
HttpSpanNameExtractor.create(httpAttributesExtractor);
SpanStatusExtractor<HttpServerExchange, HttpServerExchange> spanStatusExtractor =
HttpSpanStatusExtractor.create(httpAttributesExtractor);
NetAttributesExtractor<HttpServerExchange, HttpServerExchange> netAttributesExtractor =
NetServerAttributesExtractor<HttpServerExchange, HttpServerExchange> netAttributesExtractor =
new UndertowNetAttributesExtractor();
INSTRUMENTER =
@ -43,7 +42,6 @@ public final class UndertowSingletons {
.setSpanStatusExtractor(spanStatusExtractor)
.addAttributesExtractor(httpAttributesExtractor)
.addAttributesExtractor(netAttributesExtractor)
.addAttributesExtractor(PeerServiceAttributesExtractor.create(netAttributesExtractor))
.addContextCustomizer(
(context, request, attributes) -> {
context = ServerSpanNaming.init(context, CONTAINER);