From 60abb2e632076d854101b819bc5673a1b0a0de10 Mon Sep 17 00:00:00 2001 From: Mateusz Nalepa Date: Thu, 25 Sep 2025 18:59:27 +0200 Subject: [PATCH 1/2] #14768 | draft for: measure pending time in executors --- .../executors/ContextPropagatingRunnable.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/instrumentation/executors/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/executors/ContextPropagatingRunnable.java b/instrumentation/executors/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/executors/ContextPropagatingRunnable.java index 99d3bd54ddf2..496939214f16 100644 --- a/instrumentation/executors/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/executors/ContextPropagatingRunnable.java +++ b/instrumentation/executors/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/executors/ContextPropagatingRunnable.java @@ -5,9 +5,14 @@ package io.opentelemetry.javaagent.bootstrap.executors; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.metrics.DoubleHistogram; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.api.internal.ContextPropagationDebug; +import java.util.concurrent.TimeUnit; public final class ContextPropagatingRunnable implements Runnable { @@ -22,18 +27,36 @@ public static boolean shouldDecorateRunnable(Runnable task) { public static Runnable propagateContext(Runnable task, Context context) { return new ContextPropagatingRunnable(task, context); } - + private static final double NANOS_PER_S = TimeUnit.SECONDS.toNanos(1); private final Runnable delegate; private final Context context; + private final Long startObservation; + private final DoubleHistogram pendingTimeHistogram; private ContextPropagatingRunnable(Runnable delegate, Context context) { this.delegate = delegate; this.context = ContextPropagationDebug.addDebugInfo(context, delegate); + this.startObservation = System.nanoTime(); + + this.pendingTimeHistogram = + GlobalOpenTelemetry + .getMeter("thread.pending.duration") + .histogramBuilder("thread.pending.duration") + .setUnit("s") + .setDescription("Duration of HTTP client requests.") + .build(); } @Override public void run() { try (Scope ignored = context.makeCurrent()) { + pendingTimeHistogram + .record(System.nanoTime() - startObservation / NANOS_PER_S, + Attributes.of( + AttributeKey.stringKey("thread"), + Thread.currentThread().getName() + ) + ); delegate.run(); } } From 5c7160be9c538ab7df54308dd9b2b20308dec344 Mon Sep 17 00:00:00 2001 From: otelbot <197425009+otelbot@users.noreply.github.com> Date: Thu, 25 Sep 2025 17:07:55 +0000 Subject: [PATCH 2/2] ./gradlew spotlessApply --- .../executors/ContextPropagatingRunnable.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/instrumentation/executors/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/executors/ContextPropagatingRunnable.java b/instrumentation/executors/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/executors/ContextPropagatingRunnable.java index 496939214f16..136766ccdded 100644 --- a/instrumentation/executors/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/executors/ContextPropagatingRunnable.java +++ b/instrumentation/executors/bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/executors/ContextPropagatingRunnable.java @@ -27,6 +27,7 @@ public static boolean shouldDecorateRunnable(Runnable task) { public static Runnable propagateContext(Runnable task, Context context) { return new ContextPropagatingRunnable(task, context); } + private static final double NANOS_PER_S = TimeUnit.SECONDS.toNanos(1); private final Runnable delegate; private final Context context; @@ -39,8 +40,7 @@ private ContextPropagatingRunnable(Runnable delegate, Context context) { this.startObservation = System.nanoTime(); this.pendingTimeHistogram = - GlobalOpenTelemetry - .getMeter("thread.pending.duration") + GlobalOpenTelemetry.getMeter("thread.pending.duration") .histogramBuilder("thread.pending.duration") .setUnit("s") .setDescription("Duration of HTTP client requests.") @@ -50,13 +50,9 @@ private ContextPropagatingRunnable(Runnable delegate, Context context) { @Override public void run() { try (Scope ignored = context.makeCurrent()) { - pendingTimeHistogram - .record(System.nanoTime() - startObservation / NANOS_PER_S, - Attributes.of( - AttributeKey.stringKey("thread"), - Thread.currentThread().getName() - ) - ); + pendingTimeHistogram.record( + System.nanoTime() - startObservation / NANOS_PER_S, + Attributes.of(AttributeKey.stringKey("thread"), Thread.currentThread().getName())); delegate.run(); } }