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,
ToIntFunction<Context> resendCountIncrementer) {
super(httpAttributesGetter, capturedRequestHeaders, capturedResponseHeaders);
HttpNetNamePortGetter<REQUEST> namePortGetter =
new HttpNetNamePortGetter<>(httpAttributesGetter);
HttpNetAddressPortExtractor<REQUEST> addressPortExtractor =
new HttpNetAddressPortExtractor<>(httpAttributesGetter);
internalNetExtractor =
new InternalNetClientAttributesExtractor<>(
netAttributesGetter, namePortGetter, SemconvStability.emitOldHttpSemconv());
netAttributesGetter, addressPortExtractor, SemconvStability.emitOldHttpSemconv());
internalNetworkExtractor =
new InternalNetworkAttributesExtractor<>(
netAttributesGetter,
@ -95,7 +95,7 @@ public final class HttpClientAttributesExtractor<REQUEST, RESPONSE>
new InternalServerAttributesExtractor<>(
netAttributesGetter,
this::shouldCaptureServerPort,
namePortGetter,
addressPortExtractor,
SemconvStability.emitStableHttpSemconv(),
SemconvStability.emitOldHttpSemconv(),
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.context.Context;
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.semconv.trace.attributes.SemanticAttributes;
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;
HttpNetNamePortGetter(HttpCommonAttributesGetter<REQUEST, ?> getter) {
HttpNetAddressPortExtractor(HttpCommonAttributesGetter<REQUEST, ?> getter) {
this.getter = getter;
}
@Nullable
@Override
public String name(REQUEST request) {
public void extract(AddressPortSink sink, REQUEST request) {
String host = firstHeaderValue(getter.getHttpRequestHeader(request, "host"));
if (host == null) {
return null;
}
int hostHeaderSeparator = host.indexOf(':');
return hostHeaderSeparator == -1 ? host : host.substring(0, hostHeaderSeparator);
return;
}
@Nullable
@Override
public Integer port(REQUEST request) {
String host = firstHeaderValue(getter.getHttpRequestHeader(request, "host"));
if (host == null) {
return null;
}
int hostHeaderSeparator = host.indexOf(':');
if (hostHeaderSeparator == -1) {
return null;
sink.setAddress(host);
return;
}
sink.setAddress(host.substring(0, hostHeaderSeparator));
try {
return Integer.parseInt(host.substring(hostHeaderSeparator + 1));
sink.setPort(Integer.parseInt(host.substring(hostHeaderSeparator + 1)));
} catch (NumberFormatException 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.instrumentation.api.instrumenter.AttributesExtractor;
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.network.internal.FallbackAddressPortExtractor;
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.InternalServerAttributesExtractor;
@ -95,8 +95,8 @@ public final class HttpServerAttributesExtractor<REQUEST, RESPONSE>
List<String> capturedResponseHeaders,
Function<Context, String> httpRouteHolderGetter) {
super(httpAttributesGetter, capturedRequestHeaders, capturedResponseHeaders);
HttpNetNamePortGetter<REQUEST> namePortGetter =
new HttpNetNamePortGetter<>(httpAttributesGetter);
HttpNetAddressPortExtractor<REQUEST> addressPortExtractor =
new HttpNetAddressPortExtractor<>(httpAttributesGetter);
internalUrlExtractor =
new InternalUrlAttributesExtractor<>(
httpAttributesGetter,
@ -105,7 +105,7 @@ public final class HttpServerAttributesExtractor<REQUEST, RESPONSE>
SemconvStability.emitOldHttpSemconv());
internalNetExtractor =
new InternalNetServerAttributesExtractor<>(
netAttributesGetter, namePortGetter, SemconvStability.emitOldHttpSemconv());
netAttributesGetter, addressPortExtractor, SemconvStability.emitOldHttpSemconv());
internalNetworkExtractor =
new InternalNetworkAttributesExtractor<>(
netAttributesGetter,
@ -116,14 +116,14 @@ public final class HttpServerAttributesExtractor<REQUEST, RESPONSE>
new InternalServerAttributesExtractor<>(
netAttributesGetter,
this::shouldCaptureServerPort,
namePortGetter,
addressPortExtractor,
SemconvStability.emitStableHttpSemconv(),
SemconvStability.emitOldHttpSemconv(),
InternalServerAttributesExtractor.Mode.HOST);
internalClientExtractor =
new InternalClientAttributesExtractor<>(
netAttributesGetter,
new ClientAddressGetter<>(httpAttributesGetter),
new ClientAddressAndPortExtractor<>(httpAttributesGetter),
SemconvStability.emitStableHttpSemconv(),
SemconvStability.emitOldHttpSemconv());
this.httpRouteHolderGetter = httpRouteHolderGetter;
@ -204,41 +204,34 @@ public final class HttpServerAttributesExtractor<REQUEST, RESPONSE>
return SpanKey.HTTP_SERVER;
}
private static final class ClientAddressGetter<REQUEST>
implements FallbackNamePortGetter<REQUEST> {
private static final class ClientAddressAndPortExtractor<REQUEST>
implements FallbackAddressPortExtractor<REQUEST> {
private final HttpServerAttributesGetter<REQUEST, ?> getter;
private ClientAddressGetter(HttpServerAttributesGetter<REQUEST, ?> getter) {
private ClientAddressAndPortExtractor(HttpServerAttributesGetter<REQUEST, ?> getter) {
this.getter = getter;
}
@Nullable
@Override
public String name(REQUEST request) {
public void extract(AddressPortSink sink, REQUEST request) {
// try Forwarded
String forwarded = firstHeaderValue(getter.getHttpRequestHeader(request, "forwarded"));
if (forwarded != null) {
forwarded = extractClientIpFromForwardedHeader(forwarded);
if (forwarded != null) {
return forwarded;
sink.setAddress(forwarded);
return;
}
}
// try X-Forwarded-For
forwarded = firstHeaderValue(getter.getHttpRequestHeader(request, "x-forwarded-for"));
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
return null;
}
}
}

View File

@ -8,8 +8,8 @@ package io.opentelemetry.instrumentation.api.instrumenter.net;
import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.context.Context;
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.network.internal.FallbackAddressPortExtractor;
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.NetworkTransportFilter;
@ -39,7 +39,7 @@ public final class NetClientAttributesExtractor<REQUEST, RESPONSE>
private NetClientAttributesExtractor(NetClientAttributesGetter<REQUEST, RESPONSE> getter) {
internalExtractor =
new InternalNetClientAttributesExtractor<>(
getter, FallbackNamePortGetter.noop(), SemconvStability.emitOldHttpSemconv());
getter, FallbackAddressPortExtractor.noop(), SemconvStability.emitOldHttpSemconv());
internalNetworkExtractor =
new InternalNetworkAttributesExtractor<>(
getter,
@ -50,7 +50,7 @@ public final class NetClientAttributesExtractor<REQUEST, RESPONSE>
new InternalServerAttributesExtractor<>(
getter,
(port, request) -> true,
FallbackNamePortGetter.noop(),
FallbackAddressPortExtractor.noop(),
SemconvStability.emitStableHttpSemconv(),
SemconvStability.emitOldHttpSemconv(),
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.context.Context;
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.network.internal.FallbackAddressPortExtractor;
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.InternalServerAttributesExtractor;
@ -38,7 +38,7 @@ public final class NetServerAttributesExtractor<REQUEST, RESPONSE>
private NetServerAttributesExtractor(NetServerAttributesGetter<REQUEST, RESPONSE> getter) {
internalExtractor =
new InternalNetServerAttributesExtractor<>(
getter, FallbackNamePortGetter.noop(), SemconvStability.emitOldHttpSemconv());
getter, FallbackAddressPortExtractor.noop(), SemconvStability.emitOldHttpSemconv());
internalNetworkExtractor =
new InternalNetworkAttributesExtractor<>(
getter,
@ -49,14 +49,14 @@ public final class NetServerAttributesExtractor<REQUEST, RESPONSE>
new InternalServerAttributesExtractor<>(
getter,
(port, request) -> true,
FallbackNamePortGetter.noop(),
FallbackAddressPortExtractor.noop(),
SemconvStability.emitStableHttpSemconv(),
SemconvStability.emitOldHttpSemconv(),
InternalServerAttributesExtractor.Mode.HOST);
internalClientExtractor =
new InternalClientAttributesExtractor<>(
getter,
FallbackNamePortGetter.noop(),
FallbackAddressPortExtractor.noop(),
SemconvStability.emitStableHttpSemconv(),
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.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 javax.annotation.Nullable;
@ -19,15 +21,15 @@ import javax.annotation.Nullable;
public final class InternalNetClientAttributesExtractor<REQUEST, RESPONSE> {
private final NetClientAttributesGetter<REQUEST, RESPONSE> getter;
private final FallbackNamePortGetter<REQUEST> fallbackNamePortGetter;
private final FallbackAddressPortExtractor<REQUEST> fallbackAddressPortExtractor;
private final boolean emitOldHttpAttributes;
public InternalNetClientAttributesExtractor(
NetClientAttributesGetter<REQUEST, RESPONSE> getter,
FallbackNamePortGetter<REQUEST> fallbackNamePortGetter,
FallbackAddressPortExtractor<REQUEST> fallbackAddressPortExtractor,
boolean emitOldHttpAttributes) {
this.getter = getter;
this.fallbackNamePortGetter = fallbackNamePortGetter;
this.fallbackAddressPortExtractor = fallbackAddressPortExtractor;
this.emitOldHttpAttributes = emitOldHttpAttributes;
}
@ -49,10 +51,12 @@ public final class InternalNetClientAttributesExtractor<REQUEST, RESPONSE> {
}
private String extractPeerName(REQUEST request) {
String peerName = getter.getServerAddress(request);
if (peerName == null) {
peerName = fallbackNamePortGetter.name(request);
String serverAddress = getter.getServerAddress(request);
if (serverAddress != null) {
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.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;
/**
@ -18,15 +20,15 @@ import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
public final class InternalNetServerAttributesExtractor<REQUEST, RESPONSE> {
private final NetServerAttributesGetter<REQUEST, RESPONSE> getter;
private final FallbackNamePortGetter<REQUEST> fallbackNamePortGetter;
private final FallbackAddressPortExtractor<REQUEST> fallbackAddressPortExtractor;
private final boolean emitOldHttpAttributes;
public InternalNetServerAttributesExtractor(
NetServerAttributesGetter<REQUEST, RESPONSE> getter,
FallbackNamePortGetter<REQUEST> fallbackNamePortGetter,
FallbackAddressPortExtractor<REQUEST> fallbackAddressPortExtractor,
boolean emitOldHttpAttributes) {
this.getter = getter;
this.fallbackNamePortGetter = fallbackNamePortGetter;
this.fallbackAddressPortExtractor = fallbackAddressPortExtractor;
this.emitOldHttpAttributes = emitOldHttpAttributes;
}
@ -59,9 +61,11 @@ public final class InternalNetServerAttributesExtractor<REQUEST, RESPONSE> {
private String extractServerAddress(REQUEST request) {
String serverAddress = getter.getServerAddress(request);
if (serverAddress == null) {
serverAddress = fallbackNamePortGetter.name(request);
}
if (serverAddress != null) {
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.context.Context;
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 javax.annotation.Nullable;
@ -36,7 +36,7 @@ public final class ClientAttributesExtractor<REQUEST, RESPONSE>
internalExtractor =
new InternalClientAttributesExtractor<>(
getter,
FallbackNamePortGetter.noop(),
FallbackAddressPortExtractor.noop(),
/* emitStableUrlAttributes= */ true,
/* emitOldHttpAttributes= */ false);
}

View File

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

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

View File

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

View File

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