diff --git a/src/main/java/io/lettuce/core/event/DefaultEventBus.java b/src/main/java/io/lettuce/core/event/DefaultEventBus.java index e94aecdcaa..257eda5404 100644 --- a/src/main/java/io/lettuce/core/event/DefaultEventBus.java +++ b/src/main/java/io/lettuce/core/event/DefaultEventBus.java @@ -33,11 +33,15 @@ public Flux get() { @Override public void publish(Event event) { - recorder.record(event); + final Event sourceEvent = (event instanceof EventRecorder.RecordableEvent) + ? ((EventRecorder.RecordableEvent) event).getSource() + : event; + + recorder.record(sourceEvent); Sinks.EmitResult emitResult; - while ((emitResult = bus.tryEmitNext(event)) == Sinks.EmitResult.FAIL_NON_SERIALIZED) { + while ((emitResult = bus.tryEmitNext(sourceEvent)) == Sinks.EmitResult.FAIL_NON_SERIALIZED) { // busy-loop } diff --git a/src/main/java/io/lettuce/core/event/jfr/EventRecorder.java b/src/main/java/io/lettuce/core/event/jfr/EventRecorder.java index 718c132018..fd2c4726a6 100644 --- a/src/main/java/io/lettuce/core/event/jfr/EventRecorder.java +++ b/src/main/java/io/lettuce/core/event/jfr/EventRecorder.java @@ -41,13 +41,18 @@ static EventRecorder getInstance() { /** * Interface defining a recordable event that is recorded on calling {@link #record()}. */ - interface RecordableEvent { + interface RecordableEvent extends Event { /** * Complete the event recording. */ void record(); + /** + * Get the source event. + */ + Event getSource(); + } } diff --git a/src/main/java/io/lettuce/core/event/jfr/JfrEventRecorder.java b/src/main/java/io/lettuce/core/event/jfr/JfrEventRecorder.java index 620e546d54..5cc96231eb 100644 --- a/src/main/java/io/lettuce/core/event/jfr/JfrEventRecorder.java +++ b/src/main/java/io/lettuce/core/event/jfr/JfrEventRecorder.java @@ -16,7 +16,7 @@ *

* JFR event forwarding tries to detect a JFR event class that is co-located with the actual event type in the same package * whose simple name is prefixed with {@code Jfr} (e.g. {@code ConnectedEvent} translates to {@code JfrConnectedEvent}). JFR - * event implementations are expected to accept the originak event type as constructor argument. Implementations can be + * event implementations are expected to accept the original event type as constructor argument. Implementations can be * package-private. * * @author Mark Paluch @@ -30,10 +30,14 @@ public void record(Event event) { LettuceAssert.notNull(event, "Event must not be null"); - jdk.jfr.Event jfrEvent = createEvent(event); + if (event instanceof RecordableEvent) { + ((RecordableEvent) event).record(); + } else { + jdk.jfr.Event jfrEvent = createEvent(event); - if (jfrEvent != null) { - jfrEvent.commit(); + if (jfrEvent != null) { + jfrEvent.commit(); + } } } @@ -42,11 +46,12 @@ public RecordableEvent start(Event event) { LettuceAssert.notNull(event, "Event must not be null"); - jdk.jfr.Event jfrEvent = createEvent(event); + JfrRecordableEvent jfrRecordableEvent = new JfrRecordableEvent(event); + jdk.jfr.Event jfrEvent = jfrRecordableEvent.getJfrEvent(); if (jfrEvent != null) { jfrEvent.begin(); - return new JfrRecordableEvent(jfrEvent); + return jfrRecordableEvent; } return NoOpEventRecorder.INSTANCE; @@ -97,12 +102,15 @@ private jdk.jfr.Event createEvent(Event event) { } } - static class JfrRecordableEvent implements RecordableEvent { + class JfrRecordableEvent implements RecordableEvent { + + private final Event sourceEvent; private final jdk.jfr.Event jfrEvent; - public JfrRecordableEvent(jdk.jfr.Event jfrEvent) { - this.jfrEvent = jfrEvent; + public JfrRecordableEvent(Event event) { + this.sourceEvent = event; + this.jfrEvent = createEvent(event); } @Override @@ -111,6 +119,15 @@ public void record() { jfrEvent.commit(); } + @Override + public Event getSource() { + return sourceEvent; + } + + public jdk.jfr.Event getJfrEvent() { + return jfrEvent; + } + } } diff --git a/src/main/java/io/lettuce/core/event/jfr/NoOpEventRecorder.java b/src/main/java/io/lettuce/core/event/jfr/NoOpEventRecorder.java index 8b5f7a9e50..f1f75b04a6 100644 --- a/src/main/java/io/lettuce/core/event/jfr/NoOpEventRecorder.java +++ b/src/main/java/io/lettuce/core/event/jfr/NoOpEventRecorder.java @@ -8,9 +8,18 @@ * @author Mark Paluch * @since 6.1 */ -enum NoOpEventRecorder implements EventRecorder, EventRecorder.RecordableEvent { +public final class NoOpEventRecorder implements EventRecorder, EventRecorder.RecordableEvent { - INSTANCE; + public final static NoOpEventRecorder INSTANCE = new NoOpEventRecorder(); + + private Event originalEvent = null; + + private NoOpEventRecorder() { + } + + public NoOpEventRecorder(Event event) { + this.originalEvent = event; + } @Override public void record(Event event) { @@ -24,7 +33,11 @@ public RecordableEvent start(Event event) { @Override public void record() { + } + @Override + public Event getSource() { + return originalEvent; } }