Refactor the `FallbackNamePortGetter` in preparation for `client.port` (#8865)

This commit is contained in:
Mateusz Rzeszutek 2023-07-05 19:10:05 +02:00 committed by GitHub
parent d875d997c1
commit 029e187281
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 172 additions and 178 deletions

View File

@ -80,11 +80,11 @@ public final class HttpClientAttributesExtractor<REQUEST, RESPONSE>
List<String> capturedResponseHeaders, List<String> capturedResponseHeaders,
ToIntFunction<Context> resendCountIncrementer) { ToIntFunction<Context> resendCountIncrementer) {
super(httpAttributesGetter, capturedRequestHeaders, capturedResponseHeaders); super(httpAttributesGetter, capturedRequestHeaders, capturedResponseHeaders);
HttpNetNamePortGetter<REQUEST> namePortGetter = HttpNetAddressPortExtractor<REQUEST> addressPortExtractor =
new HttpNetNamePortGetter<>(httpAttributesGetter); new HttpNetAddressPortExtractor<>(httpAttributesGetter);
internalNetExtractor = internalNetExtractor =
new InternalNetClientAttributesExtractor<>( new InternalNetClientAttributesExtractor<>(
netAttributesGetter, namePortGetter, SemconvStability.emitOldHttpSemconv()); netAttributesGetter, addressPortExtractor, SemconvStability.emitOldHttpSemconv());
internalNetworkExtractor = internalNetworkExtractor =
new InternalNetworkAttributesExtractor<>( new InternalNetworkAttributesExtractor<>(
netAttributesGetter, netAttributesGetter,
@ -95,7 +95,7 @@ public final class HttpClientAttributesExtractor<REQUEST, RESPONSE>
new InternalServerAttributesExtractor<>( new InternalServerAttributesExtractor<>(
netAttributesGetter, netAttributesGetter,
this::shouldCaptureServerPort, this::shouldCaptureServerPort,
namePortGetter, addressPortExtractor,
SemconvStability.emitStableHttpSemconv(), SemconvStability.emitStableHttpSemconv(),
SemconvStability.emitOldHttpSemconv(), SemconvStability.emitOldHttpSemconv(),
InternalServerAttributesExtractor.Mode.PEER); InternalServerAttributesExtractor.Mode.PEER);

View File

@ -14,7 +14,7 @@ import static java.util.logging.Level.FINE;
import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.context.Context; import io.opentelemetry.context.Context;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.internal.FallbackNamePortGetter; import io.opentelemetry.instrumentation.api.instrumenter.network.internal.FallbackAddressPortExtractor;
import io.opentelemetry.instrumentation.api.internal.SemconvStability; import io.opentelemetry.instrumentation.api.internal.SemconvStability;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.util.List; import java.util.List;
@ -140,42 +140,34 @@ abstract class HttpCommonAttributesExtractor<
} }
} }
static final class HttpNetNamePortGetter<REQUEST> implements FallbackNamePortGetter<REQUEST> { static final class HttpNetAddressPortExtractor<REQUEST>
implements FallbackAddressPortExtractor<REQUEST> {
private final HttpCommonAttributesGetter<REQUEST, ?> getter; private final HttpCommonAttributesGetter<REQUEST, ?> getter;
HttpNetNamePortGetter(HttpCommonAttributesGetter<REQUEST, ?> getter) { HttpNetAddressPortExtractor(HttpCommonAttributesGetter<REQUEST, ?> getter) {
this.getter = getter; this.getter = getter;
} }
@Nullable
@Override @Override
public String name(REQUEST request) { public void extract(AddressPortSink sink, REQUEST request) {
String host = firstHeaderValue(getter.getHttpRequestHeader(request, "host")); String host = firstHeaderValue(getter.getHttpRequestHeader(request, "host"));
if (host == null) { if (host == null) {
return null; return;
}
int hostHeaderSeparator = host.indexOf(':');
return hostHeaderSeparator == -1 ? host : host.substring(0, hostHeaderSeparator);
} }
@Nullable
@Override
public Integer port(REQUEST request) {
String host = firstHeaderValue(getter.getHttpRequestHeader(request, "host"));
if (host == null) {
return null;
}
int hostHeaderSeparator = host.indexOf(':'); int hostHeaderSeparator = host.indexOf(':');
if (hostHeaderSeparator == -1) { if (hostHeaderSeparator == -1) {
return null; sink.setAddress(host);
return;
} }
sink.setAddress(host.substring(0, hostHeaderSeparator));
try { try {
return Integer.parseInt(host.substring(hostHeaderSeparator + 1)); sink.setPort(Integer.parseInt(host.substring(hostHeaderSeparator + 1)));
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
logger.log(FINE, e.getMessage(), e); logger.log(FINE, e.getMessage(), e);
} }
return null;
} }
} }
} }

