From 5ab23f203f878b8656fb2b548f2d6a805f24f334 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Tue, 22 Mar 2022 11:45:05 -0700 Subject: [PATCH] Add InstrumenterBuilder.addRequestListener (#5655) --- .../api/instrumenter/Instrumenter.java | 5 +-- .../api/instrumenter/InstrumenterBuilder.java | 8 ++++- .../api/instrumenter/InstrumenterTest.java | 32 +++++++++++++++++++ 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/Instrumenter.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/Instrumenter.java index b76ae75536..5fc890baab 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/Instrumenter.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/Instrumenter.java @@ -232,10 +232,11 @@ public class Instrumenter { if (!requestListeners.isEmpty() || !requestMetricListeners.isEmpty()) { long endNanos = getNanos(endTime); - for (RequestListener requestListener : requestListeners) { + // TODO (trask) call end in the reverse order that start was called? + for (RequestListener requestListener : requestMetricListeners) { requestListener.end(context, attributes, endNanos); } - for (RequestListener requestListener : requestMetricListeners) { + for (RequestListener requestListener : requestListeners) { requestListener.end(context, attributes, endNanos); } } diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java index be5de6738e..6e0d044f84 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java @@ -125,7 +125,13 @@ public final class InstrumenterBuilder { return this; } - /** Adds a {@link RequestMetrics} whose metrics will be recorded for request start and stop. */ + /** Adds a {@link RequestListener} which will be called for request start and end. */ + public InstrumenterBuilder addRequestListener(RequestListener listener) { + requestListeners.add(listener); + return this; + } + + /** Adds a {@link RequestMetrics} whose metrics will be recorded for request start and end. */ @UnstableApi public InstrumenterBuilder addRequestMetrics(RequestMetrics factory) { requestMetricListeners.add(factory.create(meter)); diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterTest.java index fee146eb95..3dddb50ad2 100644 --- a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterTest.java +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterTest.java @@ -431,6 +431,38 @@ class InstrumenterTest { .hasParentSpanId("090a0b0c0d0e0f00"))); } + @Test + void requestListeners() { + AtomicReference startContext = new AtomicReference<>(); + AtomicReference endContext = new AtomicReference<>(); + + RequestListener requestListener = + new RequestListener() { + @Override + public Context start(Context context, Attributes startAttributes, long startNanos) { + startContext.set(true); + return context; + } + + @Override + public void end(Context context, Attributes endAttributes, long endNanos) { + endContext.set(true); + } + }; + + Instrumenter, Map> instrumenter = + Instrumenter., Map>builder( + otelTesting.getOpenTelemetry(), "test", unused -> "span") + .addRequestListener(requestListener) + .newServerInstrumenter(new MapGetter()); + + Context context = instrumenter.start(Context.root(), REQUEST); + instrumenter.end(context, REQUEST, RESPONSE, null); + + assertThat(startContext.get()).isTrue(); + assertThat(endContext.get()).isTrue(); + } + @Test void requestMetrics() { AtomicReference startContext = new AtomicReference<>();