From e0c1c950b5db2eeb69f69144e1629ae75def08dd Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Sun, 26 Apr 2026 21:20:33 +0000 Subject: [PATCH 01/11] Review fixes for internal-eclipse-osgi-3.6:javaagent Automated code review of instrumentation/internal/internal-eclipse-osgi-3.6/javaagent. --- .../internal-eclipse-osgi-3.6/javaagent/build.gradle.kts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/build.gradle.kts b/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/build.gradle.kts index 26215202ab79..c32b2b7fa0b7 100644 --- a/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/build.gradle.kts +++ b/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/build.gradle.kts @@ -2,6 +2,10 @@ plugins { id("otel.javaagent-instrumentation") } +dependencies { + compileOnly(project(":javaagent-bootstrap")) +} + // this instrumentation applies to the class 'org.eclipse.osgi.internal.loader.BundleLoader' // which is present in the following artifacts dating back to version 3.6 (2010): // From f9dc668138c6db6bae660d12514567625f7ae67e Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Sun, 26 Apr 2026 21:25:06 +0000 Subject: [PATCH 02/11] Review fixes for internal-lambda:javaagent Automated code review of instrumentation/internal/internal-lambda/javaagent. --- .../internal/lambda/LambdaTransformerHelper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instrumentation/internal/internal-lambda/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/lambda/LambdaTransformerHelper.java b/instrumentation/internal/internal-lambda/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/lambda/LambdaTransformerHelper.java index ee1392595680..8e38ac045cbd 100644 --- a/instrumentation/internal/internal-lambda/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/lambda/LambdaTransformerHelper.java +++ b/instrumentation/internal/internal-lambda/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/lambda/LambdaTransformerHelper.java @@ -12,8 +12,6 @@ /** Helper class for transforming lambda class bytes. */ public class LambdaTransformerHelper { - private LambdaTransformerHelper() {} - /** * Called from {@code java.lang.invoke.InnerClassLambdaMetafactory} to transform lambda class * bytes. @@ -40,4 +38,6 @@ public static byte[] transform(byte[] classBytes, String slashClassName, Class Date: Sun, 26 Apr 2026 21:29:55 +0000 Subject: [PATCH 03/11] Review fixes for internal-reflection:javaagent-integration-tests Automated code review of instrumentation/internal/internal-reflection/javaagent-integration-tests. --- .../internal/reflection/ReflectionTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionTest.java b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionTest.java index ea7a4e4f8325..e4506ee6a59b 100644 --- a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionTest.java +++ b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionTest.java @@ -34,10 +34,9 @@ void testOurFieldsAndMethodsAreNotVisibleWithReflection() { // although marker interfaces are removed from getInterfaces() result class is still assignable // to them - assertThat(VirtualFieldInstalledMarker.class.isAssignableFrom(TestClass.class)).isTrue(); - assertThat(VirtualFieldAccessorMarker.class.isAssignableFrom(TestClass.class)).isTrue(); - assertThat(TestClass.class.getInterfaces()) - .containsExactlyInAnyOrder(Runnable.class, Serializable.class); + assertThat(TestClass.class).isAssignableTo(VirtualFieldInstalledMarker.class); + assertThat(TestClass.class).isAssignableTo(VirtualFieldAccessorMarker.class); + assertThat(TestClass.class.getInterfaces()).containsExactly(Runnable.class, Serializable.class); } @Test From c4fc1a5e68b29ad4072d35859431a6efc3e76d88 Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Sun, 26 Apr 2026 21:34:48 +0000 Subject: [PATCH 04/11] Review fixes for internal-url-class-loader:javaagent-integration-tests Automated code review of instrumentation/internal/internal-url-class-loader/javaagent-integration-tests. --- .../instrumentation/internal/urlclassloader/AddUrlTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/internal/urlclassloader/AddUrlTest.java b/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/internal/urlclassloader/AddUrlTest.java index 44282eae74b4..1f1501e5068b 100644 --- a/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/internal/urlclassloader/AddUrlTest.java +++ b/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/internal/urlclassloader/AddUrlTest.java @@ -18,7 +18,8 @@ class AddUrlTest { - @RegisterExtension static final AutoCleanupExtension cleanup = AutoCleanupExtension.create(); + @RegisterExtension + private static final AutoCleanupExtension cleanup = AutoCleanupExtension.create(); @Test void testShouldInstrumentClassAfterItIsLoadedViaAddUrl() throws Exception { From 636a667f2a1d8aaa4bfc3c171307f0c0c9304d4c Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Sun, 26 Apr 2026 21:55:17 +0000 Subject: [PATCH 05/11] Review fixes for java-http-client:javaagent Automated code review of instrumentation/java-http-client/javaagent. --- .../javahttpclient/HttpClientInstrumentation.java | 1 + 1 file changed, 1 insertion(+) diff --git a/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/HttpClientInstrumentation.java b/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/HttpClientInstrumentation.java index 41124289baec..f56e0b0bdb01 100644 --- a/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/HttpClientInstrumentation.java +++ b/instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/HttpClientInstrumentation.java @@ -144,6 +144,7 @@ public static AsyncAdviceScope start(HttpRequest request) { } Context parentContext = currentContext(); if (!instrumenter().shouldStart(parentContext, request)) { + callDepth.decrementAndGet(); return null; } Context context = instrumenter().start(parentContext, request); From 176f68c4e26b4cf18f13c21a826b6a66a8440fec Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Sun, 26 Apr 2026 22:00:53 +0000 Subject: [PATCH 06/11] Review fixes for java-http-client:library Automated code review of instrumentation/java-http-client/library. --- .../javahttpclient/JavaHttpClientTelemetryBuilder.java | 6 +++--- .../javahttpclient/internal/Experimental.java | 5 +++-- .../internal/JavaHttpClientInstrumenterBuilderFactory.java | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTelemetryBuilder.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTelemetryBuilder.java index b82e085b79d7..93fc7d89bc92 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTelemetryBuilder.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTelemetryBuilder.java @@ -22,14 +22,14 @@ /** Builder for {@link JavaHttpClientTelemetry}. */ public final class JavaHttpClientTelemetryBuilder { - private final DefaultHttpClientInstrumenterBuilder> builder; - private final OpenTelemetry openTelemetry; - static { Experimental.internalSetEmitExperimentalTelemetry( (builder, emit) -> builder.builder.setEmitExperimentalHttpClientTelemetry(emit)); } + private final DefaultHttpClientInstrumenterBuilder> builder; + private final OpenTelemetry openTelemetry; + JavaHttpClientTelemetryBuilder(OpenTelemetry openTelemetry) { builder = JavaHttpClientInstrumenterBuilderFactory.create(openTelemetry); this.openTelemetry = openTelemetry; diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/Experimental.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/Experimental.java index 5842c7f949cf..d54e0c09a89f 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/Experimental.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/Experimental.java @@ -28,8 +28,9 @@ public final class Experimental { */ public static void setEmitExperimentalTelemetry( JavaHttpClientTelemetryBuilder builder, boolean emitExperimentalTelemetry) { - if (setEmitExperimentalTelemetry != null) { - setEmitExperimentalTelemetry.accept(builder, emitExperimentalTelemetry); + BiConsumer setter = setEmitExperimentalTelemetry; + if (setter != null) { + setter.accept(builder, emitExperimentalTelemetry); } } diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/JavaHttpClientInstrumenterBuilderFactory.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/JavaHttpClientInstrumenterBuilderFactory.java index 0c9ba54635f0..272e881daa2a 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/JavaHttpClientInstrumenterBuilderFactory.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/JavaHttpClientInstrumenterBuilderFactory.java @@ -15,8 +15,6 @@ * any time. */ public class JavaHttpClientInstrumenterBuilderFactory { - private JavaHttpClientInstrumenterBuilderFactory() {} - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.java-http-client"; public static DefaultHttpClientInstrumenterBuilder> create( @@ -24,4 +22,6 @@ public static DefaultHttpClientInstrumenterBuilder> return DefaultHttpClientInstrumenterBuilder.create( INSTRUMENTATION_NAME, openTelemetry, new JavaHttpClientAttributesGetter()); } + + private JavaHttpClientInstrumenterBuilderFactory() {} } From 0083ccea3e132577487320a8b29693a5d5e8820f Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Sun, 26 Apr 2026 22:19:29 +0000 Subject: [PATCH 07/11] Review fixes for java-http-server:javaagent Automated code review of instrumentation/java-http-server/javaagent. --- instrumentation/java-http-server/javaagent/build.gradle.kts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/instrumentation/java-http-server/javaagent/build.gradle.kts b/instrumentation/java-http-server/javaagent/build.gradle.kts index 4f7bf2a2ca0a..fa2af2d44275 100644 --- a/instrumentation/java-http-server/javaagent/build.gradle.kts +++ b/instrumentation/java-http-server/javaagent/build.gradle.kts @@ -13,6 +13,8 @@ dependencies { testImplementation(project(":instrumentation:java-http-server:testing")) } -tasks.test { - systemProperty("collectMetadata", otelProps.collectMetadata) +tasks { + withType().configureEach { + systemProperty("collectMetadata", otelProps.collectMetadata) + } } From 499fdc95e31363034bf03265842eb3a57e728b69 Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Sun, 26 Apr 2026 22:24:05 +0000 Subject: [PATCH 08/11] Review fixes for java-http-server:library Automated code review of instrumentation/java-http-server/library. --- .../javahttpserver/internal/Experimental.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/Experimental.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/Experimental.java index d0e2672b2b0a..7e2e52088424 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/Experimental.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/Experimental.java @@ -28,8 +28,9 @@ public final class Experimental { */ public static void setEmitExperimentalTelemetry( JavaHttpServerTelemetryBuilder builder, boolean emitExperimentalTelemetry) { - if (setEmitExperimentalTelemetry != null) { - setEmitExperimentalTelemetry.accept(builder, emitExperimentalTelemetry); + BiConsumer setter = setEmitExperimentalTelemetry; + if (setter != null) { + setter.accept(builder, emitExperimentalTelemetry); } } From 7ac72905c1b4f532e1c621383cd1972893f32158 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Sun, 26 Apr 2026 16:01:53 -0700 Subject: [PATCH 09/11] revert --- .github/agents/knowledge/gradle-conventions.md | 7 +++++++ .../internal-eclipse-osgi-3.6/javaagent/build.gradle.kts | 4 ---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/agents/knowledge/gradle-conventions.md b/.github/agents/knowledge/gradle-conventions.md index f2f6e8296e5e..bc3d11917b9a 100644 --- a/.github/agents/knowledge/gradle-conventions.md +++ b/.github/agents/knowledge/gradle-conventions.md @@ -157,6 +157,13 @@ Flag `build.gradle.kts` dependencies that appear unused or redundant: - A dependency that duplicates something already provided transitively. - A `testImplementation` dependency for a library not used in tests. +### Never declare `javaagent-bootstrap` explicitly in javaagent modules + +The `otel.javaagent-instrumentation` convention plugin already provides +`javaagent-bootstrap` on the `compileOnly` classpath transitively. Do not add +`compileOnly(project(":javaagent-bootstrap"))` to a javaagent module's +`build.gradle.kts`, and remove it if present. + ## Custom Test Tasks Every custom `Test` task registered with `val foo by registering(Test::class)` **must** include diff --git a/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/build.gradle.kts b/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/build.gradle.kts index c32b2b7fa0b7..26215202ab79 100644 --- a/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/build.gradle.kts +++ b/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/build.gradle.kts @@ -2,10 +2,6 @@ plugins { id("otel.javaagent-instrumentation") } -dependencies { - compileOnly(project(":javaagent-bootstrap")) -} - // this instrumentation applies to the class 'org.eclipse.osgi.internal.loader.BundleLoader' // which is present in the following artifacts dating back to version 3.6 (2010): // From 8081fd757e64e246edbb25f766af4e4f7ae6494e Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Sun, 26 Apr 2026 16:45:05 -0700 Subject: [PATCH 10/11] revert --- .../javahttpclient/internal/Experimental.java | 5 ++--- .../javahttpserver/internal/Experimental.java | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/Experimental.java b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/Experimental.java index d54e0c09a89f..5842c7f949cf 100644 --- a/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/Experimental.java +++ b/instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/javahttpclient/internal/Experimental.java @@ -28,9 +28,8 @@ public final class Experimental { */ public static void setEmitExperimentalTelemetry( JavaHttpClientTelemetryBuilder builder, boolean emitExperimentalTelemetry) { - BiConsumer setter = setEmitExperimentalTelemetry; - if (setter != null) { - setter.accept(builder, emitExperimentalTelemetry); + if (setEmitExperimentalTelemetry != null) { + setEmitExperimentalTelemetry.accept(builder, emitExperimentalTelemetry); } } diff --git a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/Experimental.java b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/Experimental.java index 7e2e52088424..d0e2672b2b0a 100644 --- a/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/Experimental.java +++ b/instrumentation/java-http-server/library/src/main/java/io/opentelemetry/instrumentation/javahttpserver/internal/Experimental.java @@ -28,9 +28,8 @@ public final class Experimental { */ public static void setEmitExperimentalTelemetry( JavaHttpServerTelemetryBuilder builder, boolean emitExperimentalTelemetry) { - BiConsumer setter = setEmitExperimentalTelemetry; - if (setter != null) { - setter.accept(builder, emitExperimentalTelemetry); + if (setEmitExperimentalTelemetry != null) { + setEmitExperimentalTelemetry.accept(builder, emitExperimentalTelemetry); } } From e69c44232dbeb9f97738a019031c89be87f53502 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Sun, 26 Apr 2026 17:06:21 -0700 Subject: [PATCH 11/11] revert --- .github/agents/knowledge/gradle-conventions.md | 16 +++++++++------- .../java-http-server/javaagent/build.gradle.kts | 6 ++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/agents/knowledge/gradle-conventions.md b/.github/agents/knowledge/gradle-conventions.md index bc3d11917b9a..6889335b8bb0 100644 --- a/.github/agents/knowledge/gradle-conventions.md +++ b/.github/agents/knowledge/gradle-conventions.md @@ -222,15 +222,16 @@ block, not repeated on each individual task. If a property or JVM arg is moved into `withType().configureEach`, remove any now-redundant copies from individual tasks unless a task intentionally overrides the shared value. -When the module's `build.gradle.kts` does not explicitly register additional `Test` tasks, -`tasks.test { ... }` is fine — **do not** convert it to `withType().configureEach` and -do not flag it. +**When the module has only a single test task, prefer the simple `tasks.test { ... }` form.** +Do **not** convert `tasks.test { ... }` to `withType().configureEach` in single-test-task +modules, and do **not** flag the simple form as a problem. The `withType().configureEach` +form is only justified when the same `build.gradle.kts` actually registers additional `Test` tasks. **`latestDepTest` does not count as a second test task for this rule.** It is registered implicitly by the convention plugin when `testLatestDeps` is set, and it inherits the configuration of `tasks.test`. A module with only a `tasks.test { ... }` block and no `by registering(Test::class)` declarations is a single-test-task module — leave it alone -even if `testLatestDeps = true`. +(use the simple form) even if `testLatestDeps = true`. Only consider converting to `withType().configureEach` when the **same `build.gradle.kts`** explicitly registers one or more additional `Test` tasks via @@ -268,9 +269,10 @@ review**. Only verify correctness when they are already present. When already present, verify: -- `collectMetadata` is in `withType().configureEach` (or `tasks.test` if the module - does not explicitly register additional `Test` tasks — `latestDepTest` does not count) — - never on individual tasks. +- `collectMetadata` is in `tasks.test` for single-test-task modules (preferred), or in + `withType().configureEach` for modules that explicitly register additional `Test` + tasks via `by registering(Test::class)` (`latestDepTest` does not count) — never on + individual tasks. - `metadataConfig` is on each non-default task. It may also appear on the default `test` task when that task itself runs with non-default `jvmArgs` (e.g., an experimental flag enabled module-wide via `withType().configureEach { jvmArgs(...) }`); in that case diff --git a/instrumentation/java-http-server/javaagent/build.gradle.kts b/instrumentation/java-http-server/javaagent/build.gradle.kts index fa2af2d44275..4f7bf2a2ca0a 100644 --- a/instrumentation/java-http-server/javaagent/build.gradle.kts +++ b/instrumentation/java-http-server/javaagent/build.gradle.kts @@ -13,8 +13,6 @@ dependencies { testImplementation(project(":instrumentation:java-http-server:testing")) } -tasks { - withType().configureEach { - systemProperty("collectMetadata", otelProps.collectMetadata) - } +tasks.test { + systemProperty("collectMetadata", otelProps.collectMetadata) }