Refactor the `FallbackNamePortGetter` in preparation for `client.port` (#8865)
This commit is contained in:
parent
d875d997c1
commit
029e187281
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
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(':');
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
return serverAddress;
|
||||
AddressAndPort addressAndPort = new AddressAndPort();
|
||||
fallbackAddressPortExtractor.extract(addressAndPort, request);
|
||||
return addressAndPort.getAddress();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -16,7 +16,7 @@ final class WebfluxServerNetAttributesGetter
|
|||
@Nullable
|
||||
@Override
|
||||
public String getServerAddress(ServerWebExchange request) {
|
||||
return null;
|
||||
return request.getRequest().getURI().getHost();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
|
Loading…
Reference in New Issue