From 4979fdc6a3f771ebfc54b6355d65b28f8728434a Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 1 Dec 2023 16:44:28 -0800 Subject: [PATCH] Support stable HTTP semconv --- agent/agent-bootstrap/build.gradle.kts | 1 - .../internal/init/AiConfigCustomizer.java | 2 + .../internal/init/AiContextCustomizer.java | 18 ++++- .../agent/internal/init/SecondEntryPoint.java | 53 ------------- .../internal/sampling/SamplingOverrides.java | 77 +++++-------------- .../sdk/metrics/internal/view/MetricView.java | 16 ++-- .../internal/PreAggregatedMetricsTest.java | 26 +++---- .../TelemetryProcessorMaskingTest.java | 6 +- agent/agent/build.gradle.kts | 1 - dependencyManagement/build.gradle.kts | 1 - .../ConnectionStringOverridesTest.java | 4 +- .../HttpPreaggregatedMetricsTest.java | 4 +- .../InstrumentationKeyOverridesTest.java | 4 +- .../build.gradle.kts | 1 - .../smoketestapp/TestController.java | 4 +- smoke-tests/apps/OtlpMetrics/build.gradle.kts | 1 - .../smoketest/OtlpTest.java | 9 ++- ...sWithRoleNameOverridesAndSamplingTest.java | 4 +- .../smoketest/AksRoleNameOverridesTest.java | 4 +- .../smoketest/RoleNameOverridesTest.java | 4 +- 20 files changed, 79 insertions(+), 161 deletions(-) diff --git a/agent/agent-bootstrap/build.gradle.kts b/agent/agent-bootstrap/build.gradle.kts index e149bc1f6d3..c20c2d1a0af 100644 --- a/agent/agent-bootstrap/build.gradle.kts +++ b/agent/agent-bootstrap/build.gradle.kts @@ -7,6 +7,5 @@ dependencies { // needed to access io.opentelemetry.instrumentation.api.aisdk.MicrometerUtil // TODO (heya) remove this when updating to upstream micrometer instrumentation compileOnly("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api") - compileOnly("io.opentelemetry:opentelemetry-semconv") compileOnly("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-semconv") } diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/AiConfigCustomizer.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/AiConfigCustomizer.java index 4e8f3b1213d..6861c53bd7e 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/AiConfigCustomizer.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/AiConfigCustomizer.java @@ -21,6 +21,8 @@ public Map apply(ConfigProperties otelConfig) { Configuration configuration = FirstEntryPoint.getConfiguration(); Map properties = new HashMap<>(); + properties.put("otel.semconv-stability.opt-in", "http,jvm"); + properties.put( "applicationinsights.internal.micrometer.step.millis", Long.toString(SECONDS.toMillis(configuration.metricIntervalSeconds))); diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/AiContextCustomizer.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/AiContextCustomizer.java index b1249a426ee..5bf6ba32859 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/AiContextCustomizer.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/AiContextCustomizer.java @@ -5,6 +5,7 @@ import com.azure.monitor.opentelemetry.exporter.implementation.AiSemanticAttributes; import com.microsoft.applicationinsights.agent.internal.configuration.Configuration; +import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; @@ -39,9 +40,11 @@ public Context onStart(Context context, R request, Attributes startAttributes) { Context newContext = context; - String target = startAttributes.get(SemanticAttributes.HTTP_TARGET); + String path = + getStableAttribute( + startAttributes, SemanticAttributes.URL_PATH, SemanticAttributes.HTTP_TARGET); - String connectionStringOverride = getConnectionStringOverride(target); + String connectionStringOverride = getConnectionStringOverride(path); if (connectionStringOverride != null) { newContext = newContext.with(AiContextKeys.CONNECTION_STRING, connectionStringOverride); // InheritedConnectionStringSpanProcessor will stamp connection string attribute from the @@ -51,7 +54,7 @@ public Context onStart(Context context, R request, Attributes startAttributes) { span.setAttribute(AiSemanticAttributes.INTERNAL_CONNECTION_STRING, connectionStringOverride); } - String roleNameOverride = getRoleNameOverride(target); + String roleNameOverride = getRoleNameOverride(path); if (roleNameOverride != null) { newContext = newContext.with(AiContextKeys.ROLE_NAME, roleNameOverride); // InheritedRoleNameSpanProcessor will stamp role name attribute from the @@ -89,4 +92,13 @@ private String getRoleNameOverride(String target) { } return null; } + + private static T getStableAttribute( + Attributes attributes, AttributeKey stable, AttributeKey old) { + T value = attributes.get(stable); + if (value != null) { + return value; + } + return attributes.get(old); + } } diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java index 21963db148c..b09d72f1164 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java @@ -39,7 +39,6 @@ import com.microsoft.applicationinsights.agent.internal.processors.ExporterWithLogProcessor; import com.microsoft.applicationinsights.agent.internal.processors.ExporterWithSpanProcessor; import com.microsoft.applicationinsights.agent.internal.processors.LogExporterWithAttributeProcessor; -import com.microsoft.applicationinsights.agent.internal.processors.MySpanData; import com.microsoft.applicationinsights.agent.internal.processors.SpanExporterWithAttributeProcessor; import com.microsoft.applicationinsights.agent.internal.profiler.triggers.AlertTriggerSpanProcessor; import com.microsoft.applicationinsights.agent.internal.sampling.SamplingOverrides; @@ -47,8 +46,6 @@ import com.microsoft.applicationinsights.agent.internal.telemetry.MetricFilter; import com.microsoft.applicationinsights.agent.internal.telemetry.TelemetryClient; import com.microsoft.applicationinsights.agent.internal.telemetry.TelemetryObservers; -import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider; @@ -63,14 +60,11 @@ import io.opentelemetry.sdk.metrics.export.PeriodicMetricReaderBuilder; import io.opentelemetry.sdk.metrics.internal.view.AiViewRegistry; import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder; -import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.export.BatchSpanProcessor; import io.opentelemetry.sdk.trace.export.SpanExporter; -import io.opentelemetry.semconv.SemanticAttributes; import java.io.File; import java.time.Duration; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -595,10 +589,6 @@ private static SpanExporter wrapSpanExporter( "Not an expected ProcessorType: " + processorConfig.type); } } - - // this is temporary until semantic attributes stabilize and we make breaking change - // then can use java.util.functions.Predicate - spanExporter = new BackCompatHttpUrlProcessor(spanExporter); } return spanExporter; @@ -758,47 +748,4 @@ private static SdkMeterProviderBuilder configureMetrics( } return builder.registerMetricReader(metricReader); } - - private static class BackCompatHttpUrlProcessor implements SpanExporter { - - private final SpanExporter delegate; - - private BackCompatHttpUrlProcessor(SpanExporter delegate) { - this.delegate = delegate; - } - - @Override - public CompletableResultCode export(Collection spans) { - List copy = new ArrayList<>(); - for (SpanData span : spans) { - copy.add(addBackCompatHttpUrl(span)); - } - return delegate.export(copy); - } - - private static SpanData addBackCompatHttpUrl(SpanData span) { - Attributes attributes = span.getAttributes(); - if (attributes.get(SemanticAttributes.HTTP_URL) != null) { - // already has http.url - return span; - } - String httpUrl = SpanDataMapper.getHttpUrlFromServerSpan(attributes); - if (httpUrl == null) { - return span; - } - AttributesBuilder builder = attributes.toBuilder(); - builder.put(SemanticAttributes.HTTP_URL, httpUrl); - return new MySpanData(span, builder.build()); - } - - @Override - public CompletableResultCode flush() { - return delegate.flush(); - } - - @Override - public CompletableResultCode shutdown() { - return delegate.shutdown(); - } - } } diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/sampling/SamplingOverrides.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/sampling/SamplingOverrides.java index 552480aca4b..ffd916b4f30 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/sampling/SamplingOverrides.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/sampling/SamplingOverrides.java @@ -3,7 +3,6 @@ package com.microsoft.applicationinsights.agent.internal.sampling; -import com.azure.monitor.opentelemetry.exporter.implementation.SpanDataMapper; import com.microsoft.applicationinsights.agent.internal.configuration.Configuration.MatchType; import com.microsoft.applicationinsights.agent.internal.configuration.Configuration.SamplingOverride; import com.microsoft.applicationinsights.agent.internal.configuration.Configuration.SamplingOverrideAttribute; @@ -13,6 +12,7 @@ import io.opentelemetry.semconv.SemanticAttributes; import java.util.ArrayList; import java.util.List; +import java.util.function.Predicate; import java.util.regex.Pattern; import javax.annotation.Nullable; import org.slf4j.Logger; @@ -33,9 +33,8 @@ public SamplingOverrides(List overrides) { @Nullable public Sampler getOverride(Attributes attributes) { - LazyHttpUrl lazyHttpUrl = new LazyHttpUrl(attributes); for (MatcherGroup matcherGroups : matcherGroups) { - if (matcherGroups.matches(attributes, lazyHttpUrl)) { + if (matcherGroups.matches(attributes)) { return matcherGroups.getSampler(); } } @@ -46,7 +45,7 @@ public Sampler getOverride(Attributes attributes) { @Nullable public Double getOverridePercentage(Attributes attributes) { for (MatcherGroup matcherGroups : matcherGroups) { - if (matcherGroups.matches(attributes, null)) { + if (matcherGroups.matches(attributes)) { return matcherGroups.getPercentage(); } } @@ -54,7 +53,7 @@ public Double getOverridePercentage(Attributes attributes) { } private static class MatcherGroup { - private final List predicates; + private final List> predicates; private final Sampler sampler; // for now only support fixed percentage, but could extend sampling overrides to support // rate-limited sampling @@ -63,7 +62,7 @@ private static class MatcherGroup { private MatcherGroup(SamplingOverride override) { predicates = new ArrayList<>(); for (SamplingOverrideAttribute attribute : override.attributes) { - TempPredicate predicate = toPredicate(attribute); + Predicate predicate = toPredicate(attribute); if (predicate != null) { predicates.add(predicate); } @@ -80,9 +79,9 @@ Sampler getSampler() { return samplingPercentage.get(); } - private boolean matches(Attributes attributes, @Nullable LazyHttpUrl lazyHttpUrl) { - for (TempPredicate predicate : predicates) { - if (!predicate.test(attributes, lazyHttpUrl)) { + private boolean matches(Attributes attributes) { + for (Predicate predicate : predicates) { + if (!predicate.test(attributes)) { return false; } } @@ -99,7 +98,7 @@ static String getValueIncludingThreadName( } @Nullable - private static TempPredicate toPredicate(SamplingOverrideAttribute attribute) { + private static Predicate toPredicate(SamplingOverrideAttribute attribute) { if (attribute.matchType == MatchType.STRICT) { if (isHttpHeaderAttribute(attribute)) { return new StrictArrayContainsMatcher(attribute.key, attribute.value); @@ -126,7 +125,7 @@ private static boolean isHttpHeaderAttribute(SamplingOverrideAttribute attribute } } - private static class StrictMatcher implements TempPredicate { + private static class StrictMatcher implements Predicate { private final AttributeKey key; private final String value; @@ -136,16 +135,13 @@ private StrictMatcher(String key, String value) { } @Override - public boolean test(Attributes attributes, LazyHttpUrl lazyHttpUrl) { + public boolean test(Attributes attributes) { String val = MatcherGroup.getValueIncludingThreadName(attributes, key); - if (val == null && key.getKey().equals(SemanticAttributes.HTTP_URL.getKey())) { - val = lazyHttpUrl.get(); - } return value.equals(val); } } - private static class StrictArrayContainsMatcher implements TempPredicate { + private static class StrictArrayContainsMatcher implements Predicate { private final AttributeKey> key; private final String value; @@ -155,13 +151,13 @@ private StrictArrayContainsMatcher(String key, String value) { } @Override - public boolean test(Attributes attributes, LazyHttpUrl lazyHttpUrl) { + public boolean test(Attributes attributes) { List val = attributes.get(key); return val != null && val.contains(value); } } - private static class RegexpMatcher implements TempPredicate { + private static class RegexpMatcher implements Predicate { private final AttributeKey key; private final Pattern value; @@ -171,18 +167,13 @@ private RegexpMatcher(String key, String value) { } @Override - public boolean test(Attributes attributes, @Nullable LazyHttpUrl lazyHttpUrl) { + public boolean test(Attributes attributes) { String val = MatcherGroup.getValueIncludingThreadName(attributes, key); - if (val == null - && key.getKey().equals(SemanticAttributes.HTTP_URL.getKey()) - && lazyHttpUrl != null) { - val = lazyHttpUrl.get(); - } return val != null && value.matcher(val).matches(); } } - private static class RegexpArrayContainsMatcher implements TempPredicate { + private static class RegexpArrayContainsMatcher implements Predicate { private final AttributeKey> key; private final Pattern value; @@ -192,7 +183,7 @@ private RegexpArrayContainsMatcher(String key, String value) { } @Override - public boolean test(Attributes attributes, @Nullable LazyHttpUrl lazyHttpUrl) { + public boolean test(Attributes attributes) { List val = attributes.get(key); if (val == null) { return false; @@ -206,7 +197,7 @@ public boolean test(Attributes attributes, @Nullable LazyHttpUrl lazyHttpUrl) { } } - private static class KeyOnlyMatcher implements TempPredicate { + private static class KeyOnlyMatcher implements Predicate { private final AttributeKey key; private KeyOnlyMatcher(String key) { @@ -214,39 +205,9 @@ private KeyOnlyMatcher(String key) { } @Override - public boolean test(Attributes attributes, @Nullable LazyHttpUrl lazyHttpUrl) { + public boolean test(Attributes attributes) { String val = MatcherGroup.getValueIncludingThreadName(attributes, key); - if (val == null - && key.getKey().equals(SemanticAttributes.HTTP_URL.getKey()) - && lazyHttpUrl != null) { - val = lazyHttpUrl.get(); - } return val != null; } } - - // this is temporary until semantic attributes stabilize and we make breaking change - private static class LazyHttpUrl { - private final Attributes attributes; - private boolean initialized; - @Nullable private String value; - - private LazyHttpUrl(Attributes attributes) { - this.attributes = attributes; - } - - private String get() { - if (!initialized) { - value = SpanDataMapper.getHttpUrlFromServerSpan(attributes); - initialized = true; - } - return value; - } - } - - // this is temporary until semantic attributes stabilize and we make breaking change - // then can use java.util.functions.Predicate - private interface TempPredicate { - boolean test(Attributes attributes, @Nullable LazyHttpUrl lazyHttpUrl); - } } diff --git a/agent/agent-tooling/src/main/java/io/opentelemetry/sdk/metrics/internal/view/MetricView.java b/agent/agent-tooling/src/main/java/io/opentelemetry/sdk/metrics/internal/view/MetricView.java index 8deeb2b2e68..0fa353ebd0d 100644 --- a/agent/agent-tooling/src/main/java/io/opentelemetry/sdk/metrics/internal/view/MetricView.java +++ b/agent/agent-tooling/src/main/java/io/opentelemetry/sdk/metrics/internal/view/MetricView.java @@ -9,8 +9,8 @@ import java.util.Set; enum MetricView { - HTTP_CLIENT_VIEW("http.client.duration", httpClientDurationAttributeKeys(), false), - HTTP_SERVER_VIEW("http.server.duration", httpServerDurationAttributeKeys(), true), + HTTP_CLIENT_VIEW("http.client.request.duration", httpClientDurationAttributeKeys(), false), + HTTP_SERVER_VIEW("http.server.request.duration", httpServerDurationAttributeKeys(), true), RPC_CLIENT_VIEW("rpc.client.duration", rpcClientDurationAttributeKeys(), false), RPC_SERVER_VIEW("rpc.server.duration", rpcServerDurationAttributeKeys(), false); @@ -41,23 +41,23 @@ boolean isCaptureSynthetic() { private static Set> httpClientDurationAttributeKeys() { Set> view = new HashSet<>(3); - view.add(SemanticAttributes.HTTP_STATUS_CODE); - view.add(SemanticAttributes.NET_PEER_NAME); - view.add(SemanticAttributes.NET_PEER_PORT); + view.add(SemanticAttributes.HTTP_RESPONSE_STATUS_CODE); + view.add(SemanticAttributes.SERVER_ADDRESS); + view.add(SemanticAttributes.SERVER_PORT); return view; } private static Set> httpServerDurationAttributeKeys() { Set> view = new HashSet<>(1); - view.add(SemanticAttributes.HTTP_STATUS_CODE); + view.add(SemanticAttributes.HTTP_RESPONSE_STATUS_CODE); return view; } private static Set> rpcClientDurationAttributeKeys() { Set> view = new HashSet<>(3); view.add(SemanticAttributes.RPC_SYSTEM); - view.add(SemanticAttributes.NET_PEER_NAME); - view.add(SemanticAttributes.NET_PEER_PORT); + view.add(SemanticAttributes.SERVER_ADDRESS); + view.add(SemanticAttributes.SERVER_PORT); return view; } diff --git a/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/PreAggregatedMetricsTest.java b/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/PreAggregatedMetricsTest.java index 3b8952f3198..724232cb696 100644 --- a/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/PreAggregatedMetricsTest.java +++ b/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/PreAggregatedMetricsTest.java @@ -114,7 +114,7 @@ void generateHttpClientMetrics() { .satisfiesExactly( metric -> assertThat(metric) - .hasName("http.client.duration") + .hasName("http.client.request.duration") .hasUnit("ms") .hasHistogramSatisfying( histogram -> @@ -123,9 +123,10 @@ void generateHttpClientMetrics() { point .hasSum(150 /* millis */) .hasAttributesSatisfying( - equalTo(SemanticAttributes.NET_PEER_NAME, "localhost"), - equalTo(SemanticAttributes.NET_PEER_PORT, 1234), - equalTo(SemanticAttributes.HTTP_STATUS_CODE, 200)) + equalTo(SemanticAttributes.SERVER_ADDRESS, "localhost"), + equalTo(SemanticAttributes.SERVER_PORT, 1234), + equalTo( + SemanticAttributes.HTTP_RESPONSE_STATUS_CODE, 200)) .hasExemplarsSatisfying( exemplar -> exemplar @@ -158,10 +159,8 @@ void generateRpcClientMetrics() { Attributes responseAttributes1 = Attributes.builder() - .put(SemanticAttributes.NET_PEER_NAME, "example.com") - .put(SemanticAttributes.NET_PEER_IP, "127.0.0.1") - .put(SemanticAttributes.NET_PEER_PORT, 8080) - .put(SemanticAttributes.NET_TRANSPORT, "ip_tcp") + .put(SemanticAttributes.SERVER_ADDRESS, "example.com") + .put(SemanticAttributes.SERVER_PORT, 8080) .build(); Context parent = @@ -202,8 +201,8 @@ void generateRpcClientMetrics() { .hasAttributesSatisfying( equalTo(SemanticAttributes.RPC_SYSTEM, "grpc"), equalTo( - SemanticAttributes.NET_PEER_NAME, "example.com"), - equalTo(SemanticAttributes.NET_PEER_PORT, 8080)) + SemanticAttributes.SERVER_ADDRESS, "example.com"), + equalTo(SemanticAttributes.SERVER_PORT, 8080)) .hasExemplarsSatisfying( exemplar -> exemplar @@ -259,7 +258,7 @@ void generateHttpServerMetrics() { Collection metricDataCollection = metricReader.collectAllMetrics(); MetricData target = null; for (MetricData metricData : metricDataCollection) { - if ("http.server.duration".equals(metricData.getName())) { + if ("http.server.request.duration".equals(metricData.getName())) { target = metricData; System.out.println("metric: " + metricData); } @@ -269,7 +268,7 @@ void generateHttpServerMetrics() { .satisfies( metric -> assertThat(metric) - .hasName("http.server.duration") + .hasName("http.server.request.duration") .hasUnit("ms") .hasHistogramSatisfying( histogram -> @@ -278,7 +277,8 @@ void generateHttpServerMetrics() { point .hasSum(150 /* millis */) .hasAttributesSatisfying( - equalTo(SemanticAttributes.HTTP_STATUS_CODE, 200), + equalTo( + SemanticAttributes.HTTP_RESPONSE_STATUS_CODE, 200), equalTo( AttributeKey.booleanKey( "applicationinsights.internal.is_synthetic"), diff --git a/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/processors/TelemetryProcessorMaskingTest.java b/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/processors/TelemetryProcessorMaskingTest.java index 79d1fae84e3..23bbe5b217d 100644 --- a/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/processors/TelemetryProcessorMaskingTest.java +++ b/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/processors/TelemetryProcessorMaskingTest.java @@ -6,7 +6,6 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS; import static org.assertj.core.api.Assertions.assertThat; -import com.azure.monitor.opentelemetry.exporter.implementation.SemanticAttributes; import com.microsoft.applicationinsights.agent.internal.configuration.Configuration; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanContext; @@ -22,6 +21,7 @@ import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.data.StatusData; +import io.opentelemetry.semconv.SemanticAttributes; import java.time.Instant; import java.util.ArrayList; import java.util.Collections; @@ -46,7 +46,7 @@ void shouldMaskAttribute() { .processActions(new RequestSpanData(httpUrl)); Attributes newAttributes = newSpanData.getAttributes(); - String newHttpUrlAttributeValue = newAttributes.get(SemanticAttributes.HTTP_URL); + String newHttpUrlAttributeValue = newAttributes.get(SemanticAttributes.URL_FULL); assertThat(newHttpUrlAttributeValue) .isEqualTo("http://localhost:8080/TelemetryProcessors/user/" + mask); } @@ -72,7 +72,7 @@ void shouldMaskAttributeWithGroupName() { .processActions(new RequestSpanData(httpUrl)); Attributes newAttributes = newSpanData.getAttributes(); - String newHttpUrlAttributeValue = newAttributes.get(SemanticAttributes.HTTP_URL); + String newHttpUrlAttributeValue = newAttributes.get(SemanticAttributes.URL_FULL); assertThat(newHttpUrlAttributeValue).isEqualTo("https://user/" + mask); } diff --git a/agent/agent/build.gradle.kts b/agent/agent/build.gradle.kts index 7e580892f44..765c0bc90a1 100644 --- a/agent/agent/build.gradle.kts +++ b/agent/agent/build.gradle.kts @@ -84,7 +84,6 @@ tasks { exclude(dependency("io.opentelemetry:opentelemetry-api")) exclude(dependency("io.opentelemetry:opentelemetry-api-metrics")) exclude(dependency("io.opentelemetry:opentelemetry-context")) - exclude(dependency("io.opentelemetry:opentelemetry-semconv")) } } diff --git a/dependencyManagement/build.gradle.kts b/dependencyManagement/build.gradle.kts index e6504bcb5c1..603230e4f7c 100644 --- a/dependencyManagement/build.gradle.kts +++ b/dependencyManagement/build.gradle.kts @@ -43,7 +43,6 @@ val mockitoVersion = "4.11.0" val slf4jVersion = "2.0.10" val CORE_DEPENDENCIES = listOf( - "io.opentelemetry:opentelemetry-semconv:1.30.1-alpha", "com.google.auto.service:auto-service:${autoServiceVersion}", "com.google.auto.service:auto-service-annotations:${autoServiceVersion}", "com.google.auto.value:auto-value:${autoValueVersion}", diff --git a/smoke-tests/apps/ConnectionStringOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/ConnectionStringOverridesTest.java b/smoke-tests/apps/ConnectionStringOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/ConnectionStringOverridesTest.java index 5b673c7a48d..12e9f8c5ca1 100644 --- a/smoke-tests/apps/ConnectionStringOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/ConnectionStringOverridesTest.java +++ b/smoke-tests/apps/ConnectionStringOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/ConnectionStringOverridesTest.java @@ -99,9 +99,9 @@ private static void testApp(String iKey) throws Exception { // and metrics too List clientMetrics = - testing.mockedIngestion.waitForMetricItems("http.client.duration", 1); + testing.mockedIngestion.waitForMetricItems("http.client.request.duration", 1); List serverMetrics = - testing.mockedIngestion.waitForMetricItems("http.server.duration", 1); + testing.mockedIngestion.waitForMetricItems("http.server.request.duration", 1); verifyHttpClientPreAggregatedMetrics(clientMetrics, iKey); verifyHttpServerPreAggregatedMetrics(serverMetrics, iKey); diff --git a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTest.java b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTest.java index 0cbf515fe4b..c4485e6d3a5 100644 --- a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTest.java +++ b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTest.java @@ -46,9 +46,9 @@ private void testHttpUrlConnectionAndSynthetic(boolean synthetic) throws Excepti verifyHttpclientRequestsAndDependencies("https://mock.codes/200?q=spaces%20test"); List clientMetrics = - testing.mockedIngestion.waitForMetricItems("http.client.duration", 3); + testing.mockedIngestion.waitForMetricItems("http.client.request.duration", 3); List serverMetrics = - testing.mockedIngestion.waitForMetricItems("http.server.duration", 1); + testing.mockedIngestion.waitForMetricItems("http.server.request.duration", 1); verifyHttpClientPreAggregatedMetrics(clientMetrics); verifyHttpServerPreAggregatedMetrics(serverMetrics, synthetic); diff --git a/smoke-tests/apps/InstrumentationKeyOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/InstrumentationKeyOverridesTest.java b/smoke-tests/apps/InstrumentationKeyOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/InstrumentationKeyOverridesTest.java index e66d95b9e6c..3a61ed8a47c 100644 --- a/smoke-tests/apps/InstrumentationKeyOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/InstrumentationKeyOverridesTest.java +++ b/smoke-tests/apps/InstrumentationKeyOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/InstrumentationKeyOverridesTest.java @@ -88,9 +88,9 @@ private static void testApp(String iKey) throws Exception { // and metrics too List clientMetrics = - testing.mockedIngestion.waitForMetricItems("http.client.duration", 1); + testing.mockedIngestion.waitForMetricItems("http.client.request.duration", 1); List serverMetrics = - testing.mockedIngestion.waitForMetricItems("http.server.duration", 1); + testing.mockedIngestion.waitForMetricItems("http.server.request.duration", 1); verifyHttpClientPreAggregatedMetrics(clientMetrics, iKey); verifyHttpServerPreAggregatedMetrics(serverMetrics, iKey); diff --git a/smoke-tests/apps/OpenTelemetryApiLogBridge/build.gradle.kts b/smoke-tests/apps/OpenTelemetryApiLogBridge/build.gradle.kts index 9c33dedf7e4..9f7bfadffa4 100644 --- a/smoke-tests/apps/OpenTelemetryApiLogBridge/build.gradle.kts +++ b/smoke-tests/apps/OpenTelemetryApiLogBridge/build.gradle.kts @@ -7,5 +7,4 @@ dependencies { exclude("org.springframework.boot", "spring-boot-starter-tomcat") } implementation("io.opentelemetry:opentelemetry-api:1.27.0") - implementation("io.opentelemetry:opentelemetry-semconv:1.27.0-alpha") } diff --git a/smoke-tests/apps/OpenTelemetryMetric/src/main/java/com/microsoft/applicationinsights/smoketestapp/TestController.java b/smoke-tests/apps/OpenTelemetryMetric/src/main/java/com/microsoft/applicationinsights/smoketestapp/TestController.java index f5d6ee3e8a4..79d5c90455f 100644 --- a/smoke-tests/apps/OpenTelemetryMetric/src/main/java/com/microsoft/applicationinsights/smoketestapp/TestController.java +++ b/smoke-tests/apps/OpenTelemetryMetric/src/main/java/com/microsoft/applicationinsights/smoketestapp/TestController.java @@ -35,7 +35,7 @@ public class TestController { GlobalOpenTelemetry.get() .getMeter("trackDoubleHistogramMetric") .histogramBuilder("trackDoubleHistogramMetric") - .setDescription("http.client.duration") + .setDescription("http.client.request.duration") .setUnit("ms") .build(); @@ -44,7 +44,7 @@ public class TestController { .getMeter("trackLongHistogramMetric") .histogramBuilder("trackLongHistogramMetric") .ofLongs() - .setDescription("http.client.duration") + .setDescription("http.client.request.duration") .setUnit("ms") .build(); diff --git a/smoke-tests/apps/OtlpMetrics/build.gradle.kts b/smoke-tests/apps/OtlpMetrics/build.gradle.kts index f3b66182df4..93a84da349a 100644 --- a/smoke-tests/apps/OtlpMetrics/build.gradle.kts +++ b/smoke-tests/apps/OtlpMetrics/build.gradle.kts @@ -7,7 +7,6 @@ dependencies { exclude("spring-boot-starter-tomcat") } implementation("io.opentelemetry:opentelemetry-api:1.30.0") - implementation("io.opentelemetry:opentelemetry-semconv:1.30.0-alpha") implementation("io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations:1.30.0") implementation("org.springframework.boot:spring-boot-test:2.7.16") implementation("io.spring.dependency-management:io.spring.dependency-management.gradle.plugin:1.1.3") diff --git a/smoke-tests/apps/OtlpMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OtlpTest.java b/smoke-tests/apps/OtlpMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OtlpTest.java index 3342036cd7d..c5cfc681650 100644 --- a/smoke-tests/apps/OtlpMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OtlpTest.java +++ b/smoke-tests/apps/OtlpMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OtlpTest.java @@ -53,14 +53,15 @@ public void testOtlpTelemetry() throws Exception { Envelope standardMetricEnvelope = standardMetricsList.get(0); MetricData standardMetricData = (MetricData) ((Data) standardMetricEnvelope.getData()).getBaseData(); - assertThat(standardMetricData.getMetrics().get(0).getName()).isEqualTo("http.server.duration"); + assertThat(standardMetricData.getMetrics().get(0).getName()) + .isEqualTo("http.server.request.duration"); assertThat(standardMetricData.getProperties().get("_MS.IsAutocollected")).isEqualTo("True"); // verify Statsbeat sent to the breeze endpoint verifyStatsbeatSentToBreezeEndpoint(); // verify custom histogram metric 'histogram-test-otlp-exporter' and otel metric - // 'http.server.duration' sent to OTLP endpoint + // 'http.server.request.duration' sent to OTLP endpoint // verify Statsbeat doesn't get sent to OTLP endpoint verifyMetricsSentToOtlpEndpoint(); } @@ -82,7 +83,7 @@ private void verifyMetricsSentToOtlpEndpoint() { testing.mockedOtlpIngestion.extractMetricsFromRequests(requests); assertThat(metrics) .extracting(Metric::getName) - .contains("histogram-test-otlp-exporter", "http.server.duration") + .contains("histogram-test-otlp-exporter", "http.server.request.duration") .doesNotContain("Attach", "Feature"); // statsbeat }); } @@ -98,7 +99,7 @@ private static boolean isHistogramMetric(Envelope envelope) { private static boolean isStandardMetric(Envelope envelope) { if (envelope.getData().getBaseType().equals("MetricData")) { MetricData data = (MetricData) ((Data) envelope.getData()).getBaseData(); - return data.getMetrics().get(0).getName().equals("http.server.duration"); + return data.getMetrics().get(0).getName().equals("http.server.request.duration"); } return false; } diff --git a/smoke-tests/apps/PreAggMetricsWithRoleNameOverridesAndSampling/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/PreAggMetricsWithRoleNameOverridesAndSamplingTest.java b/smoke-tests/apps/PreAggMetricsWithRoleNameOverridesAndSampling/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/PreAggMetricsWithRoleNameOverridesAndSamplingTest.java index d2496b975fe..6615e55bbe9 100644 --- a/smoke-tests/apps/PreAggMetricsWithRoleNameOverridesAndSampling/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/PreAggMetricsWithRoleNameOverridesAndSamplingTest.java +++ b/smoke-tests/apps/PreAggMetricsWithRoleNameOverridesAndSampling/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/PreAggMetricsWithRoleNameOverridesAndSamplingTest.java @@ -67,9 +67,9 @@ private void testApp(String roleName) throws Exception { for (Envelope envelope : metricsEnvelops) { MetricData metricData = (MetricData) ((Data) envelope.getData()).getBaseData(); String name = metricData.getMetrics().get(0).getName(); - if ("http.client.duration".equals(name)) { + if ("http.client.request.duration".equals(name)) { clientMetrics.add(envelope); - } else if ("http.server.duration".equals(name)) { + } else if ("http.server.request.duration".equals(name)) { serverMetrics.add(envelope); } } diff --git a/smoke-tests/apps/RoleNameOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/AksRoleNameOverridesTest.java b/smoke-tests/apps/RoleNameOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/AksRoleNameOverridesTest.java index f787ce0ac2a..d1bdf154ac1 100644 --- a/smoke-tests/apps/RoleNameOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/AksRoleNameOverridesTest.java +++ b/smoke-tests/apps/RoleNameOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/AksRoleNameOverridesTest.java @@ -58,13 +58,13 @@ private static void verifyRoleNameAndInstance(String roleName, String roleInstan assertThat(mdList.get(0).getTags()).containsEntry("ai.cloud.roleInstance", roleInstance); List clientMetrics = - testing.mockedIngestion.waitForMetricItems("http.client.duration", 1); + testing.mockedIngestion.waitForMetricItems("http.client.request.duration", 1); Map clientTags = clientMetrics.get(0).getTags(); assertThat(clientTags.get("ai.cloud.role")).isEqualTo(roleName); assertThat(clientTags.get("ai.cloud.roleInstance")).isEqualTo(roleInstance); List serverMetrics = - testing.mockedIngestion.waitForMetricItems("http.server.duration", 1); + testing.mockedIngestion.waitForMetricItems("http.server.request.duration", 1); Map serverTags = serverMetrics.get(0).getTags(); assertThat(serverTags.get("ai.cloud.role")).isEqualTo(roleName); assertThat(serverTags.get("ai.cloud.roleInstance")).isEqualTo(roleInstance); diff --git a/smoke-tests/apps/RoleNameOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/RoleNameOverridesTest.java b/smoke-tests/apps/RoleNameOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/RoleNameOverridesTest.java index cbd85e8d0ed..c1bc7bb3e10 100644 --- a/smoke-tests/apps/RoleNameOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/RoleNameOverridesTest.java +++ b/smoke-tests/apps/RoleNameOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/RoleNameOverridesTest.java @@ -99,9 +99,9 @@ private static void testApp(String roleName) throws Exception { // and metrics too List clientMetrics = - testing.mockedIngestion.waitForMetricItems("http.client.duration", 1); + testing.mockedIngestion.waitForMetricItems("http.client.request.duration", 1); List serverMetrics = - testing.mockedIngestion.waitForMetricItems("http.server.duration", 1); + testing.mockedIngestion.waitForMetricItems("http.server.request.duration", 1); verifyHttpClientPreAggregatedMetrics(clientMetrics, roleName); verifyHttpServerPreAggregatedMetrics(serverMetrics, roleName);