From d7dd593e440d475c9990808d8ac0aff3dcbbec9e Mon Sep 17 00:00:00 2001 From: Mateusz Rzeszutek Date: Tue, 10 Oct 2023 12:14:46 +0200 Subject: [PATCH] Add url.scheme to HTTP client metrics --- .../http/HttpClientExperimentalMetrics.java | 3 ++- .../api/instrumenter/http/HttpClientMetrics.java | 3 ++- .../api/instrumenter/http/HttpMetricsAdvice.java | 4 +++- .../api/instrumenter/http/HttpMetricsUtil.java | 15 +++++++++++++++ ...lientExperimentalMetricsStableSemconvTest.java | 7 ++++--- .../http/HttpClientMetricsStableSemconvTest.java | 4 ++-- 6 files changed, 28 insertions(+), 8 deletions(-) diff --git a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientExperimentalMetrics.java b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientExperimentalMetrics.java index 84c07318753e..e8a3fcf2a636 100644 --- a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientExperimentalMetrics.java +++ b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientExperimentalMetrics.java @@ -7,6 +7,7 @@ import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpMessageBodySizeUtil.getHttpRequestBodySize; import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpMessageBodySizeUtil.getHttpResponseBodySize; +import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpMetricsUtil.mergeClientAttributes; import static java.util.logging.Level.FINE; import io.opentelemetry.api.common.Attributes; @@ -83,7 +84,7 @@ public void onEnd(Context context, Attributes endAttributes, long endNanos) { return; } - Attributes sizeAttributes = startAttributes.toBuilder().putAll(endAttributes).build(); + Attributes sizeAttributes = mergeClientAttributes(startAttributes, endAttributes); Long requestBodySize = getHttpRequestBodySize(endAttributes, startAttributes); if (requestBodySize != null) { diff --git a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientMetrics.java b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientMetrics.java index 5e61b9046d25..d8e2c9cba68c 100644 --- a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientMetrics.java +++ b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientMetrics.java @@ -6,6 +6,7 @@ package io.opentelemetry.instrumentation.api.instrumenter.http; import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpMetricsUtil.createStableDurationHistogramBuilder; +import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpMetricsUtil.mergeClientAttributes; import static java.util.logging.Level.FINE; import com.google.auto.value.AutoValue; @@ -90,7 +91,7 @@ public void onEnd(Context context, Attributes endAttributes, long endNanos) { return; } - Attributes attributes = state.startAttributes().toBuilder().putAll(endAttributes).build(); + Attributes attributes = mergeClientAttributes(state.startAttributes(), endAttributes); if (stableDuration != null) { stableDuration.record((endNanos - state.startTimeNanos()) / NANOS_PER_S, attributes, context); diff --git a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpMetricsAdvice.java b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpMetricsAdvice.java index 88aa3783fd2a..a846b8e0838a 100644 --- a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpMetricsAdvice.java +++ b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpMetricsAdvice.java @@ -29,7 +29,8 @@ static void applyStableClientDurationAdvice(DoubleHistogramBuilder builder) { SemanticAttributes.NETWORK_PROTOCOL_NAME, SemanticAttributes.NETWORK_PROTOCOL_VERSION, SemanticAttributes.SERVER_ADDRESS, - SemanticAttributes.SERVER_PORT)); + SemanticAttributes.SERVER_PORT, + SemanticAttributes.URL_SCHEME)); } @SuppressWarnings("deprecation") // until old http semconv are dropped in 2.0 @@ -64,6 +65,7 @@ static void applyClientRequestSizeAdvice(LongHistogramBuilder builder) { SemanticAttributes.NETWORK_PROTOCOL_VERSION, SemanticAttributes.SERVER_ADDRESS, SemanticAttributes.SERVER_PORT, + SemanticAttributes.URL_SCHEME, // old attributes SemanticAttributes.HTTP_METHOD, SemanticAttributes.HTTP_STATUS_CODE, diff --git a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpMetricsUtil.java b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpMetricsUtil.java index 8960e1e67fd4..adb992da95b8 100644 --- a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpMetricsUtil.java +++ b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpMetricsUtil.java @@ -8,9 +8,12 @@ import static java.util.Arrays.asList; import static java.util.Collections.unmodifiableList; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.api.metrics.DoubleHistogramBuilder; import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.extension.incubator.metrics.ExtendedDoubleHistogramBuilder; +import io.opentelemetry.semconv.SemanticAttributes; import java.util.List; final class HttpMetricsUtil { @@ -31,5 +34,17 @@ static DoubleHistogramBuilder createStableDurationHistogramBuilder( return durationBuilder; } + static Attributes mergeClientAttributes(Attributes startAttributes, Attributes endAttributes) { + AttributesBuilder builder = startAttributes.toBuilder().putAll(endAttributes); + String url = startAttributes.get(SemanticAttributes.URL_FULL); + if (url != null) { + int index = url.indexOf("://"); + if (index > 0) { + builder.put(SemanticAttributes.URL_SCHEME, url.substring(0, index)); + } + } + return builder.build(); + } + private HttpMetricsUtil() {} } diff --git a/instrumentation-api-semconv/src/testStableHttpSemconv/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientExperimentalMetricsStableSemconvTest.java b/instrumentation-api-semconv/src/testStableHttpSemconv/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientExperimentalMetricsStableSemconvTest.java index d35d02d67955..cbad29ecc586 100644 --- a/instrumentation-api-semconv/src/testStableHttpSemconv/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientExperimentalMetricsStableSemconvTest.java +++ b/instrumentation-api-semconv/src/testStableHttpSemconv/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientExperimentalMetricsStableSemconvTest.java @@ -36,7 +36,6 @@ void collectsMetrics() { Attributes.builder() .put(SemanticAttributes.HTTP_REQUEST_METHOD, "GET") .put(SemanticAttributes.URL_FULL, "https://localhost:1234/") - .put(SemanticAttributes.URL_SCHEME, "https") .put(SemanticAttributes.URL_PATH, "/") .put(SemanticAttributes.URL_QUERY, "q=a") .put(SemanticAttributes.SERVER_ADDRESS, "localhost") @@ -97,7 +96,8 @@ void collectsMetrics() { equalTo( SemanticAttributes.NETWORK_PROTOCOL_VERSION, "2.0"), equalTo(SemanticAttributes.SERVER_ADDRESS, "localhost"), - equalTo(SemanticAttributes.SERVER_PORT, 1234)) + equalTo(SemanticAttributes.SERVER_PORT, 1234), + equalTo(SemanticAttributes.URL_SCHEME, "https")) .hasExemplarsSatisfying( exemplar -> exemplar @@ -123,7 +123,8 @@ void collectsMetrics() { equalTo( SemanticAttributes.NETWORK_PROTOCOL_VERSION, "2.0"), equalTo(SemanticAttributes.SERVER_ADDRESS, "localhost"), - equalTo(SemanticAttributes.SERVER_PORT, 1234)) + equalTo(SemanticAttributes.SERVER_PORT, 1234), + equalTo(SemanticAttributes.URL_SCHEME, "https")) .hasExemplarsSatisfying( exemplar -> exemplar diff --git a/instrumentation-api-semconv/src/testStableHttpSemconv/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientMetricsStableSemconvTest.java b/instrumentation-api-semconv/src/testStableHttpSemconv/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientMetricsStableSemconvTest.java index 7360965693ce..269bf1d53aa2 100644 --- a/instrumentation-api-semconv/src/testStableHttpSemconv/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientMetricsStableSemconvTest.java +++ b/instrumentation-api-semconv/src/testStableHttpSemconv/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientMetricsStableSemconvTest.java @@ -38,7 +38,6 @@ void collectsMetrics() { Attributes.builder() .put(SemanticAttributes.HTTP_REQUEST_METHOD, "GET") .put(SemanticAttributes.URL_FULL, "https://localhost:1234/") - .put(SemanticAttributes.URL_SCHEME, "https") .put(SemanticAttributes.URL_PATH, "/") .put(SemanticAttributes.URL_QUERY, "q=a") .put(SemanticAttributes.SERVER_ADDRESS, "localhost") @@ -99,7 +98,8 @@ void collectsMetrics() { equalTo( SemanticAttributes.NETWORK_PROTOCOL_VERSION, "2.0"), equalTo(SemanticAttributes.SERVER_ADDRESS, "localhost"), - equalTo(SemanticAttributes.SERVER_PORT, 1234)) + equalTo(SemanticAttributes.SERVER_PORT, 1234), + equalTo(SemanticAttributes.URL_SCHEME, "https")) .hasExemplarsSatisfying( exemplar -> exemplar