View File

@ -15,8 +15,8 @@ import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.context.Context; import io.opentelemetry.context.Context;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesGetter; import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesGetter;
import io.opentelemetry.instrumentation.api.instrumenter.net.internal.FallbackNamePortGetter;
import io.opentelemetry.instrumentation.api.instrumenter.net.internal.InternalNetServerAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.net.internal.InternalNetServerAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.FallbackAddressPortExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalClientAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalClientAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalNetworkAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalNetworkAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalServerAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalServerAttributesExtractor;
@ -95,8 +95,8 @@ public final class HttpServerAttributesExtractor<REQUEST, RESPONSE>
List<String> capturedResponseHeaders, List<String> capturedResponseHeaders,
Function<Context, String> httpRouteHolderGetter) { Function<Context, String> httpRouteHolderGetter) {
super(httpAttributesGetter, capturedRequestHeaders, capturedResponseHeaders); super(httpAttributesGetter, capturedRequestHeaders, capturedResponseHeaders);
HttpNetNamePortGetter<REQUEST> namePortGetter = HttpNetAddressPortExtractor<REQUEST> addressPortExtractor =
new HttpNetNamePortGetter<>(httpAttributesGetter); new HttpNetAddressPortExtractor<>(httpAttributesGetter);
internalUrlExtractor = internalUrlExtractor =
new InternalUrlAttributesExtractor<>( new InternalUrlAttributesExtractor<>(
httpAttributesGetter, httpAttributesGetter,
@ -105,7 +105,7 @@ public final class HttpServerAttributesExtractor<REQUEST, RESPONSE>
SemconvStability.emitOldHttpSemconv()); SemconvStability.emitOldHttpSemconv());
internalNetExtractor = internalNetExtractor =
new InternalNetServerAttributesExtractor<>( new InternalNetServerAttributesExtractor<>(
netAttributesGetter, namePortGetter, SemconvStability.emitOldHttpSemconv()); netAttributesGetter, addressPortExtractor, SemconvStability.emitOldHttpSemconv());
internalNetworkExtractor = internalNetworkExtractor =
new InternalNetworkAttributesExtractor<>( new InternalNetworkAttributesExtractor<>(
netAttributesGetter, netAttributesGetter,
@ -116,14 +116,14 @@ public final class HttpServerAttributesExtractor<REQUEST, RESPONSE>
new InternalServerAttributesExtractor<>( new InternalServerAttributesExtractor<>(
netAttributesGetter, netAttributesGetter,
this::shouldCaptureServerPort, this::shouldCaptureServerPort,
namePortGetter, addressPortExtractor,
SemconvStability.emitStableHttpSemconv(), SemconvStability.emitStableHttpSemconv(),
SemconvStability.emitOldHttpSemconv(), SemconvStability.emitOldHttpSemconv(),
InternalServerAttributesExtractor.Mode.HOST); InternalServerAttributesExtractor.Mode.HOST);
internalClientExtractor = internalClientExtractor =
new InternalClientAttributesExtractor<>( new InternalClientAttributesExtractor<>(
netAttributesGetter, netAttributesGetter,
new ClientAddressGetter<>(httpAttributesGetter), new ClientAddressAndPortExtractor<>(httpAttributesGetter),
SemconvStability.emitStableHttpSemconv(), SemconvStability.emitStableHttpSemconv(),
SemconvStability.emitOldHttpSemconv()); SemconvStability.emitOldHttpSemconv());
this.httpRouteHolderGetter = httpRouteHolderGetter; this.httpRouteHolderGetter = httpRouteHolderGetter;
@ -204,41 +204,34 @@ public final class HttpServerAttributesExtractor<REQUEST, RESPONSE>
return SpanKey.HTTP_SERVER; return SpanKey.HTTP_SERVER;
} }
private static final class ClientAddressGetter<REQUEST> private static final class ClientAddressAndPortExtractor<REQUEST>
implements FallbackNamePortGetter<REQUEST> { implements FallbackAddressPortExtractor<REQUEST> {
private final HttpServerAttributesGetter<REQUEST, ?> getter; private final HttpServerAttributesGetter<REQUEST, ?> getter;
private ClientAddressGetter(HttpServerAttributesGetter<REQUEST, ?> getter) { private ClientAddressAndPortExtractor(HttpServerAttributesGetter<REQUEST, ?> getter) {
this.getter = getter; this.getter = getter;
} }
@Nullable
@Override @Override
public String name(REQUEST request) { public void extract(AddressPortSink sink, REQUEST request) {
// try Forwarded // try Forwarded
String forwarded = firstHeaderValue(getter.getHttpRequestHeader(request, "forwarded")); String forwarded = firstHeaderValue(getter.getHttpRequestHeader(request, "forwarded"));
if (forwarded != null) { if (forwarded != null) {
forwarded = extractClientIpFromForwardedHeader(forwarded); forwarded = extractClientIpFromForwardedHeader(forwarded);
if (forwarded != null) { if (forwarded != null) {
return forwarded; sink.setAddress(forwarded);
return;
} }
} }
// try X-Forwarded-For // try X-Forwarded-For
forwarded = firstHeaderValue(getter.getHttpRequestHeader(request, "x-forwarded-for")); forwarded = firstHeaderValue(getter.getHttpRequestHeader(request, "x-forwarded-for"));
if (forwarded != null) { if (forwarded != null) {
return extractClientIpFromForwardedForHeader(forwarded); sink.setAddress(extractClientIpFromForwardedForHeader(forwarded));
} }
return null;
}
@Nullable
@Override
public Integer port(REQUEST request) {
// TODO: client.port will be implemented in a future PR // TODO: client.port will be implemented in a future PR
return null;
} }
} }
} }

