From 35165a3af0544100dc6c6dba4632b62e7630bcd6 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Thu, 26 Feb 2026 15:14:45 -0800 Subject: [PATCH 01/10] gRPC old/stable semconv support --- .../javaagent/build.gradle.kts | 13 + .../armeria/grpc/v1_14/ArmeriaGrpcTest.java | 38 +- .../grpc-1.6/javaagent/build.gradle.kts | 26 +- .../grpc/v1_6/GrpcAttributesExtractor.java | 11 +- .../grpc/v1_6/GrpcRpcAttributesGetter.java | 5 + .../grpc/v1_6/AbstractGrpcStreamingTest.java | 183 ++++-- .../grpc/v1_6/AbstractGrpcTest.java | 616 +++++++++++++----- .../junit/rpc/SemconvRpcStabilityUtil.java | 40 ++ 8 files changed, 707 insertions(+), 225 deletions(-) create mode 100644 testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/rpc/SemconvRpcStabilityUtil.java diff --git a/instrumentation/armeria/armeria-grpc-1.14/javaagent/build.gradle.kts b/instrumentation/armeria/armeria-grpc-1.14/javaagent/build.gradle.kts index 118a3a579133..5dc9562ea9e6 100644 --- a/instrumentation/armeria/armeria-grpc-1.14/javaagent/build.gradle.kts +++ b/instrumentation/armeria/armeria-grpc-1.14/javaagent/build.gradle.kts @@ -63,6 +63,19 @@ tasks.test { systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") } +tasks { + val testStableSemconv by registering(Test::class) { + testClassesDirs = sourceSets.test.get().output.classesDirs + classpath = sourceSets.test.get().runtimeClasspath + jvmArgs("-Dotel.semconv-stability.opt-in=rpc") + systemProperty("metadataConfig", "otel.semconv-stability.opt-in=rpc") + } + + check { + dependsOn(testStableSemconv) + } +} + if (findProperty("denyUnsafe") as Boolean) { tasks.withType().configureEach { enabled = false diff --git a/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java b/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java index c5c5394370ef..a3da3300b8bc 100644 --- a/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java +++ b/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java @@ -5,6 +5,9 @@ package io.opentelemetry.javaagent.instrumentation.armeria.grpc.v1_14; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitOldRpcSemconv; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableRpcSemconv; +import static io.opentelemetry.instrumentation.testing.junit.rpc.SemconvRpcStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; @@ -12,6 +15,7 @@ import static io.opentelemetry.semconv.incubating.MessageIncubatingAttributes.MESSAGE_TYPE; import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE; import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_RESPONSE_STATUS_CODE; import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; @@ -78,10 +82,19 @@ void grpcInstrumentation() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "SayHello"), - equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() ? "example.Greeter/SayHello" : "SayHello"), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.OK.value()) + : null), equalTo(SERVER_ADDRESS, "127.0.0.1"), equalTo(SERVER_PORT, (long) server.httpPort())) .hasEventsSatisfyingExactly( @@ -101,10 +114,19 @@ void grpcInstrumentation() { .hasKind(SpanKind.SERVER) .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "SayHello"), - equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() ? "example.Greeter/SayHello" : "SayHello"), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.OK.value()) + : null), equalTo(SERVER_ADDRESS, "127.0.0.1"), equalTo(SERVER_PORT, server.httpPort())) .hasEventsSatisfyingExactly( diff --git a/instrumentation/grpc-1.6/javaagent/build.gradle.kts b/instrumentation/grpc-1.6/javaagent/build.gradle.kts index d4eca5080f1d..a2b04a8a2ce9 100644 --- a/instrumentation/grpc-1.6/javaagent/build.gradle.kts +++ b/instrumentation/grpc-1.6/javaagent/build.gradle.kts @@ -31,7 +31,7 @@ dependencies { val collectMetadata = findProperty("collectMetadata")?.toString() ?: "false" tasks { - test { + withType().configureEach { systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) // The agent context debug mechanism isn't compatible with the bridge approach which may add a // gRPC context to the root. @@ -56,26 +56,32 @@ tasks { testClassesDirs = sourceSets.test.get().output.classesDirs classpath = sourceSets.test.get().runtimeClasspath - // replicated base config from standard test task - systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) - jvmArgs("-Dotel.javaagent.experimental.thread-propagation-debugger.enabled=false") - jvmArgs("-Dotel.instrumentation.grpc.capture-metadata.client.request=some-client-key") - jvmArgs("-Dotel.instrumentation.grpc.capture-metadata.server.request=some-server-key") - jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true") - // exclude our grpc library instrumentation, the ContextStorageOverride contained within it // breaks the tests classpath = classpath.filter { !it.absolutePath.contains("opentelemetry-grpc-1.6") } - systemProperty("collectMetadata", collectMetadata) systemProperty("metadataConfig", "otel.instrumentation.grpc.experimental-span-attributes=true") jvmArgs("-Dotel.instrumentation.grpc.experimental-span-attributes=true") } + val testStableSemconv by registering(Test::class) { + testClassesDirs = sourceSets.test.get().output.classesDirs + classpath = sourceSets.test.get().runtimeClasspath + + // exclude our grpc library instrumentation, the ContextStorageOverride contained within it + // breaks the tests + classpath = classpath.filter { + !it.absolutePath.contains("opentelemetry-grpc-1.6") + } + + jvmArgs("-Dotel.semconv-stability.opt-in=rpc") + systemProperty("metadataConfig", "otel.semconv-stability.opt-in=rpc") + } + check { - dependsOn(testExperimental) + dependsOn(testExperimental, testStableSemconv) } } diff --git a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAttributesExtractor.java b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAttributesExtractor.java index 1e4f6ee406ea..53de8a6e144e 100644 --- a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAttributesExtractor.java +++ b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAttributesExtractor.java @@ -5,6 +5,8 @@ package io.opentelemetry.instrumentation.grpc.v1_6; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitOldRpcSemconv; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableRpcSemconv; import static io.opentelemetry.instrumentation.grpc.v1_6.CapturedGrpcMetadataUtil.lowercase; import static io.opentelemetry.instrumentation.grpc.v1_6.CapturedGrpcMetadataUtil.requestAttributeKey; @@ -21,6 +23,8 @@ final class GrpcAttributesExtractor implements AttributesExtractor RPC_GRPC_STATUS_CODE = AttributeKey.longKey("rpc.grpc.status_code"); + private static final AttributeKey RPC_RESPONSE_STATUS_CODE = + AttributeKey.stringKey("rpc.response.status_code"); private final GrpcRpcAttributesGetter getter; private final List capturedRequestMetadata; @@ -44,7 +48,12 @@ public void onEnd( @Nullable Status status, @Nullable Throwable error) { if (status != null) { - attributes.put(RPC_GRPC_STATUS_CODE, status.getCode().value()); + if (emitOldRpcSemconv()) { + attributes.put(RPC_GRPC_STATUS_CODE, status.getCode().value()); + } + if (emitStableRpcSemconv()) { + attributes.put(RPC_RESPONSE_STATUS_CODE, String.valueOf(status.getCode().value())); + } } for (String key : capturedRequestMetadata) { List value = getter.metadataValue(request, key); diff --git a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcRpcAttributesGetter.java b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcRpcAttributesGetter.java index 250aac6773d9..99f5d4fba3e1 100644 --- a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcRpcAttributesGetter.java +++ b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcRpcAttributesGetter.java @@ -46,6 +46,11 @@ public String getMethod(GrpcRequest request) { return fullMethodName.substring(slashIndex + 1); } + @Override + public String getRpcMethod(GrpcRequest request) { + return request.getMethod().getFullMethodName(); + } + @Override @Nullable public Long getRequestSize(GrpcRequest request) { diff --git a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java index 972f8353800b..60fc550c5aa9 100644 --- a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java +++ b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java @@ -5,10 +5,13 @@ package io.opentelemetry.instrumentation.grpc.v1_6; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitOldRpcSemconv; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableRpcSemconv; import static io.opentelemetry.instrumentation.grpc.v1_6.AbstractGrpcTest.addExtraClientAttributes; import static io.opentelemetry.instrumentation.grpc.v1_6.ExperimentalTestHelper.GRPC_RECEIVED_MESSAGE_COUNT; import static io.opentelemetry.instrumentation.grpc.v1_6.ExperimentalTestHelper.GRPC_SENT_MESSAGE_COUNT; import static io.opentelemetry.instrumentation.grpc.v1_6.ExperimentalTestHelper.experimentalSatisfies; +import static io.opentelemetry.instrumentation.testing.junit.rpc.SemconvRpcStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; @@ -21,8 +24,10 @@ import static io.opentelemetry.semconv.incubating.MessageIncubatingAttributes.MESSAGE_TYPE; import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE; import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_RESPONSE_STATUS_CODE; import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM_NAME; import static java.util.concurrent.TimeUnit.SECONDS; import static java.util.stream.Collectors.toList; @@ -243,10 +248,23 @@ public void onCompleted() { experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "Conversation"), - equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, + emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "example.Greeter/Conversation" + : "Conversation"), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.OK.value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) .satisfies( @@ -263,10 +281,22 @@ public void onCompleted() { v -> assertThat(v).isGreaterThan(0)), experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "Conversation"), - equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "example.Greeter/Conversation" + : "Conversation"), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.OK.value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), @@ -285,49 +315,100 @@ public void onCompleted() { span.hasName("clientOnNext") .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)))); - testing() - .waitAndAssertMetrics( - "io.opentelemetry.grpc-1.6", - "rpc.server.duration", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasUnit("ms") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( - point -> - point.hasAttributesSatisfying( - equalTo(SERVER_ADDRESS, "localhost"), - equalTo(RPC_METHOD, "Conversation"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_SYSTEM, "grpc"), - equalTo( - RPC_GRPC_STATUS_CODE, - (long) Status.Code.OK.value())))))); - testing() - .waitAndAssertMetrics( - "io.opentelemetry.grpc-1.6", - "rpc.client.duration", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasUnit("ms") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( - point -> - point.hasAttributesSatisfying( - equalTo(SERVER_ADDRESS, "localhost"), - equalTo(SERVER_PORT, server.getPort()), - equalTo(RPC_METHOD, "Conversation"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_SYSTEM, "grpc"), - equalTo( - RPC_GRPC_STATUS_CODE, - (long) Status.Code.OK.value())))))); + if (emitOldRpcSemconv()) { + testing() + .waitAndAssertMetrics( + "io.opentelemetry.grpc-1.6", + "rpc.server.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("ms") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfying( + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(RPC_METHOD, "Conversation"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_SYSTEM, "grpc"), + equalTo( + RPC_GRPC_STATUS_CODE, + (long) Status.Code.OK.value())))))); + } + if (emitStableRpcSemconv()) { + testing() + .waitAndAssertMetrics( + "io.opentelemetry.grpc-1.6", + "rpc.server.call.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("s") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfying( + equalTo(RPC_SYSTEM_NAME, "grpc"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo( + RPC_METHOD, "example.Greeter/Conversation"), + equalTo( + RPC_RESPONSE_STATUS_CODE, + String.valueOf(Status.Code.OK.value()))))))); + } + if (emitOldRpcSemconv()) { + testing() + .waitAndAssertMetrics( + "io.opentelemetry.grpc-1.6", + "rpc.client.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("ms") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfying( + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(RPC_METHOD, "Conversation"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_SYSTEM, "grpc"), + equalTo( + RPC_GRPC_STATUS_CODE, + (long) Status.Code.OK.value())))))); + } + if (emitStableRpcSemconv()) { + testing() + .waitAndAssertMetrics( + "io.opentelemetry.grpc-1.6", + "rpc.client.call.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("s") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfying( + equalTo(RPC_SYSTEM_NAME, "grpc"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo( + RPC_METHOD, "example.Greeter/Conversation"), + equalTo( + RPC_RESPONSE_STATUS_CODE, + String.valueOf(Status.Code.OK.value()))))))); + } } @Test diff --git a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java index 32aec3bc7bca..011332691f01 100644 --- a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java +++ b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java @@ -5,12 +5,16 @@ package io.opentelemetry.instrumentation.grpc.v1_6; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitOldRpcSemconv; +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableRpcSemconv; import static io.opentelemetry.instrumentation.grpc.v1_6.ExperimentalTestHelper.GRPC_RECEIVED_MESSAGE_COUNT; import static io.opentelemetry.instrumentation.grpc.v1_6.ExperimentalTestHelper.GRPC_SENT_MESSAGE_COUNT; import static io.opentelemetry.instrumentation.grpc.v1_6.ExperimentalTestHelper.experimentalSatisfies; +import static io.opentelemetry.instrumentation.testing.junit.rpc.SemconvRpcStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; @@ -20,8 +24,10 @@ import static io.opentelemetry.semconv.incubating.MessageIncubatingAttributes.MESSAGE_TYPE; import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE; import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_RESPONSE_STATUS_CODE; import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM_NAME; import static java.util.Collections.singletonList; import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -151,10 +157,23 @@ public void sayHello( experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "SayHello"), - equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, + emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "example.Greeter/SayHello" + : "SayHello"), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.OK.value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( @@ -179,10 +198,22 @@ public void sayHello( v -> assertThat(v).isGreaterThan(0)), experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "SayHello"), - equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "example.Greeter/SayHello" + : "SayHello"), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.OK.value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), @@ -269,10 +300,23 @@ public void sayHello( experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "SayHello"), - equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, + emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "example.Greeter/SayHello" + : "SayHello"), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.OK.value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( @@ -297,10 +341,22 @@ public void sayHello( v -> assertThat(v).isGreaterThan(0)), experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "SayHello"), - equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "example.Greeter/SayHello" + : "SayHello"), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.OK.value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), @@ -399,10 +455,23 @@ public void onCompleted() { experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "SayHello"), - equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, + emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "example.Greeter/SayHello" + : "SayHello"), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.OK.value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( @@ -427,10 +496,22 @@ public void onCompleted() { v -> assertThat(v).isGreaterThan(0)), experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "SayHello"), - equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "example.Greeter/SayHello" + : "SayHello"), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.OK.value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), @@ -502,10 +583,25 @@ public void sayHello( experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "SayHello"), - equalTo(RPC_GRPC_STATUS_CODE, (long) status.getCode().value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, + emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "example.Greeter/SayHello" + : "SayHello"), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() + ? (long) status.getCode().value() + : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(status.getCode().value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( @@ -526,10 +622,27 @@ public void sayHello( v -> assertThat(v).isGreaterThan(0)), experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isEqualTo(0)), - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "SayHello"), - equalTo(RPC_GRPC_STATUS_CODE, (long) status.getCode().value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "example.Greeter/SayHello" + : "SayHello"), + equalTo( + ERROR_TYPE, + emitStableRpcSemconv() && status.getCause() != null + ? status.getCause().getClass().getName() + : null), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() ? (long) status.getCode().value() : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(status.getCode().value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), @@ -606,12 +719,25 @@ public void sayHello( experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "SayHello"), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, + emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "example.Greeter/SayHello" + : "SayHello"), equalTo( RPC_GRPC_STATUS_CODE, - (long) Status.UNKNOWN.getCode().value()), + emitOldRpcSemconv() + ? (long) Status.UNKNOWN.getCode().value() + : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.UNKNOWN.getCode().value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( @@ -627,10 +753,29 @@ public void sayHello( .hasParent(trace.getSpan(0)) .hasStatus(StatusData.error()) .hasAttributesSatisfyingExactly( - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "SayHello"), - equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.UNKNOWN.value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "example.Greeter/SayHello" + : "SayHello"), + equalTo( + ERROR_TYPE, + emitStableRpcSemconv() + ? StatusRuntimeException.class.getName() + : null), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() + ? (long) Status.Code.UNKNOWN.value() + : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.UNKNOWN.value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), @@ -803,10 +948,23 @@ public void onCompleted() { experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "SayHello"), - equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, + emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "example.Greeter/SayHello" + : "SayHello"), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.OK.value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( @@ -831,10 +989,22 @@ public void onCompleted() { v -> assertThat(v).isGreaterThan(0)), experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "SayHello"), - equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "example.Greeter/SayHello" + : "SayHello"), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.OK.value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), @@ -927,11 +1097,30 @@ public void onCompleted() { experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "SayMultipleHello"), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, + emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "example.Greeter/SayMultipleHello" + : "SayMultipleHello"), equalTo( - RPC_GRPC_STATUS_CODE, (long) Status.Code.CANCELLED.value()), + ERROR_TYPE, + emitStableRpcSemconv() + ? thrown.getClass().getName() + : null), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() + ? (long) Status.Code.CANCELLED.value() + : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.CANCELLED.value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfying( @@ -958,10 +1147,24 @@ public void onCompleted() { v -> assertThat(v).isGreaterThan(0)), experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "SayMultipleHello"), - equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.CANCELLED.value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "example.Greeter/SayMultipleHello" + : "SayMultipleHello"), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() + ? (long) Status.Code.CANCELLED.value() + : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.CANCELLED.value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), @@ -1049,11 +1252,25 @@ public void onCompleted() { experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(RPC_SYSTEM, "grpc"), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), equalTo( - RPC_SERVICE, "grpc.reflection.v1alpha.ServerReflection"), - equalTo(RPC_METHOD, "ServerReflectionInfo"), - equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + RPC_SERVICE, + emitOldRpcSemconv() + ? "grpc.reflection.v1alpha.ServerReflection" + : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "grpc.reflection.v1alpha.ServerReflection/ServerReflectionInfo" + : "ServerReflectionInfo"), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.OK.value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( @@ -1079,10 +1296,25 @@ public void onCompleted() { v -> assertThat(v).isGreaterThan(0)), experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "grpc.reflection.v1alpha.ServerReflection"), - equalTo(RPC_METHOD, "ServerReflectionInfo"), - equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, + emitOldRpcSemconv() + ? "grpc.reflection.v1alpha.ServerReflection" + : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "grpc.reflection.v1alpha.ServerReflection/ServerReflectionInfo" + : "ServerReflectionInfo"), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.OK.value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), @@ -1153,10 +1385,23 @@ public void sayHello( experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "SayHello"), - equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, + emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "example.Greeter/SayHello" + : "SayHello"), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.OK.value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( @@ -1181,10 +1426,22 @@ public void sayHello( v -> assertThat(v).isGreaterThan(0)), experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(RPC_SYSTEM, "grpc"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_METHOD, "SayHello"), - equalTo(RPC_GRPC_STATUS_CODE, (long) Status.Code.OK.value()), + equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo( + RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), + equalTo( + RPC_METHOD, + emitStableRpcSemconv() + ? "example.Greeter/SayHello" + : "SayHello"), + equalTo( + RPC_GRPC_STATUS_CODE, + emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), + equalTo( + RPC_RESPONSE_STATUS_CODE, + emitStableRpcSemconv() + ? String.valueOf(Status.Code.OK.value()) + : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), @@ -1449,41 +1706,16 @@ static List addExtraClientAttributes(AttributeAssertion... a private void assertMetrics(Server server, Status.Code statusCode) { boolean hasSizeMetric = statusCode == Status.Code.OK; - testing() - .waitAndAssertMetrics( - "io.opentelemetry.grpc-1.6", - "rpc.server.duration", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasUnit("ms") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( - point -> - point.hasAttributesSatisfyingExactly( - equalTo(SERVER_ADDRESS, "localhost"), - satisfies( - SERVER_PORT, k -> k.isInstanceOf(Long.class)), - equalTo(RPC_METHOD, "SayHello"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_SYSTEM, "grpc"), - equalTo( - RPC_GRPC_STATUS_CODE, - (long) statusCode.value()), - equalTo(NETWORK_TYPE, "ipv4")))))); - - if (hasSizeMetric) { + if (emitOldRpcSemconv()) { testing() .waitAndAssertMetrics( "io.opentelemetry.grpc-1.6", - "rpc.server.request.size", + "rpc.server.duration", metrics -> metrics.anySatisfy( metric -> assertThat(metric) - .hasUnit("By") + .hasUnit("ms") .hasHistogramSatisfying( histogram -> histogram.hasPointsSatisfying( @@ -1499,82 +1731,87 @@ private void assertMetrics(Server server, Status.Code statusCode) { RPC_GRPC_STATUS_CODE, (long) statusCode.value()), equalTo(NETWORK_TYPE, "ipv4")))))); + + if (hasSizeMetric) { + testing() + .waitAndAssertMetrics( + "io.opentelemetry.grpc-1.6", + "rpc.server.request.size", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("By") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(SERVER_ADDRESS, "localhost"), + satisfies( + SERVER_PORT, + k -> k.isInstanceOf(Long.class)), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_SYSTEM, "grpc"), + equalTo( + RPC_GRPC_STATUS_CODE, + (long) statusCode.value()), + equalTo(NETWORK_TYPE, "ipv4")))))); + testing() + .waitAndAssertMetrics( + "io.opentelemetry.grpc-1.6", + "rpc.server.response.size", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("By") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(SERVER_ADDRESS, "localhost"), + satisfies( + SERVER_PORT, + k -> k.isInstanceOf(Long.class)), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_SYSTEM, "grpc"), + equalTo( + RPC_GRPC_STATUS_CODE, + (long) statusCode.value()), + equalTo(NETWORK_TYPE, "ipv4")))))); + } + testing() .waitAndAssertMetrics( "io.opentelemetry.grpc-1.6", - "rpc.server.response.size", + "rpc.client.duration", metrics -> metrics.anySatisfy( metric -> assertThat(metric) - .hasUnit("By") + .hasUnit("ms") .hasHistogramSatisfying( histogram -> histogram.hasPointsSatisfying( point -> - point.hasAttributesSatisfyingExactly( + point.hasAttributesSatisfying( equalTo(SERVER_ADDRESS, "localhost"), - satisfies( - SERVER_PORT, k -> k.isInstanceOf(Long.class)), + equalTo(SERVER_PORT, server.getPort()), equalTo(RPC_METHOD, "SayHello"), equalTo(RPC_SERVICE, "example.Greeter"), equalTo(RPC_SYSTEM, "grpc"), equalTo( RPC_GRPC_STATUS_CODE, - (long) statusCode.value()), - equalTo(NETWORK_TYPE, "ipv4")))))); - } - - testing() - .waitAndAssertMetrics( - "io.opentelemetry.grpc-1.6", - "rpc.client.duration", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasUnit("ms") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( - point -> - point.hasAttributesSatisfying( - equalTo(SERVER_ADDRESS, "localhost"), - equalTo(SERVER_PORT, server.getPort()), - equalTo(RPC_METHOD, "SayHello"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_SYSTEM, "grpc"), - equalTo( - RPC_GRPC_STATUS_CODE, - (long) statusCode.value())))))); + (long) statusCode.value())))))); - testing() - .waitAndAssertMetrics( - "io.opentelemetry.grpc-1.6", - "rpc.client.request.size", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasUnit("By") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( - point -> - point.hasAttributesSatisfying( - equalTo(SERVER_ADDRESS, "localhost"), - equalTo(SERVER_PORT, server.getPort()), - equalTo(RPC_METHOD, "SayHello"), - equalTo(RPC_SERVICE, "example.Greeter"), - equalTo(RPC_SYSTEM, "grpc"), - equalTo( - RPC_GRPC_STATUS_CODE, - (long) statusCode.value())))))); - if (hasSizeMetric) { testing() .waitAndAssertMetrics( "io.opentelemetry.grpc-1.6", - "rpc.client.response.size", + "rpc.client.request.size", metrics -> metrics.anySatisfy( metric -> @@ -1593,6 +1830,75 @@ private void assertMetrics(Server server, Status.Code statusCode) { equalTo( RPC_GRPC_STATUS_CODE, (long) statusCode.value())))))); + if (hasSizeMetric) { + testing() + .waitAndAssertMetrics( + "io.opentelemetry.grpc-1.6", + "rpc.client.response.size", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("By") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfying( + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(RPC_METHOD, "SayHello"), + equalTo(RPC_SERVICE, "example.Greeter"), + equalTo(RPC_SYSTEM, "grpc"), + equalTo( + RPC_GRPC_STATUS_CODE, + (long) statusCode.value())))))); + } + } + if (emitStableRpcSemconv()) { + testing() + .waitAndAssertMetrics( + "io.opentelemetry.grpc-1.6", + "rpc.server.call.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("s") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfyingExactly( + equalTo(RPC_SYSTEM_NAME, "grpc"), + equalTo(SERVER_ADDRESS, "localhost"), + satisfies( + SERVER_PORT, k -> k.isInstanceOf(Long.class)), + equalTo(RPC_METHOD, "example.Greeter/SayHello"), + equalTo( + RPC_RESPONSE_STATUS_CODE, + String.valueOf(statusCode.value()))))))); + testing() + .waitAndAssertMetrics( + "io.opentelemetry.grpc-1.6", + "rpc.client.call.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("s") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfying( + equalTo(RPC_SYSTEM_NAME, "grpc"), + equalTo(SERVER_ADDRESS, "localhost"), + equalTo(SERVER_PORT, server.getPort()), + equalTo(RPC_METHOD, "example.Greeter/SayHello"), + equalTo( + RPC_RESPONSE_STATUS_CODE, + String.valueOf(statusCode.value()))))))); } } } diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/rpc/SemconvRpcStabilityUtil.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/rpc/SemconvRpcStabilityUtil.java new file mode 100644 index 000000000000..4fd78d94063a --- /dev/null +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/rpc/SemconvRpcStabilityUtil.java @@ -0,0 +1,40 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.testing.junit.rpc; + +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableRpcSemconv; +import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; + +import io.opentelemetry.api.common.AttributeKey; +import java.util.HashMap; +import java.util.Map; + +// until old rpc semconv are dropped in 3.0 +@SuppressWarnings("deprecation") // using deprecated semconv +public class SemconvRpcStabilityUtil { + + private static final AttributeKey RPC_SYSTEM_NAME = + AttributeKey.stringKey("rpc.system.name"); + + private static final Map, AttributeKey> oldToNewMap = buildMap(); + + private static Map, AttributeKey> buildMap() { + Map, AttributeKey> map = new HashMap<>(); + map.put(RPC_SYSTEM, RPC_SYSTEM_NAME); + return map; + } + + private SemconvRpcStabilityUtil() {} + + @SuppressWarnings("unchecked") + public static AttributeKey maybeStable(AttributeKey oldKey) { + // not testing rpc/dup + if (emitStableRpcSemconv()) { + return (AttributeKey) oldToNewMap.get(oldKey); + } + return oldKey; + } +} From 4f8e4c08b4c56752ae3f62cbd87256fcb3d71677 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 27 Feb 2026 10:11:14 -0800 Subject: [PATCH 02/10] Use named status codes for rpc.response.status_code Per the stable gRPC semconv spec, rpc.response.status_code should use the named status code (OK, CANCELLED, UNAVAILABLE, etc.) not the numeric value (0, 2, 14). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Fix missed status code assertions in streaming and clientErrorThrown tests Use Status.Code.name() instead of String.valueOf(Status.Code.*.value()) for rpc.response.status_code assertions in AbstractGrpcStreamingTest and the clientErrorThrown test in AbstractGrpcTest. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../grpc/v1_6/GrpcAttributesExtractor.java | 2 +- .../grpc/v1_6/AbstractGrpcStreamingTest.java | 8 ++-- .../grpc/v1_6/AbstractGrpcTest.java | 40 +++++++++---------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAttributesExtractor.java b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAttributesExtractor.java index 53de8a6e144e..2b6047fa0f3e 100644 --- a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAttributesExtractor.java +++ b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAttributesExtractor.java @@ -52,7 +52,7 @@ public void onEnd( attributes.put(RPC_GRPC_STATUS_CODE, status.getCode().value()); } if (emitStableRpcSemconv()) { - attributes.put(RPC_RESPONSE_STATUS_CODE, String.valueOf(status.getCode().value())); + attributes.put(RPC_RESPONSE_STATUS_CODE, status.getCode().name()); } } for (String key : capturedRequestMetadata) { diff --git a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java index 60fc550c5aa9..d7d8bc11e1be 100644 --- a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java +++ b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java @@ -263,7 +263,7 @@ public void onCompleted() { equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(Status.Code.OK.value()) + ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) @@ -295,7 +295,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(Status.Code.OK.value()) + ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), @@ -359,7 +359,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), RPC_METHOD, "example.Greeter/Conversation"), equalTo( RPC_RESPONSE_STATUS_CODE, - String.valueOf(Status.Code.OK.value()))))))); + Status.Code.OK.name())))))); } if (emitOldRpcSemconv()) { testing() @@ -407,7 +407,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), RPC_METHOD, "example.Greeter/Conversation"), equalTo( RPC_RESPONSE_STATUS_CODE, - String.valueOf(Status.Code.OK.value()))))))); + Status.Code.OK.name())))))); } } diff --git a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java index 011332691f01..4d2d126d1e78 100644 --- a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java +++ b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java @@ -172,7 +172,7 @@ public void sayHello( equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(Status.Code.OK.value()) + ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) @@ -212,7 +212,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(Status.Code.OK.value()) + ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), @@ -315,7 +315,7 @@ public void sayHello( equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(Status.Code.OK.value()) + ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) @@ -355,7 +355,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(Status.Code.OK.value()) + ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), @@ -470,7 +470,7 @@ public void onCompleted() { equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(Status.Code.OK.value()) + ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) @@ -510,7 +510,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(Status.Code.OK.value()) + ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), @@ -600,7 +600,7 @@ public void sayHello( equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(status.getCode().value()) + ? status.getCode().name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) @@ -641,7 +641,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(status.getCode().value()) + ? status.getCode().name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), @@ -736,7 +736,7 @@ public void sayHello( equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(Status.UNKNOWN.getCode().value()) + ? Status.UNKNOWN.getCode().name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) @@ -774,7 +774,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(Status.Code.UNKNOWN.value()) + ? Status.Code.UNKNOWN.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), @@ -963,7 +963,7 @@ public void onCompleted() { equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(Status.Code.OK.value()) + ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) @@ -1003,7 +1003,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(Status.Code.OK.value()) + ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), @@ -1119,7 +1119,7 @@ public void onCompleted() { equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(Status.Code.CANCELLED.value()) + ? Status.Code.CANCELLED.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) @@ -1163,7 +1163,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(Status.Code.CANCELLED.value()) + ? Status.Code.CANCELLED.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), @@ -1269,7 +1269,7 @@ public void onCompleted() { equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(Status.Code.OK.value()) + ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) @@ -1313,7 +1313,7 @@ public void onCompleted() { equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(Status.Code.OK.value()) + ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), @@ -1400,7 +1400,7 @@ public void sayHello( equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(Status.Code.OK.value()) + ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) @@ -1440,7 +1440,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), equalTo( RPC_RESPONSE_STATUS_CODE, emitStableRpcSemconv() - ? String.valueOf(Status.Code.OK.value()) + ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), @@ -1877,7 +1877,7 @@ private void assertMetrics(Server server, Status.Code statusCode) { equalTo(RPC_METHOD, "example.Greeter/SayHello"), equalTo( RPC_RESPONSE_STATUS_CODE, - String.valueOf(statusCode.value()))))))); + statusCode.name())))))); testing() .waitAndAssertMetrics( "io.opentelemetry.grpc-1.6", @@ -1898,7 +1898,7 @@ private void assertMetrics(Server server, Status.Code statusCode) { equalTo(RPC_METHOD, "example.Greeter/SayHello"), equalTo( RPC_RESPONSE_STATUS_CODE, - String.valueOf(statusCode.value()))))))); + statusCode.name())))))); } } } From bdc049e7f5e2e07957558fffa5258c4b83c95a1e Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 27 Feb 2026 10:11:41 -0800 Subject: [PATCH 03/10] Wire dualEmitContextCustomizer into GrpcTelemetryBuilder In rpc/dup mode, span attributes can only hold one value for rpc.method. The dualEmitContextCustomizer stashes the old rpc.method value in context so RpcClientMetrics/RpcServerMetrics can use it for old metrics. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Suppress deprecation warning for RpcMetricsContextCustomizers in build() Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../grpc/v1_6/GrpcTelemetryBuilder.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcTelemetryBuilder.java b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcTelemetryBuilder.java index 703a93496a52..a1eee0767fbf 100644 --- a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcTelemetryBuilder.java +++ b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcTelemetryBuilder.java @@ -12,6 +12,7 @@ import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcClientAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcClientMetrics; +import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcMetricsContextCustomizers; import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcServerAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcServerMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcSizeAttributesExtractor; @@ -151,6 +152,7 @@ public GrpcTelemetryBuilder setCapturedServerRequestMetadata( } /** Returns a new {@link GrpcTelemetry} with the settings of this {@link GrpcTelemetryBuilder}. */ + @SuppressWarnings("deprecation") // RpcMetricsContextCustomizers is deprecated for removal in 3.0 public GrpcTelemetry build() { SpanNameExtractor originalSpanNameExtractor = new GrpcSpanNameExtractor(); SpanNameExtractor clientSpanNameExtractor = @@ -179,7 +181,9 @@ public GrpcTelemetry build() { .addAttributesExtractor( new GrpcAttributesExtractor( GrpcRpcAttributesGetter.INSTANCE, capturedClientRequestMetadata)) - .addOperationMetrics(RpcClientMetrics.get()); + .addOperationMetrics(RpcClientMetrics.get()) + .addContextCustomizer( + RpcMetricsContextCustomizers.dualEmitContextCustomizer(rpcAttributesGetter)); Experimental.addOperationListenerAttributesExtractor( clientInstrumenterBuilder, RpcSizeAttributesExtractor.create(rpcAttributesGetter)); serverInstrumenterBuilder @@ -192,7 +196,9 @@ public GrpcTelemetry build() { new GrpcAttributesExtractor( GrpcRpcAttributesGetter.INSTANCE, capturedServerRequestMetadata)) .addAttributesExtractors(additionalServerExtractors) - .addOperationMetrics(RpcServerMetrics.get()); + .addOperationMetrics(RpcServerMetrics.get()) + .addContextCustomizer( + RpcMetricsContextCustomizers.dualEmitContextCustomizer(rpcAttributesGetter)); Experimental.addOperationListenerAttributesExtractor( serverInstrumenterBuilder, RpcSizeAttributesExtractor.create(rpcAttributesGetter)); From 70733348e30c5422781c0cb92cd1006c4d35d90f Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 27 Feb 2026 10:11:58 -0800 Subject: [PATCH 04/10] Add testBothSemconv task for grpc-1.6 javaagent Tests the full gRPC pipeline in rpc/dup mode to catch issues like missing context customizer wiring that would produce wrong rpc.method values on old metrics. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../grpc-1.6/javaagent/build.gradle.kts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/instrumentation/grpc-1.6/javaagent/build.gradle.kts b/instrumentation/grpc-1.6/javaagent/build.gradle.kts index a2b04a8a2ce9..d3b786eacbd1 100644 --- a/instrumentation/grpc-1.6/javaagent/build.gradle.kts +++ b/instrumentation/grpc-1.6/javaagent/build.gradle.kts @@ -80,8 +80,22 @@ tasks { systemProperty("metadataConfig", "otel.semconv-stability.opt-in=rpc") } + val testBothSemconv by registering(Test::class) { + testClassesDirs = sourceSets.test.get().output.classesDirs + classpath = sourceSets.test.get().runtimeClasspath + + // exclude our grpc library instrumentation, the ContextStorageOverride contained within it + // breaks the tests + classpath = classpath.filter { + !it.absolutePath.contains("opentelemetry-grpc-1.6") + } + + jvmArgs("-Dotel.semconv-stability.opt-in=rpc/dup") + systemProperty("metadataConfig", "otel.semconv-stability.opt-in=rpc/dup") + } + check { - dependsOn(testExperimental, testStableSemconv) + dependsOn(testExperimental, testStableSemconv, testBothSemconv) } } From 6188954819b9e0c3ff2f429c28b52d71b6703488 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 27 Feb 2026 10:12:39 -0800 Subject: [PATCH 05/10] Fix captured request metadata attribute key prefix for stable semconv The stable semconv spec uses rpc.request.metadata. instead of rpc.grpc.request.metadata.. Add stableRequestAttributeKey() to CapturedGrpcMetadataUtil and use it when stable semconv is active. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../grpc/v1_6/CapturedGrpcMetadataUtil.java | 14 ++++++++++++++ .../grpc/v1_6/GrpcAttributesExtractor.java | 8 +++++++- .../grpc/v1_6/AbstractGrpcTest.java | 11 ++++++++--- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/CapturedGrpcMetadataUtil.java b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/CapturedGrpcMetadataUtil.java index 5c39d4c228f9..9cb5f3d7bac8 100644 --- a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/CapturedGrpcMetadataUtil.java +++ b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/CapturedGrpcMetadataUtil.java @@ -17,8 +17,12 @@ final class CapturedGrpcMetadataUtil { private static final String RPC_REQUEST_METADATA_KEY_ATTRIBUTE_PREFIX = "rpc.grpc.request.metadata."; + private static final String RPC_STABLE_REQUEST_METADATA_KEY_ATTRIBUTE_PREFIX = + "rpc.request.metadata."; private static final ConcurrentMap>> requestKeysCache = new ConcurrentHashMap<>(); + private static final ConcurrentMap>> stableRequestKeysCache = + new ConcurrentHashMap<>(); static List lowercase(List names) { return unmodifiableList(names.stream().map(s -> s.toLowerCase(Locale.ROOT)).collect(toList())); @@ -29,9 +33,19 @@ static AttributeKey> requestAttributeKey(String metadataKey) { metadataKey, CapturedGrpcMetadataUtil::createRequestKey); } + static AttributeKey> stableRequestAttributeKey(String metadataKey) { + return stableRequestKeysCache.computeIfAbsent( + metadataKey, CapturedGrpcMetadataUtil::createStableRequestKey); + } + private static AttributeKey> createRequestKey(String metadataKey) { return AttributeKey.stringArrayKey(RPC_REQUEST_METADATA_KEY_ATTRIBUTE_PREFIX + metadataKey); } + private static AttributeKey> createStableRequestKey(String metadataKey) { + return AttributeKey.stringArrayKey( + RPC_STABLE_REQUEST_METADATA_KEY_ATTRIBUTE_PREFIX + metadataKey); + } + private CapturedGrpcMetadataUtil() {} } diff --git a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAttributesExtractor.java b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAttributesExtractor.java index 2b6047fa0f3e..23aea85c86d2 100644 --- a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAttributesExtractor.java +++ b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAttributesExtractor.java @@ -9,6 +9,7 @@ import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableRpcSemconv; import static io.opentelemetry.instrumentation.grpc.v1_6.CapturedGrpcMetadataUtil.lowercase; import static io.opentelemetry.instrumentation.grpc.v1_6.CapturedGrpcMetadataUtil.requestAttributeKey; +import static io.opentelemetry.instrumentation.grpc.v1_6.CapturedGrpcMetadataUtil.stableRequestAttributeKey; import io.grpc.Status; import io.opentelemetry.api.common.AttributeKey; @@ -58,7 +59,12 @@ public void onEnd( for (String key : capturedRequestMetadata) { List value = getter.metadataValue(request, key); if (!value.isEmpty()) { - attributes.put(requestAttributeKey(key), value); + if (emitOldRpcSemconv()) { + attributes.put(requestAttributeKey(key), value); + } + if (emitStableRpcSemconv()) { + attributes.put(stableRequestAttributeKey(key), value); + } } } } diff --git a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java index 4d2d126d1e78..ead72912c95a 100644 --- a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java +++ b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java @@ -1609,11 +1609,16 @@ public void sayHello( @Test void setCapturedRequestMetadata() throws Exception { - String metadataAttributePrefix = "rpc.grpc.request.metadata."; + String oldMetadataAttributePrefix = "rpc.grpc.request.metadata."; + String stableMetadataAttributePrefix = "rpc.request.metadata."; AttributeKey> clientAttributeKey = - AttributeKey.stringArrayKey(metadataAttributePrefix + CLIENT_REQUEST_METADATA_KEY); + AttributeKey.stringArrayKey( + (emitStableRpcSemconv() ? stableMetadataAttributePrefix : oldMetadataAttributePrefix) + + CLIENT_REQUEST_METADATA_KEY); AttributeKey> serverAttributeKey = - AttributeKey.stringArrayKey(metadataAttributePrefix + SERVER_REQUEST_METADATA_KEY); + AttributeKey.stringArrayKey( + (emitStableRpcSemconv() ? stableMetadataAttributePrefix : oldMetadataAttributePrefix) + + SERVER_REQUEST_METADATA_KEY); String serverMetadataValue = "server-value"; String clientMetadataValue = "client-value"; From 0617cb1d94b45a26b897070872dc259abb880988 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 27 Feb 2026 10:13:16 -0800 Subject: [PATCH 06/10] Add testStableSemconv and testBothSemconv tasks for grpc-1.6 library The library tests exercise GrpcTelemetryBuilder.build() directly, which is the code path where issues like missing context customizer wiring would be caught. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Fix RPC_SYSTEM assertions for rpc/dup semconv mode in tests Replace equalTo(maybeStable(RPC_SYSTEM), "grpc") with dual RPC_SYSTEM and RPC_SYSTEM_NAME assertions in AbstractGrpcTest and AbstractGrpcStreamingTest, to correctly handle rpc/dup mode where both attributes are emitted. Also removes the now-unused maybeStable import from both test files. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../grpc-1.6/library/build.gradle.kts | 18 ++++++ .../grpc/v1_6/AbstractGrpcStreamingTest.java | 7 ++- .../grpc/v1_6/AbstractGrpcTest.java | 55 ++++++++++++------- 3 files changed, 58 insertions(+), 22 deletions(-) diff --git a/instrumentation/grpc-1.6/library/build.gradle.kts b/instrumentation/grpc-1.6/library/build.gradle.kts index 00ace4566efb..77204eeadc94 100644 --- a/instrumentation/grpc-1.6/library/build.gradle.kts +++ b/instrumentation/grpc-1.6/library/build.gradle.kts @@ -24,6 +24,24 @@ tasks { // and peer address is 0:0:0:0:0:0:0:1 instead of 127.0.0.1 jvmArgs("-Djava.net.preferIPv4Stack=true") } + + val testStableSemconv by registering(Test::class) { + testClassesDirs = sourceSets.test.get().output.classesDirs + classpath = sourceSets.test.get().runtimeClasspath + + jvmArgs("-Dotel.semconv-stability.opt-in=rpc") + } + + val testBothSemconv by registering(Test::class) { + testClassesDirs = sourceSets.test.get().output.classesDirs + classpath = sourceSets.test.get().runtimeClasspath + + jvmArgs("-Dotel.semconv-stability.opt-in=rpc/dup") + } + + check { + dependsOn(testStableSemconv, testBothSemconv) + } } if (!(findProperty("testLatestDeps") as Boolean)) { diff --git a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java index d7d8bc11e1be..b4345f7be51c 100644 --- a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java +++ b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java @@ -11,7 +11,6 @@ import static io.opentelemetry.instrumentation.grpc.v1_6.ExperimentalTestHelper.GRPC_RECEIVED_MESSAGE_COUNT; import static io.opentelemetry.instrumentation.grpc.v1_6.ExperimentalTestHelper.GRPC_SENT_MESSAGE_COUNT; import static io.opentelemetry.instrumentation.grpc.v1_6.ExperimentalTestHelper.experimentalSatisfies; -import static io.opentelemetry.instrumentation.testing.junit.rpc.SemconvRpcStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; @@ -248,7 +247,8 @@ public void onCompleted() { experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), @@ -281,7 +281,8 @@ public void onCompleted() { v -> assertThat(v).isGreaterThan(0)), experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), equalTo( diff --git a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java index ead72912c95a..245889ff470d 100644 --- a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java +++ b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java @@ -10,7 +10,6 @@ import static io.opentelemetry.instrumentation.grpc.v1_6.ExperimentalTestHelper.GRPC_RECEIVED_MESSAGE_COUNT; import static io.opentelemetry.instrumentation.grpc.v1_6.ExperimentalTestHelper.GRPC_SENT_MESSAGE_COUNT; import static io.opentelemetry.instrumentation.grpc.v1_6.ExperimentalTestHelper.experimentalSatisfies; -import static io.opentelemetry.instrumentation.testing.junit.rpc.SemconvRpcStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; @@ -157,7 +156,8 @@ public void sayHello( experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), @@ -198,7 +198,8 @@ public void sayHello( v -> assertThat(v).isGreaterThan(0)), experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), equalTo( @@ -300,7 +301,8 @@ public void sayHello( experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), @@ -341,7 +343,8 @@ public void sayHello( v -> assertThat(v).isGreaterThan(0)), experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), equalTo( @@ -455,7 +458,8 @@ public void onCompleted() { experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), @@ -496,7 +500,8 @@ public void onCompleted() { v -> assertThat(v).isGreaterThan(0)), experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), equalTo( @@ -583,7 +588,8 @@ public void sayHello( experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), @@ -622,7 +628,8 @@ public void sayHello( v -> assertThat(v).isGreaterThan(0)), experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isEqualTo(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), equalTo( @@ -719,7 +726,8 @@ public void sayHello( experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), @@ -753,7 +761,8 @@ public void sayHello( .hasParent(trace.getSpan(0)) .hasStatus(StatusData.error()) .hasAttributesSatisfyingExactly( - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), equalTo( @@ -948,7 +957,8 @@ public void onCompleted() { experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), @@ -989,7 +999,8 @@ public void onCompleted() { v -> assertThat(v).isGreaterThan(0)), experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), equalTo( @@ -1097,7 +1108,8 @@ public void onCompleted() { experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), @@ -1147,7 +1159,8 @@ public void onCompleted() { v -> assertThat(v).isGreaterThan(0)), experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), equalTo( @@ -1252,7 +1265,8 @@ public void onCompleted() { experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() @@ -1296,7 +1310,8 @@ public void onCompleted() { v -> assertThat(v).isGreaterThan(0)), experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() @@ -1385,7 +1400,8 @@ public void sayHello( experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), @@ -1426,7 +1442,8 @@ public void sayHello( v -> assertThat(v).isGreaterThan(0)), experimentalSatisfies( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), - equalTo(maybeStable(RPC_SYSTEM), "grpc"), + equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), + equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), equalTo( From 04af1a3476fff30532ba60465a4ba960e4c07f0b Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 27 Feb 2026 12:23:59 -0800 Subject: [PATCH 07/10] spotless --- .../grpc/v1_6/AbstractGrpcStreamingTest.java | 11 +-- .../grpc/v1_6/AbstractGrpcTest.java | 91 +++++++------------ 2 files changed, 38 insertions(+), 64 deletions(-) diff --git a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java index b4345f7be51c..d828ebb737fe 100644 --- a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java +++ b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java @@ -248,7 +248,8 @@ public void onCompleted() { GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), - equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), + equalTo( + RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), @@ -262,9 +263,7 @@ public void onCompleted() { emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? Status.Code.OK.name() - : null), + emitStableRpcSemconv() ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) .satisfies( @@ -295,9 +294,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? Status.Code.OK.name() - : null), + emitStableRpcSemconv() ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), diff --git a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java index 245889ff470d..111fe7c2aca1 100644 --- a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java +++ b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java @@ -157,7 +157,8 @@ public void sayHello( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), - equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), + equalTo( + RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), @@ -171,9 +172,7 @@ public void sayHello( emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? Status.Code.OK.name() - : null), + emitStableRpcSemconv() ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( @@ -212,9 +211,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? Status.Code.OK.name() - : null), + emitStableRpcSemconv() ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), @@ -302,7 +299,8 @@ public void sayHello( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), - equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), + equalTo( + RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), @@ -316,9 +314,7 @@ public void sayHello( emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? Status.Code.OK.name() - : null), + emitStableRpcSemconv() ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( @@ -357,9 +353,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? Status.Code.OK.name() - : null), + emitStableRpcSemconv() ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), @@ -459,7 +453,8 @@ public void onCompleted() { GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), - equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), + equalTo( + RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), @@ -473,9 +468,7 @@ public void onCompleted() { emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? Status.Code.OK.name() - : null), + emitStableRpcSemconv() ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( @@ -514,9 +507,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? Status.Code.OK.name() - : null), + emitStableRpcSemconv() ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), @@ -589,7 +580,8 @@ public void sayHello( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), - equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), + equalTo( + RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), @@ -605,9 +597,7 @@ public void sayHello( : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? status.getCode().name() - : null), + emitStableRpcSemconv() ? status.getCode().name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( @@ -647,9 +637,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), emitOldRpcSemconv() ? (long) status.getCode().value() : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? status.getCode().name() - : null), + emitStableRpcSemconv() ? status.getCode().name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), @@ -727,7 +715,8 @@ public void sayHello( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), - equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), + equalTo( + RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), @@ -782,9 +771,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? Status.Code.UNKNOWN.name() - : null), + emitStableRpcSemconv() ? Status.Code.UNKNOWN.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), @@ -958,7 +945,8 @@ public void onCompleted() { GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), - equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), + equalTo( + RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), @@ -972,9 +960,7 @@ public void onCompleted() { emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? Status.Code.OK.name() - : null), + emitStableRpcSemconv() ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( @@ -1013,9 +999,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? Status.Code.OK.name() - : null), + emitStableRpcSemconv() ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), @@ -1109,7 +1093,8 @@ public void onCompleted() { GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), - equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), + equalTo( + RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), @@ -1175,9 +1160,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? Status.Code.CANCELLED.name() - : null), + emitStableRpcSemconv() ? Status.Code.CANCELLED.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), @@ -1266,7 +1249,8 @@ public void onCompleted() { GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), - equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), + equalTo( + RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() @@ -1282,9 +1266,7 @@ public void onCompleted() { emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? Status.Code.OK.name() - : null), + emitStableRpcSemconv() ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( @@ -1327,9 +1309,7 @@ public void onCompleted() { emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? Status.Code.OK.name() - : null), + emitStableRpcSemconv() ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), @@ -1401,7 +1381,8 @@ public void sayHello( GRPC_SENT_MESSAGE_COUNT, v -> assertThat(v).isGreaterThan(0)), equalTo(RPC_SYSTEM, emitOldRpcSemconv() ? "grpc" : null), - equalTo(RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), + equalTo( + RPC_SYSTEM_NAME, emitStableRpcSemconv() ? "grpc" : null), equalTo( RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), @@ -1415,9 +1396,7 @@ public void sayHello( emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? Status.Code.OK.name() - : null), + emitStableRpcSemconv() ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, (long) server.getPort()))) .hasEventsSatisfyingExactly( @@ -1456,9 +1435,7 @@ RPC_SERVICE, emitOldRpcSemconv() ? "example.Greeter" : null), emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? Status.Code.OK.name() - : null), + emitStableRpcSemconv() ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "localhost"), equalTo(SERVER_PORT, server.getPort()), equalTo(NETWORK_TYPE, "ipv4"), From a7e99242094cd4b7f40482ce471e21476572cadd Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 27 Feb 2026 15:38:14 -0800 Subject: [PATCH 08/10] Fix gRPC stable semconv test failures - ArmeriaGrpcTest: use Status.Code.OK.name() instead of String.valueOf(Status.Code.OK.value()) for rpc.response.status_code, matching the GrpcAttributesExtractor implementation - grpc-1.6 build.gradle.kts: add testLatestDeps system property and IPv4 preference to testStableSemconv and testBothSemconv tasks, matching the existing test task configuration Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../armeria/grpc/v1_14/ArmeriaGrpcTest.java | 8 ++------ instrumentation/grpc-1.6/library/build.gradle.kts | 4 ++++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java b/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java index a3da3300b8bc..9fe9a7db9b7d 100644 --- a/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java +++ b/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java @@ -92,9 +92,7 @@ void grpcInstrumentation() { emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? String.valueOf(Status.Code.OK.value()) - : null), + emitStableRpcSemconv() ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "127.0.0.1"), equalTo(SERVER_PORT, (long) server.httpPort())) .hasEventsSatisfyingExactly( @@ -124,9 +122,7 @@ void grpcInstrumentation() { emitOldRpcSemconv() ? (long) Status.Code.OK.value() : null), equalTo( RPC_RESPONSE_STATUS_CODE, - emitStableRpcSemconv() - ? String.valueOf(Status.Code.OK.value()) - : null), + emitStableRpcSemconv() ? Status.Code.OK.name() : null), equalTo(SERVER_ADDRESS, "127.0.0.1"), equalTo(SERVER_PORT, server.httpPort())) .hasEventsSatisfyingExactly( diff --git a/instrumentation/grpc-1.6/library/build.gradle.kts b/instrumentation/grpc-1.6/library/build.gradle.kts index 77204eeadc94..e9a4b4a84d4b 100644 --- a/instrumentation/grpc-1.6/library/build.gradle.kts +++ b/instrumentation/grpc-1.6/library/build.gradle.kts @@ -29,14 +29,18 @@ tasks { testClassesDirs = sourceSets.test.get().output.classesDirs classpath = sourceSets.test.get().runtimeClasspath + systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) jvmArgs("-Dotel.semconv-stability.opt-in=rpc") + jvmArgs("-Djava.net.preferIPv4Stack=true") } val testBothSemconv by registering(Test::class) { testClassesDirs = sourceSets.test.get().output.classesDirs classpath = sourceSets.test.get().runtimeClasspath + systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) jvmArgs("-Dotel.semconv-stability.opt-in=rpc/dup") + jvmArgs("-Djava.net.preferIPv4Stack=true") } check { From f2743a52e759396f879c1249f9450668a10ad411 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Sat, 28 Feb 2026 12:55:34 -0800 Subject: [PATCH 09/10] simplify --- instrumentation/grpc-1.6/library/build.gradle.kts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/instrumentation/grpc-1.6/library/build.gradle.kts b/instrumentation/grpc-1.6/library/build.gradle.kts index e9a4b4a84d4b..4d981a56fbc6 100644 --- a/instrumentation/grpc-1.6/library/build.gradle.kts +++ b/instrumentation/grpc-1.6/library/build.gradle.kts @@ -17,30 +17,29 @@ dependencies { } tasks { - test { + withType().configureEach { systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) - jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true") // latest dep test occasionally fails because network type is ipv6 instead of the expected ipv4 // and peer address is 0:0:0:0:0:0:0:1 instead of 127.0.0.1 jvmArgs("-Djava.net.preferIPv4Stack=true") } + test { + jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true") + } + val testStableSemconv by registering(Test::class) { testClassesDirs = sourceSets.test.get().output.classesDirs classpath = sourceSets.test.get().runtimeClasspath - systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) jvmArgs("-Dotel.semconv-stability.opt-in=rpc") - jvmArgs("-Djava.net.preferIPv4Stack=true") } val testBothSemconv by registering(Test::class) { testClassesDirs = sourceSets.test.get().output.classesDirs classpath = sourceSets.test.get().runtimeClasspath - systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) jvmArgs("-Dotel.semconv-stability.opt-in=rpc/dup") - jvmArgs("-Djava.net.preferIPv4Stack=true") } check { From a4b0d0eb92e7bb8620a00679d5200f231db5e31f Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Sat, 28 Feb 2026 13:15:11 -0800 Subject: [PATCH 10/10] updates --- .../javaagent/build.gradle.kts | 8 +-- .../grpc/v1_6/AbstractGrpcTest.java | 52 ++++++++++++------- .../junit/rpc/SemconvRpcStabilityUtil.java | 2 +- 3 files changed, 39 insertions(+), 23 deletions(-) diff --git a/instrumentation/armeria/armeria-grpc-1.14/javaagent/build.gradle.kts b/instrumentation/armeria/armeria-grpc-1.14/javaagent/build.gradle.kts index 5dc9562ea9e6..1b1c7cef52fe 100644 --- a/instrumentation/armeria/armeria-grpc-1.14/javaagent/build.gradle.kts +++ b/instrumentation/armeria/armeria-grpc-1.14/javaagent/build.gradle.kts @@ -59,11 +59,11 @@ afterEvaluate { } } -tasks.test { - systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") -} - tasks { + withType().configureEach { + systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") + } + val testStableSemconv by registering(Test::class) { testClassesDirs = sourceSets.test.get().output.classesDirs classpath = sourceSets.test.get().runtimeClasspath diff --git a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java index 111fe7c2aca1..1b01a27424c9 100644 --- a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java +++ b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java @@ -1605,14 +1605,14 @@ public void sayHello( void setCapturedRequestMetadata() throws Exception { String oldMetadataAttributePrefix = "rpc.grpc.request.metadata."; String stableMetadataAttributePrefix = "rpc.request.metadata."; - AttributeKey> clientAttributeKey = - AttributeKey.stringArrayKey( - (emitStableRpcSemconv() ? stableMetadataAttributePrefix : oldMetadataAttributePrefix) - + CLIENT_REQUEST_METADATA_KEY); - AttributeKey> serverAttributeKey = - AttributeKey.stringArrayKey( - (emitStableRpcSemconv() ? stableMetadataAttributePrefix : oldMetadataAttributePrefix) - + SERVER_REQUEST_METADATA_KEY); + AttributeKey> oldClientAttributeKey = + AttributeKey.stringArrayKey(oldMetadataAttributePrefix + CLIENT_REQUEST_METADATA_KEY); + AttributeKey> stableClientAttributeKey = + AttributeKey.stringArrayKey(stableMetadataAttributePrefix + CLIENT_REQUEST_METADATA_KEY); + AttributeKey> oldServerAttributeKey = + AttributeKey.stringArrayKey(oldMetadataAttributePrefix + SERVER_REQUEST_METADATA_KEY); + AttributeKey> stableServerAttributeKey = + AttributeKey.stringArrayKey(stableMetadataAttributePrefix + SERVER_REQUEST_METADATA_KEY); String serverMetadataValue = "server-value"; String clientMetadataValue = "client-value"; @@ -1657,16 +1657,32 @@ public void sayHello( trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(), - span -> - span.hasName("example.Greeter/SayHello") - .hasKind(SpanKind.CLIENT) - .hasParent(trace.getSpan(0)) - .hasAttribute(clientAttributeKey, singletonList(clientMetadataValue)), - span -> - span.hasName("example.Greeter/SayHello") - .hasKind(SpanKind.SERVER) - .hasParent(trace.getSpan(1)) - .hasAttribute(serverAttributeKey, singletonList(serverMetadataValue)))); + span -> { + span.hasName("example.Greeter/SayHello") + .hasKind(SpanKind.CLIENT) + .hasParent(trace.getSpan(0)); + if (emitOldRpcSemconv()) { + span.hasAttribute( + oldClientAttributeKey, singletonList(clientMetadataValue)); + } + if (emitStableRpcSemconv()) { + span.hasAttribute( + stableClientAttributeKey, singletonList(clientMetadataValue)); + } + }, + span -> { + span.hasName("example.Greeter/SayHello") + .hasKind(SpanKind.SERVER) + .hasParent(trace.getSpan(1)); + if (emitOldRpcSemconv()) { + span.hasAttribute( + oldServerAttributeKey, singletonList(serverMetadataValue)); + } + if (emitStableRpcSemconv()) { + span.hasAttribute( + stableServerAttributeKey, singletonList(serverMetadataValue)); + } + })); } private ManagedChannel createChannel(Server server) throws Exception { diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/rpc/SemconvRpcStabilityUtil.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/rpc/SemconvRpcStabilityUtil.java index 4fd78d94063a..bd492bd9760b 100644 --- a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/rpc/SemconvRpcStabilityUtil.java +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/rpc/SemconvRpcStabilityUtil.java @@ -14,7 +14,7 @@ // until old rpc semconv are dropped in 3.0 @SuppressWarnings("deprecation") // using deprecated semconv -public class SemconvRpcStabilityUtil { +public final class SemconvRpcStabilityUtil { private static final AttributeKey RPC_SYSTEM_NAME = AttributeKey.stringKey("rpc.system.name");