MAILBOX-341 EventDeliver should report MailboxListener execution timings

Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/175f1f29
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/175f1f29
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/175f1f29

Branch: refs/heads/master
Commit: 175f1f29c95220392ae1027c1c826353355c2e61
Parents: 72bc076
Author: benwa <btell...@linagora.com>
Authored: Tue Jun 12 10:32:11 2018 +0700
Committer: benwa <btell...@linagora.com>
Committed: Wed Jun 13 09:48:48 2018 +0700

----------------------------------------------------------------------
 .../main/resources/META-INF/spring/event-system.xml   |  5 ++++-
 .../test/resources/META-INF/spring/event-alias.xml    |  2 ++
 .../store/event/AsynchronousEventDelivery.java        |  4 ++--
 .../store/event/DefaultDelegatingMailboxListener.java |  6 +++++-
 .../mailbox/store/event/SynchronousEventDelivery.java | 14 ++++++++++++++
 .../BroadcastDelegatingMailboxListener.java           |  6 +++++-
 .../RegisteredDelegatingMailboxListener.java          |  6 +++++-
 .../store/event/AsynchronousEventDeliveryTest.java    |  4 +++-
 .../mailbox/store/event/MixedEventDeliveryTest.java   | 11 +++++++----
 .../store/event/SynchronousEventDeliveryTest.java     |  3 ++-
 .../james/modules/mailbox/DefaultEventModule.java     |  8 +++++---
 11 files changed, 54 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/175f1f29/mailbox/spring/src/main/resources/META-INF/spring/event-system.xml
----------------------------------------------------------------------
diff --git a/mailbox/spring/src/main/resources/META-INF/spring/event-system.xml 
b/mailbox/spring/src/main/resources/META-INF/spring/event-system.xml
index e64f0b7..4e04252 100644
--- a/mailbox/spring/src/main/resources/META-INF/spring/event-system.xml
+++ b/mailbox/spring/src/main/resources/META-INF/spring/event-system.xml
@@ -71,12 +71,15 @@
         <constructor-arg index="0" ref="mailbox-id-deserializer"/>
     </bean>
 
-    <bean id="synchronous-event-delivery" 
class="org.apache.james.mailbox.store.event.SynchronousEventDelivery" 
lazy-init="true"/>
+    <bean id="synchronous-event-delivery" 
class="org.apache.james.mailbox.store.event.SynchronousEventDelivery" 
lazy-init="true">
+        <constructor-arg index="0" ref="metricFactory"/>
+    </bean>
 
     <bean id="event-registry" 
class="org.apache.james.mailbox.store.event.MailboxListenerRegistry"/>
 
     <bean id="asynchronous-event-delivery" 
class="org.apache.james.mailbox.store.event.AsynchronousEventDelivery" 
lazy-init="true">
         <constructor-arg index="0" ref="${event.delivery.thread.count}"/>
+        <constructor-arg index="1" ref="synchronous-event-delivery"/>
     </bean>
 
     <bean id="mixed-event-delivery" 
class="org.apache.james.mailbox.store.event.MixedEventDelivery" 
lazy-init="true">

http://git-wip-us.apache.org/repos/asf/james-project/blob/175f1f29/mailbox/spring/src/test/resources/META-INF/spring/event-alias.xml
----------------------------------------------------------------------
diff --git a/mailbox/spring/src/test/resources/META-INF/spring/event-alias.xml 
b/mailbox/spring/src/test/resources/META-INF/spring/event-alias.xml
index fb3cace..7406b84 100644
--- a/mailbox/spring/src/test/resources/META-INF/spring/event-alias.xml
+++ b/mailbox/spring/src/test/resources/META-INF/spring/event-alias.xml
@@ -29,4 +29,6 @@
         <constructor-arg index="0" ref="delegating-listener"/>
     </bean>
 
+    <bean id="metricFactory" 
class="org.apache.james.metrics.api.NoopMetricFactory"/>
+
 </beans>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/175f1f29/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/AsynchronousEventDelivery.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/AsynchronousEventDelivery.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/AsynchronousEventDelivery.java
