Skip to content

Commit

Permalink
Implement new stable network semantic conventions (open-telemetry#8616)
Browse files Browse the repository at this point in the history
  • Loading branch information
Mateusz Rzeszutek authored Jun 12, 2023
1 parent 40ed895 commit 506ccb6
Show file tree
Hide file tree
Showing 79 changed files with 1,683 additions and 200 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesGetter;
import io.opentelemetry.instrumentation.api.instrumenter.net.internal.InternalNetClientAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalNetworkAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.url.internal.UrlAttributes;
import io.opentelemetry.instrumentation.api.internal.SemconvStability;
import io.opentelemetry.instrumentation.api.internal.SpanKey;
Expand Down Expand Up @@ -53,6 +54,7 @@ public static <REQUEST, RESPONSE> HttpClientAttributesExtractorBuilder<REQUEST,
}

private final InternalNetClientAttributesExtractor<REQUEST, RESPONSE> internalNetExtractor;
private final InternalNetworkAttributesExtractor<REQUEST, RESPONSE> internalNetworkExtractor;
private final ToIntFunction<Context> resendCountIncrementer;

HttpClientAttributesExtractor(
Expand Down Expand Up @@ -80,7 +82,14 @@ public static <REQUEST, RESPONSE> HttpClientAttributesExtractorBuilder<REQUEST,
new InternalNetClientAttributesExtractor<>(
netAttributesGetter,
this::shouldCapturePeerPort,
new HttpNetNamePortGetter<>(httpAttributesGetter));
new HttpNetNamePortGetter<>(httpAttributesGetter),
SemconvStability.emitOldHttpSemconv());
internalNetworkExtractor =
new InternalNetworkAttributesExtractor<>(
netAttributesGetter,
HttpNetworkTransportFilter.INSTANCE,
SemconvStability.emitStableHttpSemconv(),
SemconvStability.emitOldHttpSemconv());
this.resendCountIncrementer = resendCountIncrementer;
}