View File

@ -8,8 +8,8 @@ package io.opentelemetry.instrumentation.api.instrumenter.net;
import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.context.Context; import io.opentelemetry.context.Context;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.internal.FallbackNamePortGetter;
import io.opentelemetry.instrumentation.api.instrumenter.net.internal.InternalNetClientAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.net.internal.InternalNetClientAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.FallbackAddressPortExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalNetworkAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalNetworkAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalServerAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalServerAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.NetworkTransportFilter; import io.opentelemetry.instrumentation.api.instrumenter.network.internal.NetworkTransportFilter;
@ -39,7 +39,7 @@ public final class NetClientAttributesExtractor<REQUEST, RESPONSE>
private NetClientAttributesExtractor(NetClientAttributesGetter<REQUEST, RESPONSE> getter) { private NetClientAttributesExtractor(NetClientAttributesGetter<REQUEST, RESPONSE> getter) {
internalExtractor = internalExtractor =
new InternalNetClientAttributesExtractor<>( new InternalNetClientAttributesExtractor<>(
getter, FallbackNamePortGetter.noop(), SemconvStability.emitOldHttpSemconv()); getter, FallbackAddressPortExtractor.noop(), SemconvStability.emitOldHttpSemconv());
internalNetworkExtractor = internalNetworkExtractor =
new InternalNetworkAttributesExtractor<>( new InternalNetworkAttributesExtractor<>(
getter, getter,
@ -50,7 +50,7 @@ public final class NetClientAttributesExtractor<REQUEST, RESPONSE>
new InternalServerAttributesExtractor<>( new InternalServerAttributesExtractor<>(
getter, getter,
(port, request) -> true, (port, request) -> true,
FallbackNamePortGetter.noop(), FallbackAddressPortExtractor.noop(),
SemconvStability.emitStableHttpSemconv(), SemconvStability.emitStableHttpSemconv(),
SemconvStability.emitOldHttpSemconv(), SemconvStability.emitOldHttpSemconv(),
InternalServerAttributesExtractor.Mode.PEER); InternalServerAttributesExtractor.Mode.PEER);

View File

@ -8,8 +8,8 @@ package io.opentelemetry.instrumentation.api.instrumenter.net;
import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.context.Context; import io.opentelemetry.context.Context;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.internal.FallbackNamePortGetter;
import io.opentelemetry.instrumentation.api.instrumenter.net.internal.InternalNetServerAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.net.internal.InternalNetServerAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.FallbackAddressPortExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalClientAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalClientAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalNetworkAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalNetworkAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalServerAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalServerAttributesExtractor;
@ -38,7 +38,7 @@ public final class NetServerAttributesExtractor<REQUEST, RESPONSE>
private NetServerAttributesExtractor(NetServerAttributesGetter<REQUEST, RESPONSE> getter) { private NetServerAttributesExtractor(NetServerAttributesGetter<REQUEST, RESPONSE> getter) {
internalExtractor = internalExtractor =
new InternalNetServerAttributesExtractor<>( new InternalNetServerAttributesExtractor<>(
getter, FallbackNamePortGetter.noop(), SemconvStability.emitOldHttpSemconv()); getter, FallbackAddressPortExtractor.noop(), SemconvStability.emitOldHttpSemconv());
internalNetworkExtractor = internalNetworkExtractor =
new InternalNetworkAttributesExtractor<>( new InternalNetworkAttributesExtractor<>(
getter, getter,
@ -49,14 +49,14 @@ public final class NetServerAttributesExtractor<REQUEST, RESPONSE>
new InternalServerAttributesExtractor<>( new InternalServerAttributesExtractor<>(
getter, getter,
(port, request) -> true, (port, request) -> true,
FallbackNamePortGetter.noop(), FallbackAddressPortExtractor.noop(),
SemconvStability.emitStableHttpSemconv(), SemconvStability.emitStableHttpSemconv(),
SemconvStability.emitOldHttpSemconv(), SemconvStability.emitOldHttpSemconv(),
InternalServerAttributesExtractor.Mode.HOST); InternalServerAttributesExtractor.Mode.HOST);
internalClientExtractor = internalClientExtractor =
new InternalClientAttributesExtractor<>( new InternalClientAttributesExtractor<>(
getter, getter,
FallbackNamePortGetter.noop(), FallbackAddressPortExtractor.noop(),
SemconvStability.emitStableHttpSemconv(), SemconvStability.emitStableHttpSemconv(),
SemconvStability.emitOldHttpSemconv()); SemconvStability.emitOldHttpSemconv());
} }

View File

@ -1,26 +0,0 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.api.instrumenter.net.internal;
import javax.annotation.Nullable;
/**
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
* any time.
*/
public interface FallbackNamePortGetter<REQUEST> {
@Nullable
String name(REQUEST request);
@Nullable
Integer port(REQUEST request);
@SuppressWarnings("unchecked")
static <REQUEST> FallbackNamePortGetter<REQUEST> noop() {
return (FallbackNamePortGetter<REQUEST>) NoopNamePortGetter.INSTANCE;
}
}

View File

@ -9,6 +9,8 @@ import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorU
import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesGetter; import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesGetter;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.AddressAndPort;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.FallbackAddressPortExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -19,15 +21,15 @@ import javax.annotation.Nullable;
public final class InternalNetClientAttributesExtractor<REQUEST, RESPONSE> { public final class InternalNetClientAttributesExtractor<REQUEST, RESPONSE> {
private final NetClientAttributesGetter<REQUEST, RESPONSE> getter; private final NetClientAttributesGetter<REQUEST, RESPONSE> getter;
private final FallbackNamePortGetter<REQUEST> fallbackNamePortGetter; private final FallbackAddressPortExtractor<REQUEST> fallbackAddressPortExtractor;
private final boolean emitOldHttpAttributes; private final boolean emitOldHttpAttributes;
public InternalNetClientAttributesExtractor( public InternalNetClientAttributesExtractor(
NetClientAttributesGetter<REQUEST, RESPONSE> getter, NetClientAttributesGetter<REQUEST, RESPONSE> getter,
FallbackNamePortGetter<REQUEST> fallbackNamePortGetter, FallbackAddressPortExtractor<REQUEST> fallbackAddressPortExtractor,
boolean emitOldHttpAttributes) { boolean emitOldHttpAttributes) {
this.getter = getter; this.getter = getter;
this.fallbackNamePortGetter = fallbackNamePortGetter; this.fallbackAddressPortExtractor = fallbackAddressPortExtractor;
this.emitOldHttpAttributes = emitOldHttpAttributes; this.emitOldHttpAttributes = emitOldHttpAttributes;
} }
@ -49,10 +51,12 @@ public final class InternalNetClientAttributesExtractor<REQUEST, RESPONSE> {
} }
private String extractPeerName(REQUEST request) { private String extractPeerName(REQUEST request) {
String peerName = getter.getServerAddress(request); String serverAddress = getter.getServerAddress(request);
if (peerName == null) { if (serverAddress != null) {
peerName = fallbackNamePortGetter.name(request); return serverAddress;
} }
return peerName; AddressAndPort addressAndPort = new AddressAndPort();
fallbackAddressPortExtractor.extract(addressAndPort, request);
return addressAndPort.getAddress();
} }
} }

View File

@ -9,6 +9,8 @@ import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorU
import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesGetter; import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesGetter;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.AddressAndPort;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.FallbackAddressPortExtractor;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
/** /**
@ -18,15 +20,15 @@ import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
public final class InternalNetServerAttributesExtractor<REQUEST, RESPONSE> { public final class InternalNetServerAttributesExtractor<REQUEST, RESPONSE> {
private final NetServerAttributesGetter<REQUEST, RESPONSE> getter; private final NetServerAttributesGetter<REQUEST, RESPONSE> getter;
private final FallbackNamePortGetter<REQUEST> fallbackNamePortGetter; private final FallbackAddressPortExtractor<REQUEST> fallbackAddressPortExtractor;
private final boolean emitOldHttpAttributes; private final boolean emitOldHttpAttributes;
public InternalNetServerAttributesExtractor( public InternalNetServerAttributesExtractor(
NetServerAttributesGetter<REQUEST, RESPONSE> getter, NetServerAttributesGetter<REQUEST, RESPONSE> getter,
FallbackNamePortGetter<REQUEST> fallbackNamePortGetter, FallbackAddressPortExtractor<REQUEST> fallbackAddressPortExtractor,
boolean emitOldHttpAttributes) { boolean emitOldHttpAttributes) {
this.getter = getter; this.getter = getter;
this.fallbackNamePortGetter = fallbackNamePortGetter; this.fallbackAddressPortExtractor = fallbackAddressPortExtractor;
this.emitOldHttpAttributes = emitOldHttpAttributes; this.emitOldHttpAttributes = emitOldHttpAttributes;
} }
@ -59,9 +61,11 @@ public final class InternalNetServerAttributesExtractor<REQUEST, RESPONSE> {
private String extractServerAddress(REQUEST request) { private String extractServerAddress(REQUEST request) {
String serverAddress = getter.getServerAddress(request); String serverAddress = getter.getServerAddress(request);
if (serverAddress == null) { if (serverAddress != null) {
serverAddress = fallbackNamePortGetter.name(request);
}
return serverAddress; return serverAddress;
} }
AddressAndPort addressAndPort = new AddressAndPort();
fallbackAddressPortExtractor.extract(addressAndPort, request);
return addressAndPort.getAddress();
}
} }

View File

@ -1,24 +0,0 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.api.instrumenter.net.internal;
import javax.annotation.Nullable;
enum NoopNamePortGetter implements FallbackNamePortGetter<Object> {
INSTANCE;
@Nullable
@Override
public String name(Object o) {
return null;
}
@Nullable
@Override
public Integer port(Object o) {
return null;
}
}

View File

@ -8,7 +8,7 @@ package io.opentelemetry.instrumentation.api.instrumenter.network;
import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.context.Context; import io.opentelemetry.context.Context;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.internal.FallbackNamePortGetter; import io.opentelemetry.instrumentation.api.instrumenter.network.internal.FallbackAddressPortExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalClientAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalClientAttributesExtractor;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -36,7 +36,7 @@ public final class ClientAttributesExtractor<REQUEST, RESPONSE>
internalExtractor = internalExtractor =
new InternalClientAttributesExtractor<>( new InternalClientAttributesExtractor<>(
getter, getter,
FallbackNamePortGetter.noop(), FallbackAddressPortExtractor.noop(),
/* emitStableUrlAttributes= */ true, /* emitStableUrlAttributes= */ true,
/* emitOldHttpAttributes= */ false); /* emitOldHttpAttributes= */ false);
} }

View File

@ -8,7 +8,7 @@ package io.opentelemetry.instrumentation.api.instrumenter.network;
import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.context.Context; import io.opentelemetry.context.Context;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.internal.FallbackNamePortGetter; import io.opentelemetry.instrumentation.api.instrumenter.network.internal.FallbackAddressPortExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalServerAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalServerAttributesExtractor;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -37,7 +37,7 @@ public final class ServerAttributesExtractor<REQUEST, RESPONSE>
new InternalServerAttributesExtractor<>( new InternalServerAttributesExtractor<>(
getter, getter,
(port, request) -> true, (port, request) -> true,
FallbackNamePortGetter.noop(), FallbackAddressPortExtractor.noop(),
/* emitStableUrlAttributes= */ true, /* emitStableUrlAttributes= */ true,
/* emitOldHttpAttributes= */ false, /* emitOldHttpAttributes= */ false,
// this param does not matter when old semconv is off // this param does not matter when old semconv is off

View File

@ -0,0 +1,33 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.api.instrumenter.network.internal;
import javax.annotation.Nullable;
/**
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
* any time.
*/
public final class AddressAndPort implements FallbackAddressPortExtractor.AddressPortSink {
@Nullable String address;
@Nullable Integer port;
@Override
public void setAddress(String address) {
this.address = address;
}
@Override
public void setPort(int port) {
this.port = port;
}
@Nullable
public String getAddress() {
return address;
}
}

View File

@ -0,0 +1,30 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.api.instrumenter.network.internal;
/**
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
* any time.
*/
public interface FallbackAddressPortExtractor<REQUEST> {
void extract(AddressPortSink sink, REQUEST request);
static <REQUEST> FallbackAddressPortExtractor<REQUEST> noop() {
return (sink, request) -> {};
}
/**
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
* any time.
*/
interface AddressPortSink {
void setAddress(String address);
void setPort(int port);
}
}

View File

@ -8,7 +8,6 @@ package io.opentelemetry.instrumentation.api.instrumenter.network.internal;
import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet; import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet;
import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.net.internal.FallbackNamePortGetter;
import io.opentelemetry.instrumentation.api.instrumenter.network.ClientAttributesGetter; import io.opentelemetry.instrumentation.api.instrumenter.network.ClientAttributesGetter;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -20,41 +19,41 @@ import javax.annotation.Nullable;
public final class InternalClientAttributesExtractor<REQUEST, RESPONSE> { public final class InternalClientAttributesExtractor<REQUEST, RESPONSE> {
private final ClientAttributesGetter<REQUEST, RESPONSE> getter; private final ClientAttributesGetter<REQUEST, RESPONSE> getter;
private final FallbackNamePortGetter<REQUEST> fallbackNamePortGetter; private final FallbackAddressPortExtractor<REQUEST> fallbackAddressPortExtractor;
private final boolean emitStableUrlAttributes; private final boolean emitStableUrlAttributes;
private final boolean emitOldHttpAttributes; private final boolean emitOldHttpAttributes;
public InternalClientAttributesExtractor( public InternalClientAttributesExtractor(
ClientAttributesGetter<REQUEST, RESPONSE> getter, ClientAttributesGetter<REQUEST, RESPONSE> getter,
FallbackNamePortGetter<REQUEST> fallbackNamePortGetter, FallbackAddressPortExtractor<REQUEST> fallbackAddressPortExtractor,
boolean emitStableUrlAttributes, boolean emitStableUrlAttributes,
boolean emitOldHttpAttributes) { boolean emitOldHttpAttributes) {
this.getter = getter; this.getter = getter;
this.fallbackNamePortGetter = fallbackNamePortGetter; this.fallbackAddressPortExtractor = fallbackAddressPortExtractor;
this.emitStableUrlAttributes = emitStableUrlAttributes; this.emitStableUrlAttributes = emitStableUrlAttributes;
this.emitOldHttpAttributes = emitOldHttpAttributes; this.emitOldHttpAttributes = emitOldHttpAttributes;
} }
public void onStart(AttributesBuilder attributes, REQUEST request) { public void onStart(AttributesBuilder attributes, REQUEST request) {
String clientAddress = extractClientAddress(request); AddressAndPort clientAddressAndPort = extractClientAddressAndPort(request);
if (emitStableUrlAttributes) { if (emitStableUrlAttributes) {
internalSet(attributes, NetworkAttributes.CLIENT_ADDRESS, clientAddress); internalSet(attributes, NetworkAttributes.CLIENT_ADDRESS, clientAddressAndPort.address);
Integer clientPort = extractClientPort(request); if (clientAddressAndPort.port != null && clientAddressAndPort.port > 0) {
if (clientPort != null && clientPort > 0) { internalSet(attributes, NetworkAttributes.CLIENT_PORT, (long) clientAddressAndPort.port);
internalSet(attributes, NetworkAttributes.CLIENT_PORT, (long) clientPort);
} }
} }
if (emitOldHttpAttributes) { if (emitOldHttpAttributes) {
internalSet(attributes, SemanticAttributes.HTTP_CLIENT_IP, clientAddress); internalSet(attributes, SemanticAttributes.HTTP_CLIENT_IP, clientAddressAndPort.address);
} }
} }
public void onEnd(AttributesBuilder attributes, REQUEST request, @Nullable RESPONSE response) { public void onEnd(AttributesBuilder attributes, REQUEST request, @Nullable RESPONSE response) {
String clientAddress = extractClientAddress(request); AddressAndPort clientAddressAndPort = extractClientAddressAndPort(request);
String clientSocketAddress = getter.getClientSocketAddress(request, response); String clientSocketAddress = getter.getClientSocketAddress(request, response);
Integer clientSocketPort = getter.getClientSocketPort(request, response); Integer clientSocketPort = getter.getClientSocketPort(request, response);
if (clientSocketAddress != null && !clientSocketAddress.equals(clientAddress)) { if (clientSocketAddress != null && !clientSocketAddress.equals(clientAddressAndPort.address)) {
if (emitStableUrlAttributes) { if (emitStableUrlAttributes) {
internalSet(attributes, NetworkAttributes.CLIENT_SOCKET_ADDRESS, clientSocketAddress); internalSet(attributes, NetworkAttributes.CLIENT_SOCKET_ADDRESS, clientSocketAddress);
} }
@ -64,8 +63,7 @@ public final class InternalClientAttributesExtractor<REQUEST, RESPONSE> {
} }
if (clientSocketPort != null && clientSocketPort > 0) { if (clientSocketPort != null && clientSocketPort > 0) {
if (emitStableUrlAttributes) { if (emitStableUrlAttributes) {
Integer clientPort = extractClientPort(request); if (!clientSocketPort.equals(clientAddressAndPort.port)) {
if (!clientSocketPort.equals(clientPort)) {
internalSet(attributes, NetworkAttributes.CLIENT_SOCKET_PORT, (long) clientSocketPort); internalSet(attributes, NetworkAttributes.CLIENT_SOCKET_PORT, (long) clientSocketPort);
} }
} }
@ -75,19 +73,13 @@ public final class InternalClientAttributesExtractor<REQUEST, RESPONSE> {
} }
} }
private String extractClientAddress(REQUEST request) { private AddressAndPort extractClientAddressAndPort(REQUEST request) {
String clientAddress = getter.getClientAddress(request); AddressAndPort addressAndPort = new AddressAndPort();
if (clientAddress == null) { addressAndPort.address = getter.getClientAddress(request);
clientAddress = fallbackNamePortGetter.name(request); addressAndPort.port = getter.getClientPort(request);
if (addressAndPort.address == null && addressAndPort.port == null) {
fallbackAddressPortExtractor.extract(addressAndPort, request);
} }
return clientAddress; return addressAndPort;
}
private Integer extractClientPort(REQUEST request) {
Integer clientPort = getter.getClientPort(request);
if (clientPort == null) {
clientPort = fallbackNamePortGetter.port(request);
}
return clientPort;
} }
} }

View File

@ -9,7 +9,6 @@ import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorU
import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.net.internal.FallbackNamePortGetter;
import io.opentelemetry.instrumentation.api.instrumenter.network.ServerAttributesGetter; import io.opentelemetry.instrumentation.api.instrumenter.network.ServerAttributesGetter;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import java.util.function.BiPredicate; import java.util.function.BiPredicate;
@ -23,7 +22,7 @@ public final class InternalServerAttributesExtractor<REQUEST, RESPONSE> {
private final ServerAttributesGetter<REQUEST, RESPONSE> getter; private final ServerAttributesGetter<REQUEST, RESPONSE> getter;
private final BiPredicate<Integer, REQUEST> captureServerPortCondition; private final BiPredicate<Integer, REQUEST> captureServerPortCondition;
private final FallbackNamePortGetter<REQUEST> fallbackNamePortGetter; private final FallbackAddressPortExtractor<REQUEST> fallbackAddressPortExtractor;
private final boolean emitStableUrlAttributes; private final boolean emitStableUrlAttributes;
private final boolean emitOldHttpAttributes; private final boolean emitOldHttpAttributes;
private final Mode oldSemconvMode; private final Mode oldSemconvMode;
@ -31,45 +30,45 @@ public final class InternalServerAttributesExtractor<REQUEST, RESPONSE> {
public InternalServerAttributesExtractor( public InternalServerAttributesExtractor(
ServerAttributesGetter<REQUEST, RESPONSE> getter, ServerAttributesGetter<REQUEST, RESPONSE> getter,
BiPredicate<Integer, REQUEST> captureServerPortCondition, BiPredicate<Integer, REQUEST> captureServerPortCondition,
FallbackNamePortGetter<REQUEST> fallbackNamePortGetter, FallbackAddressPortExtractor<REQUEST> fallbackAddressPortExtractor,
boolean emitStableUrlAttributes, boolean emitStableUrlAttributes,
boolean emitOldHttpAttributes, boolean emitOldHttpAttributes,
Mode oldSemconvMode) { Mode oldSemconvMode) {
this.getter = getter; this.getter = getter;
this.captureServerPortCondition = captureServerPortCondition; this.captureServerPortCondition = captureServerPortCondition;
this.fallbackNamePortGetter = fallbackNamePortGetter; this.fallbackAddressPortExtractor = fallbackAddressPortExtractor;
this.emitStableUrlAttributes = emitStableUrlAttributes; this.emitStableUrlAttributes = emitStableUrlAttributes;
this.emitOldHttpAttributes = emitOldHttpAttributes; this.emitOldHttpAttributes = emitOldHttpAttributes;
this.oldSemconvMode = oldSemconvMode; this.oldSemconvMode = oldSemconvMode;
} }
public void onStart(AttributesBuilder attributes, REQUEST request) { public void onStart(AttributesBuilder attributes, REQUEST request) {
String serverAddress = extractServerAddress(request); AddressAndPort serverAddressAndPort = extractServerAddressAndPort(request);
if (emitStableUrlAttributes) { if (emitStableUrlAttributes) {
internalSet(attributes, NetworkAttributes.SERVER_ADDRESS, serverAddress); internalSet(attributes, NetworkAttributes.SERVER_ADDRESS, serverAddressAndPort.address);
} }
if (emitOldHttpAttributes) { if (emitOldHttpAttributes) {
internalSet(attributes, oldSemconvMode.address, serverAddress); internalSet(attributes, oldSemconvMode.address, serverAddressAndPort.address);
} }
Integer serverPort = extractServerPort(request); if (serverAddressAndPort.port != null
if (serverPort != null && serverAddressAndPort.port > 0
&& serverPort > 0 && captureServerPortCondition.test(serverAddressAndPort.port, request)) {
&& captureServerPortCondition.test(serverPort, request)) {
if (emitStableUrlAttributes) { if (emitStableUrlAttributes) {
internalSet(attributes, NetworkAttributes.SERVER_PORT, (long) serverPort); internalSet(attributes, NetworkAttributes.SERVER_PORT, (long) serverAddressAndPort.port);
} }
if (emitOldHttpAttributes) { if (emitOldHttpAttributes) {
internalSet(attributes, oldSemconvMode.port, (long) serverPort); internalSet(attributes, oldSemconvMode.port, (long) serverAddressAndPort.port);
} }
} }
} }
public void onEnd(AttributesBuilder attributes, REQUEST request, @Nullable RESPONSE response) { public void onEnd(AttributesBuilder attributes, REQUEST request, @Nullable RESPONSE response) {
String serverAddress = extractServerAddress(request); AddressAndPort serverAddressAndPort = extractServerAddressAndPort(request);
String serverSocketAddress = getter.getServerSocketAddress(request, response); String serverSocketAddress = getter.getServerSocketAddress(request, response);
if (serverSocketAddress != null && !serverSocketAddress.equals(serverAddress)) { if (serverSocketAddress != null && !serverSocketAddress.equals(serverAddressAndPort.address)) {
if (emitStableUrlAttributes) { if (emitStableUrlAttributes) {
internalSet(attributes, NetworkAttributes.SERVER_SOCKET_ADDRESS, serverSocketAddress); internalSet(attributes, NetworkAttributes.SERVER_SOCKET_ADDRESS, serverSocketAddress);
} }
@ -78,9 +77,10 @@ public final class InternalServerAttributesExtractor<REQUEST, RESPONSE> {
} }
} }
Integer serverPort = extractServerPort(request);
Integer serverSocketPort = getter.getServerSocketPort(request, response); Integer serverSocketPort = getter.getServerSocketPort(request, response);
if (serverSocketPort != null && serverSocketPort > 0 && !serverSocketPort.equals(serverPort)) { if (serverSocketPort != null
&& serverSocketPort > 0
&& !serverSocketPort.equals(serverAddressAndPort.port)) {
if (emitStableUrlAttributes) { if (emitStableUrlAttributes) {
internalSet(attributes, NetworkAttributes.SERVER_SOCKET_PORT, (long) serverSocketPort); internalSet(attributes, NetworkAttributes.SERVER_SOCKET_PORT, (long) serverSocketPort);
} }
@ -90,7 +90,7 @@ public final class InternalServerAttributesExtractor<REQUEST, RESPONSE> {
} }
String serverSocketDomain = getter.getServerSocketDomain(request, response); String serverSocketDomain = getter.getServerSocketDomain(request, response);
if (serverSocketDomain != null && !serverSocketDomain.equals(serverAddress)) { if (serverSocketDomain != null && !serverSocketDomain.equals(serverAddressAndPort.address)) {
if (emitStableUrlAttributes) { if (emitStableUrlAttributes) {
internalSet(attributes, NetworkAttributes.SERVER_SOCKET_DOMAIN, serverSocketDomain); internalSet(attributes, NetworkAttributes.SERVER_SOCKET_DOMAIN, serverSocketDomain);
} }
@ -100,20 +100,14 @@ public final class InternalServerAttributesExtractor<REQUEST, RESPONSE> {
} }
} }
private String extractServerAddress(REQUEST request) { private AddressAndPort extractServerAddressAndPort(REQUEST request) {
String serverAddress = getter.getServerAddress(request); AddressAndPort addressAndPort = new AddressAndPort();
if (serverAddress == null) { addressAndPort.address = getter.getServerAddress(request);
serverAddress = fallbackNamePortGetter.name(request); addressAndPort.port = getter.getServerPort(request);
if (addressAndPort.address == null && addressAndPort.port == null) {
fallbackAddressPortExtractor.extract(addressAndPort, request);
} }
return serverAddress; return addressAndPort;
}
private Integer extractServerPort(REQUEST request) {
Integer serverPort = getter.getServerPort(request);
if (serverPort == null) {
serverPort = fallbackNamePortGetter.port(request);
}
return serverPort;
} }
/** /**

View File

@ -69,12 +69,14 @@ final class GrizzlyNetAttributesGetter
@Nullable @Nullable
@Override @Override
public String getServerAddress(HttpRequestPacket request) { public String getServerAddress(HttpRequestPacket request) {
return request.getLocalHost(); // rely on the 'host' header parsing
return null;
} }
@Override @Override
public Integer getServerPort(HttpRequestPacket request) { public Integer getServerPort(HttpRequestPacket request) {
return request.getServerPort(); // rely on the 'host' header parsing
return null;
} }
@Nullable @Nullable

View File

@ -16,7 +16,7 @@ final class WebfluxServerNetAttributesGetter
@Nullable @Nullable
@Override @Override
public String getServerAddress(ServerWebExchange request) { public String getServerAddress(ServerWebExchange request) {
return null; return request.getRequest().getURI().getHost();
} }
@Nullable @Nullable