index 98a43ab..9ca9824 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/AsynchronousEventDelivery.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/AsynchronousEventDelivery.java
@@ -32,9 +32,9 @@ public class AsynchronousEventDelivery implements 
EventDelivery {
     private final ExecutorService threadPoolExecutor;
     private final SynchronousEventDelivery synchronousEventDelivery;
 
-    public AsynchronousEventDelivery(int threadPoolSize) {
+    public AsynchronousEventDelivery(int threadPoolSize, 
SynchronousEventDelivery synchronousEventDelivery) {
         this.threadPoolExecutor = Executors.newFixedThreadPool(threadPoolSize);
-        this.synchronousEventDelivery = new SynchronousEventDelivery();
+        this.synchronousEventDelivery = synchronousEventDelivery;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/175f1f29/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListener.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListener.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListener.java
index 43a236c..a380304 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListener.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/DefaultDelegatingMailboxListener.java
@@ -28,6 +28,9 @@ import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.metrics.api.NoopMetricFactory;
+
+import com.google.common.annotations.VisibleForTesting;
 
 /**
  * Receive a {@link org.apache.james.mailbox.MailboxListener.MailboxEvent} and 
delegate it to an other
@@ -45,8 +48,9 @@ public class DefaultDelegatingMailboxListener implements 
DelegatingMailboxListen
         return ListenerType.EACH_NODE;
     }
 
+    @VisibleForTesting
     public DefaultDelegatingMailboxListener() {
-        this(new SynchronousEventDelivery(),
+        this(new SynchronousEventDelivery(new NoopMetricFactory()),
             new MailboxListenerRegistry());
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/175f1f29/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/SynchronousEventDelivery.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/SynchronousEventDelivery.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/SynchronousEventDelivery.java
index 97112de..df52819 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/SynchronousEventDelivery.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/SynchronousEventDelivery.java
@@ -19,8 +19,12 @@
 
 package org.apache.james.mailbox.store.event;
 
+import javax.inject.Inject;
+
 import org.apache.james.mailbox.Event;
 import org.apache.james.mailbox.MailboxListener;
+import org.apache.james.metrics.api.MetricFactory;
+import org.apache.james.metrics.api.TimeMetric;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -28,14 +32,24 @@ public class SynchronousEventDelivery implements 
EventDelivery {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(SynchronousEventDelivery.class);
 
+    private final MetricFactory metricFactory;
+
+    @Inject
+    public SynchronousEventDelivery(MetricFactory metricFactory) {
+        this.metricFactory = metricFactory;
+    }
+
     @Override
     public void deliver(MailboxListener mailboxListener, Event event) {
+        TimeMetric timer = metricFactory.timer("mailbox-listener-" + 
mailboxListener.getClass().getSimpleName());
         try {
             mailboxListener.event(event);
         } catch (Throwable throwable) {
             LOGGER.error("Error while processing listener {} for {}",
                     mailboxListener.getClass().getCanonicalName(), 
event.getClass().getCanonicalName(),
                     throwable);
+        } finally {
+            timer.stopAndPublish();
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/175f1f29/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/distributed/BroadcastDelegatingMailboxListener.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/distributed/BroadcastDelegatingMailboxListener.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/distributed/BroadcastDelegatingMailboxListener.java
index 74fd142..2171e80 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/distributed/BroadcastDelegatingMailboxListener.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/distributed/BroadcastDelegatingMailboxListener.java
@@ -33,9 +33,12 @@ import 
org.apache.james.mailbox.store.event.SynchronousEventDelivery;
 import org.apache.james.mailbox.store.publisher.MessageConsumer;
 import org.apache.james.mailbox.store.publisher.Publisher;
 import org.apache.james.mailbox.store.publisher.Topic;
+import org.apache.james.metrics.api.NoopMetricFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.annotations.VisibleForTesting;
+
 public class BroadcastDelegatingMailboxListener implements 
DistributedDelegatingMailboxListener {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(BroadcastDelegatingMailboxListener.class);
@@ -60,11 +63,12 @@ public class BroadcastDelegatingMailboxListener implements 
DistributedDelegating
         messageConsumer.init(this.globalTopic);
     }
 
+    @VisibleForTesting
     public BroadcastDelegatingMailboxListener(Publisher publisher,
                                               MessageConsumer messageConsumer,
                                               EventSerializer eventSerializer,
                                               String globalTopic) throws 
Exception {
-        this(publisher, messageConsumer, eventSerializer, new 
SynchronousEventDelivery(), globalTopic);
+        this(publisher, messageConsumer, eventSerializer, new 
SynchronousEventDelivery(new NoopMetricFactory()), globalTopic);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/175f1f29/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/distributed/RegisteredDelegatingMailboxListener.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/distributed/RegisteredDelegatingMailboxListener.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/distributed/RegisteredDelegatingMailboxListener.java
index 383da95..8165536 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/distributed/RegisteredDelegatingMailboxListener.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/distributed/RegisteredDelegatingMailboxListener.java
@@ -34,9 +34,12 @@ import 
org.apache.james.mailbox.store.event.SynchronousEventDelivery;
 import org.apache.james.mailbox.store.publisher.MessageConsumer;
 import org.apache.james.mailbox.store.publisher.Publisher;
 import org.apache.james.mailbox.store.publisher.Topic;
+import org.apache.james.metrics.api.NoopMetricFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.annotations.VisibleForTesting;
+
 public class RegisteredDelegatingMailboxListener implements 
DistributedDelegatingMailboxListener {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(RegisteredDelegatingMailboxListener.class);
@@ -61,11 +64,12 @@ public class RegisteredDelegatingMailboxListener implements 
DistributedDelegatin
         messageConsumer.init(mailboxPathRegister.getLocalTopic());
     }
 
+    @VisibleForTesting
     public RegisteredDelegatingMailboxListener(EventSerializer eventSerializer,
                                                Publisher publisher,
                                                MessageConsumer messageConsumer,
                                                MailboxPathRegister 
mailboxPathRegister) throws Exception {
-        this(eventSerializer, publisher, messageConsumer, mailboxPathRegister, 
new SynchronousEventDelivery());
+        this(eventSerializer, publisher, messageConsumer, mailboxPathRegister, 
new SynchronousEventDelivery(new NoopMetricFactory()));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/175f1f29/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/AsynchronousEventDeliveryTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/AsynchronousEventDeliveryTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/AsynchronousEventDeliveryTest.java
index a072bbf..1fbe4d7 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/AsynchronousEventDeliveryTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/AsynchronousEventDeliveryTest.java
@@ -28,6 +28,7 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.mock.MockMailboxSession;
+import org.apache.james.metrics.api.NoopMetricFactory;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -41,7 +42,8 @@ public class AsynchronousEventDeliveryTest {
     @Before
     public void setUp() {
         mailboxListener = mock(MailboxListener.class);
-        asynchronousEventDelivery = new AsynchronousEventDelivery(2);
+        asynchronousEventDelivery = new AsynchronousEventDelivery(2,
+            new SynchronousEventDelivery(new NoopMetricFactory()));
     }
 
     @After

http://git-wip-us.apache.org/repos/asf/james-project/blob/175f1f29/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MixedEventDeliveryTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MixedEventDeliveryTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MixedEventDeliveryTest.java
index 08dacee..5a6dc92 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MixedEventDeliveryTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MixedEventDeliveryTest.java
@@ -29,6 +29,7 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.james.mailbox.MailboxListener;
+import org.apache.james.metrics.api.NoopMetricFactory;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -44,7 +45,9 @@ public class MixedEventDeliveryTest {
     @Before
     public void setUp() {
         listener = mock(MailboxListener.class);
-        mixedEventDelivery = new MixedEventDelivery(new 
AsynchronousEventDelivery(2), new SynchronousEventDelivery());
+        SynchronousEventDelivery synchronousEventDelivery = new 
SynchronousEventDelivery(new NoopMetricFactory());
+        AsynchronousEventDelivery asynchronousEventDelivery = new 
AsynchronousEventDelivery(2, synchronousEventDelivery);
+        mixedEventDelivery = new MixedEventDelivery(asynchronousEventDelivery, 
synchronousEventDelivery);
     }
 
     @After
@@ -53,7 +56,7 @@ public class MixedEventDeliveryTest {
     }
 
     @Test
-    public void deliverShouldWorkOnSynchronousListeners() throws Exception {
+    public void deliverShouldWorkOnSynchronousListeners() {
         
when(listener.getExecutionMode()).thenReturn(MailboxListener.ExecutionMode.SYNCHRONOUS);
         MailboxListener.MailboxEvent event = new 
MailboxListener.MailboxEvent(null, null) {};
         mixedEventDelivery.deliver(listener, event);
@@ -61,7 +64,7 @@ public class MixedEventDeliveryTest {
     }
 
     @Test
-    public void deliverShouldEventuallyDeliverOnAsynchronousListeners() throws 
Exception {
+    public void deliverShouldEventuallyDeliverOnAsynchronousListeners() {
         MailboxListener.MailboxEvent event = new 
MailboxListener.MailboxEvent(null, null) {};
         
when(listener.getExecutionMode()).thenReturn(MailboxListener.ExecutionMode.ASYNCHRONOUS);
         mixedEventDelivery.deliver(listener, event);
@@ -69,7 +72,7 @@ public class MixedEventDeliveryTest {
     }
 
     @Test(timeout = ONE_MINUTE)
-    public void deliverShouldNotBlockOnAsynchronousListeners() throws 
Exception {
+    public void deliverShouldNotBlockOnAsynchronousListeners() {
         MailboxListener.MailboxEvent event = new 
MailboxListener.MailboxEvent(null, null) {};
         
when(listener.getExecutionMode()).thenReturn(MailboxListener.ExecutionMode.ASYNCHRONOUS);
         final CountDownLatch latch = new CountDownLatch(1);

http://git-wip-us.apache.org/repos/asf/james-project/blob/175f1f29/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/SynchronousEventDeliveryTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/SynchronousEventDeliveryTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/SynchronousEventDeliveryTest.java
index 5b5137a..85bc13f 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/SynchronousEventDeliveryTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/SynchronousEventDeliveryTest.java
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.verify;
 
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.mock.MockMailboxSession;
+import org.apache.james.metrics.api.NoopMetricFactory;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -36,7 +37,7 @@ public class SynchronousEventDeliveryTest {
     @Before
     public void setUp() {
         mailboxListener = mock(MailboxListener.class);
-        synchronousEventDelivery = new SynchronousEventDelivery();
+        synchronousEventDelivery = new SynchronousEventDelivery(new 
NoopMetricFactory());
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/175f1f29/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/DefaultEventModule.java
----------------------------------------------------------------------
diff --git 
a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/DefaultEventModule.java
 
b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/DefaultEventModule.java
index b788ed9..835eccc 100644
--- 
a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/DefaultEventModule.java
+++ 
b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/DefaultEventModule.java
@@ -36,6 +36,7 @@ import 
org.apache.james.mailbox.store.event.MailboxListenerRegistry;
 import org.apache.james.mailbox.store.event.MixedEventDelivery;
 import org.apache.james.mailbox.store.event.SynchronousEventDelivery;
 import org.apache.james.mailbox.store.quota.ListeningCurrentQuotaUpdater;
+import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.server.core.configuration.ConfigurationProvider;
 import org.apache.james.utils.ConfigurationPerformer;
 
@@ -69,12 +70,13 @@ public class DefaultEventModule extends AbstractModule {
 
     @Provides
     @Singleton
-    EventDelivery provideEventDelivery(ConfigurationProvider 
configurationProvider) {
+    EventDelivery provideEventDelivery(ConfigurationProvider 
configurationProvider, MetricFactory metricFactory) {
         int poolSize = retrievePoolSize(configurationProvider);
 
+        SynchronousEventDelivery synchronousEventDelivery = new 
SynchronousEventDelivery(metricFactory);
         return new MixedEventDelivery(
-            new AsynchronousEventDelivery(poolSize),
-            new SynchronousEventDelivery());
+            new AsynchronousEventDelivery(poolSize, synchronousEventDelivery),
+            synchronousEventDelivery);
     }
 
     private int retrievePoolSize(ConfigurationProvider configurationProvider) {


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to