Expand Down Expand Up @@ -121,6 +130,7 @@ public void onEnd(
super.onEnd(attributes, context, request, response, error);

internalNetExtractor.onEnd(attributes, request, response);
internalNetworkExtractor.onEnd(attributes, request, response);

int resendCount = resendCountIncrementer.applyAsInt(context);
if (resendCount > 0) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.instrumentation.api.instrumenter.http;

import io.opentelemetry.instrumentation.api.instrumenter.network.internal.NetworkTransportFilter;
import javax.annotation.Nullable;

enum HttpNetworkTransportFilter implements NetworkTransportFilter {
INSTANCE;

@Override
public boolean shouldAddNetworkTransport(
@Nullable String protocolName,
@Nullable String protocolVersion,
@Nullable String proposedTransport) {
// tcp is the default transport for http/1* and http/2*, we're skipping it
if ("http".equals(protocolName)
&& protocolVersion != null
&& (protocolVersion.startsWith("1") || protocolVersion.startsWith("2"))
&& "tcp".equals(proposedTransport)) {
return false;
}
// udp is the default transport for http/3*, we're skipping it
if ("http".equals(protocolName)
&& protocolVersion != null
&& protocolVersion.startsWith("3")
&& "udp".equals(proposedTransport)) {
return false;
}
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetServerAttributesGetter;
import io.opentelemetry.instrumentation.api.instrumenter.net.internal.InternalNetServerAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.InternalNetworkAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.url.internal.InternalUrlAttributesExtractor;
import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil;
import io.opentelemetry.instrumentation.api.internal.SemconvStability;
Expand Down Expand Up @@ -43,7 +44,7 @@ public final class HttpServerAttributesExtractor<REQUEST, RESPONSE>
/** Creates the HTTP server attributes extractor with default configuration. */
public static <REQUEST, RESPONSE> AttributesExtractor<REQUEST, RESPONSE> create(
HttpServerAttributesGetter<REQUEST, RESPONSE> httpAttributesGetter,
NetServerAttributesGetter<REQUEST> netAttributesGetter) {
NetServerAttributesGetter<REQUEST, RESPONSE> netAttributesGetter) {
return builder(httpAttributesGetter, netAttributesGetter).build();
}

Expand All @@ -53,7 +54,7 @@ public static <REQUEST, RESPONSE> AttributesExtractor<REQUEST, RESPONSE> create(
*/
public static <REQUEST, RESPONSE> HttpServerAttributesExtractorBuilder<REQUEST, RESPONSE> builder(
HttpServerAttributesGetter<REQUEST, RESPONSE> httpAttributesGetter,
NetServerAttributesGetter<REQUEST> netAttributesGetter) {
NetServerAttributesGetter<REQUEST, RESPONSE> netAttributesGetter) {
return new HttpServerAttributesExtractorBuilder<>(httpAttributesGetter, netAttributesGetter);
}

Expand All @@ -64,12 +65,13 @@ public static <REQUEST, RESPONSE> HttpServerAttributesExtractorBuilder<REQUEST,
"otel.instrumentation.http.prefer-forwarded-url-scheme", false);

private final InternalUrlAttributesExtractor<REQUEST> internalUrlExtractor;
private final InternalNetServerAttributesExtractor<REQUEST> internalNetExtractor;
private final InternalNetServerAttributesExtractor<REQUEST, RESPONSE> internalNetExtractor;
private final InternalNetworkAttributesExtractor<REQUEST, RESPONSE> internalNetworkExtractor;
private final Function<Context, String> httpRouteHolderGetter;

HttpServerAttributesExtractor(
HttpServerAttributesGetter<REQUEST, RESPONSE> httpAttributesGetter,
NetServerAttributesGetter<REQUEST> netAttributesGetter,
NetServerAttributesGetter<REQUEST, RESPONSE> netAttributesGetter,
List<String> capturedRequestHeaders,
List<String> capturedResponseHeaders) {
this(
Expand All @@ -83,7 +85,7 @@ public static <REQUEST, RESPONSE> HttpServerAttributesExtractorBuilder<REQUEST,
// visible for tests
HttpServerAttributesExtractor(
HttpServerAttributesGetter<REQUEST, RESPONSE> httpAttributesGetter,
NetServerAttributesGetter<REQUEST> netAttributesGetter,
NetServerAttributesGetter<REQUEST, RESPONSE> netAttributesGetter,
List<String> capturedRequestHeaders,
List<String> capturedResponseHeaders,
Function<Context, String> httpRouteHolderGetter) {
Expand All @@ -98,7 +100,14 @@ public static <REQUEST, RESPONSE> HttpServerAttributesExtractorBuilder<REQUEST,
new InternalNetServerAttributesExtractor<>(
netAttributesGetter,
this::shouldCaptureHostPort,
new HttpNetNamePortGetter<>(httpAttributesGetter));
new HttpNetNamePortGetter<>(httpAttributesGetter),
SemconvStability.emitOldHttpSemconv());
internalNetworkExtractor =
new InternalNetworkAttributesExtractor<>(
netAttributesGetter,
HttpNetworkTransportFilter.INSTANCE,
SemconvStability.emitStableHttpSemconv(),
SemconvStability.emitOldHttpSemconv());
this.httpRouteHolderGetter = httpRouteHolderGetter;
}

Expand Down Expand Up @@ -134,6 +143,9 @@ public void onEnd(
@Nullable Throwable error) {

super.onEnd(attributes, context, request, response, error);

internalNetworkExtractor.onEnd(attributes, request, response);

internalSet(attributes, SemanticAttributes.HTTP_ROUTE, httpRouteHolderGetter.apply(context));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@
public final class HttpServerAttributesExtractorBuilder<REQUEST, RESPONSE> {

final HttpServerAttributesGetter<REQUEST, RESPONSE> httpAttributesGetter;
final NetServerAttributesGetter<REQUEST> netAttributesGetter;
final NetServerAttributesGetter<REQUEST, RESPONSE> netAttributesGetter;
List<String> capturedRequestHeaders = emptyList();
List<String> capturedResponseHeaders = emptyList();

HttpServerAttributesExtractorBuilder(
HttpServerAttributesGetter<REQUEST, RESPONSE> httpAttributesGetter,
NetServerAttributesGetter<REQUEST> netAttributesGetter) {
NetServerAttributesGetter<REQUEST, RESPONSE> netAttributesGetter) {
this.httpAttributesGetter = httpAttributesGetter;
this.netAttributesGetter = netAttributesGetter;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@
* NetServerAttributesGetter#getHostSocketAddress(Object)} methods instead.
*/
@Deprecated
public abstract class InetSocketAddressNetServerAttributesGetter<REQUEST>
implements NetServerAttributesGetter<REQUEST> {
public abstract class InetSocketAddressNetServerAttributesGetter<REQUEST, RESPONSE>
implements NetServerAttributesGetter<REQUEST, RESPONSE> {

@Nullable
@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,19 @@ static String getSockFamily(
return null;
}

@Nullable
static String getNetworkType(
@Nullable InetSocketAddress address, @Nullable InetSocketAddress otherAddress) {
if (address == null) {
address = otherAddress;
}
if (address == null) {
return null;
}
InetAddress remoteAddress = address.getAddress();
return remoteAddress instanceof Inet6Address ? "ipv6" : "ipv4";
}

@Nullable
static String getHostName(@Nullable InetSocketAddress address) {
if (address == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
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.InternalNetworkAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.NetworkTransportFilter;
import io.opentelemetry.instrumentation.api.internal.SemconvStability;
import javax.annotation.Nullable;

/**
Expand All @@ -25,6 +28,7 @@ public final class NetClientAttributesExtractor<REQUEST, RESPONSE>
implements AttributesExtractor<REQUEST, RESPONSE> {

private final InternalNetClientAttributesExtractor<REQUEST, RESPONSE> internalExtractor;
private final InternalNetworkAttributesExtractor<REQUEST, RESPONSE> internalNetworkExtractor;

public static <REQUEST, RESPONSE> AttributesExtractor<REQUEST, RESPONSE> create(
NetClientAttributesGetter<REQUEST, RESPONSE> getter) {
Expand All @@ -34,7 +38,16 @@ public static <REQUEST, RESPONSE> AttributesExtractor<REQUEST, RESPONSE> create(
private NetClientAttributesExtractor(NetClientAttributesGetter<REQUEST, RESPONSE> getter) {
internalExtractor =
new InternalNetClientAttributesExtractor<>(
getter, (port, request) -> true, FallbackNamePortGetter.noop());
getter,
(port, request) -> true,
FallbackNamePortGetter.noop(),
SemconvStability.emitOldHttpSemconv());
internalNetworkExtractor =
new InternalNetworkAttributesExtractor<>(
getter,
NetworkTransportFilter.alwaysTrue(),
SemconvStability.emitStableHttpSemconv(),
SemconvStability.emitOldHttpSemconv());
}

@Override
Expand All @@ -50,5 +63,6 @@ public void onEnd(
@Nullable RESPONSE response,
@Nullable Throwable error) {
internalExtractor.onEnd(attributes, request, response);
internalNetworkExtractor.onEnd(attributes, request, response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

package io.opentelemetry.instrumentation.api.instrumenter.net;

import io.opentelemetry.instrumentation.api.instrumenter.network.NetworkAttributesGetter;
import java.net.InetSocketAddress;
import javax.annotation.Nullable;

Expand All @@ -16,7 +17,8 @@
* library/framework. It will be used by the NetClientAttributesExtractor to obtain the various
* network attributes in a type-generic way.
*/
public interface NetClientAttributesGetter<REQUEST, RESPONSE> {
public interface NetClientAttributesGetter<REQUEST, RESPONSE>
extends NetworkAttributesGetter<REQUEST, RESPONSE> {

@Nullable
default String getTransport(REQUEST request, @Nullable RESPONSE response) {
Expand All @@ -27,7 +29,11 @@ default String getTransport(REQUEST request, @Nullable RESPONSE response) {
* Returns the application protocol used.
*
* <p>Examples: `amqp`, `http`, `mqtt`.
*
* @deprecated This method is deprecated and will be removed in the following release. Implement
* {@link #getNetworkProtocolName(Object, Object)} instead.
*/
@Deprecated
@Nullable
default String getProtocolName(REQUEST request, @Nullable RESPONSE response) {
return null;
Expand All @@ -37,12 +43,37 @@ default String getProtocolName(REQUEST request, @Nullable RESPONSE response) {
* Returns the version of the application protocol used.
*
* <p>Examples: `3.1.1`.
*
* @deprecated This method is deprecated and will be removed in the following release. Implement
* {@link #getNetworkProtocolVersion(Object, Object)} instead.
*/
@Deprecated
@Nullable
default String getProtocolVersion(REQUEST request, @Nullable RESPONSE response) {
return null;
}

/** {@inheritDoc} */
@Nullable
@Override
default String getNetworkType(REQUEST request, @Nullable RESPONSE response) {
return InetSocketAddressUtil.getNetworkType(getPeerSocketAddress(request, response), null);
}

/** {@inheritDoc} */
@Nullable
@Override
default String getNetworkProtocolName(REQUEST request, @Nullable RESPONSE response) {
return getProtocolName(request, response);
}

/** {@inheritDoc} */
@Nullable
@Override
default String getNetworkProtocolVersion(REQUEST request, @Nullable RESPONSE response) {
return getProtocolVersion(request, response);
}

@Nullable
String getPeerName(REQUEST request);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
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.InternalNetworkAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.NetworkTransportFilter;
import io.opentelemetry.instrumentation.api.internal.SemconvStability;
import javax.annotation.Nullable;

/**
Expand All @@ -20,17 +23,27 @@
public final class NetServerAttributesExtractor<REQUEST, RESPONSE>
implements AttributesExtractor<REQUEST, RESPONSE> {

private final InternalNetServerAttributesExtractor<REQUEST> internalExtractor;

public static <REQUEST, RESPONSE> AttributesExtractor<REQUEST, RESPONSE> create(
NetServerAttributesGetter<REQUEST> getter) {
NetServerAttributesGetter<REQUEST, RESPONSE> getter) {
return new NetServerAttributesExtractor<>(getter);
}

private NetServerAttributesExtractor(NetServerAttributesGetter<REQUEST> getter) {
private final InternalNetServerAttributesExtractor<REQUEST, RESPONSE> internalExtractor;
private final InternalNetworkAttributesExtractor<REQUEST, RESPONSE> internalNetworkExtractor;

private NetServerAttributesExtractor(NetServerAttributesGetter<REQUEST, RESPONSE> getter) {
internalExtractor =
new InternalNetServerAttributesExtractor<>(
getter, (integer, request) -> true, FallbackNamePortGetter.noop());
getter,
(integer, request) -> true,
FallbackNamePortGetter.noop(),
SemconvStability.emitOldHttpSemconv());
internalNetworkExtractor =
new InternalNetworkAttributesExtractor<>(
getter,
NetworkTransportFilter.alwaysTrue(),
SemconvStability.emitStableHttpSemconv(),
SemconvStability.emitOldHttpSemconv());
}

@Override
Expand All @@ -44,5 +57,7 @@ public void onEnd(
Context context,
REQUEST request,
@Nullable RESPONSE response,
@Nullable Throwable error) {}
@Nullable Throwable error) {
internalNetworkExtractor.onEnd(attributes, request, response);
}
}
Loading

0 comments on commit 506ccb6

Please sign in to comment.