You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2020/02/27 08:56:37 UTC

[james-project] branch master updated (d209e76 -> 6e0f2c3)

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git.


    from d209e76  Suppress concurrent test runner logs in case of huge number of operations
     new 624fdef  JAMES-3062: EventDeadLetters containEvents()
     new a56040c  JAMES-3062: EventDeadLetters healthCheck
     new d9c64f3  JAMES-3062: EventDeadLetters healthCheck guice binding
     new c0a2ef0  JAMES-3062: EventDeadLetters healthCheck documentation
     new 6e0f2c3  JAMES-3062: EventDeadLetters healthCheck

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 CHANGELOG.md                                       |   1 +
 .../cassandra/CassandraClusterExtension.java       |   9 +-
 .../james/mailbox/events/EventDeadLetters.java     |   2 +
 .../events/EventDeadLettersHealthCheck.java        |  33 +++---
 .../mailbox/events/EventDeadLettersContract.java   |  48 ++++++++
 .../EventDeadLettersHealthCheckContract.java       | 129 +++++++++++++++++++++
 .../mailbox/events/CassandraEventDeadLetters.java  |   6 +
 .../events/CassandraEventDeadLettersDAO.java       |  12 ++
 .../events/CassandraEventDeadLettersDAOTest.java   |  40 +++++++
 ... CassandraEventDeadLettersHealthCheckTest.java} |  31 +++--
 .../events/CassandraEventDeadLettersTest.java      |   8 +-
 .../mailbox/events/MemoryEventDeadLetters.java     |   5 +
 ... => MemoryEventDeadLettersHealthCheckTest.java} |  41 ++++---
 .../mailbox/events/MemoryEventDeadLettersTest.java |   9 +-
 .../modules/mailbox/CassandraDeadLetterModule.java |   6 +
 .../modules/mailbox/MemoryDeadLetterModule.java    |   7 ++
 .../server/manage-guice-distributed-james.md       |   6 +-
 src/site/markdown/server/manage-webadmin.md        |   4 +-
 18 files changed, 334 insertions(+), 63 deletions(-)
 copy backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/CassandraHealthCheck.java => mailbox/api/src/main/java/org/apache/james/mailbox/events/EventDeadLettersHealthCheck.java (72%)
 create mode 100644 mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersHealthCheckContract.java
 copy mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/{CassandraEventDeadLettersTest.java => CassandraEventDeadLettersHealthCheckTest.java} (76%)
 copy mailbox/event/event-memory/src/test/java/org/apache/james/mailbox/events/{MemoryEventDeadLettersTest.java => MemoryEventDeadLettersHealthCheckTest.java} (56%)


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


[james-project] 02/05: JAMES-3062: EventDeadLetters healthCheck

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit a56040c7609b425980a274beee0eaeb5d2dafe19
Author: duc91 <du...@gmail.com>
AuthorDate: Fri Feb 21 16:09:00 2020 +0700

    JAMES-3062: EventDeadLetters healthCheck
---
 .../cassandra/CassandraClusterExtension.java       |   9 +-
 .../events/EventDeadLettersHealthCheck.java        |  61 ++++++++++
 .../EventDeadLettersHealthCheckContract.java       | 130 +++++++++++++++++++++
 .../CassandraEventDeadLettersHealthCheckTest.java  |  68 +++++++++++
 .../MemoryEventDeadLettersHealthCheckTest.java     |  56 +++++++++
 5 files changed, 322 insertions(+), 2 deletions(-)

diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraClusterExtension.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraClusterExtension.java
index d9f24ba..5eb5599 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraClusterExtension.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraClusterExtension.java
@@ -76,12 +76,17 @@ public class CassandraClusterExtension implements BeforeAllCallback, BeforeEachC
 
     @Override
     public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return (parameterContext.getParameter().getType() == CassandraCluster.class);
+        return parameterContext.getParameter().getType() == CassandraCluster.class
+            || parameterContext.getParameter().getType() == DockerCassandra.class;
     }
 
     @Override
     public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return cassandraCluster;
+        if (parameterContext.getParameter().getType() == CassandraCluster.class) {
+            return cassandraCluster;
+        }
+
+        return DockerCassandraSingleton.singleton;
     }
 
     public CassandraCluster getCassandraCluster() {
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventDeadLettersHealthCheck.java b/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventDeadLettersHealthCheck.java
new file mode 100644
index 0000000..2d20af9
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventDeadLettersHealthCheck.java
@@ -0,0 +1,61 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.events;
+
+import javax.inject.Inject;
+
+import org.apache.james.core.healthcheck.ComponentName;
+import org.apache.james.core.healthcheck.HealthCheck;
+import org.apache.james.core.healthcheck.Result;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class EventDeadLettersHealthCheck implements HealthCheck {
+    private static final Logger LOGGER = LoggerFactory.getLogger(EventDeadLettersHealthCheck.class);
+    private static final ComponentName COMPONENT_NAME = new ComponentName("EventDeadLettersHealthCheck");
+
+    private final EventDeadLetters eventDeadLetters;
+
+    @Inject
+    EventDeadLettersHealthCheck(EventDeadLetters eventDeadLetters) {
+        this.eventDeadLetters = eventDeadLetters;
+    }
+
+    @Override
+    public ComponentName componentName() {
+        return COMPONENT_NAME;
+    }
+
+    @Override
+    public Result check() {
+        try {
+            boolean containEvents = eventDeadLetters.containEvents().block();
+
+            if (containEvents) {
+                return Result.degraded(COMPONENT_NAME, "EventDeadLetters contain events. This might indicate transient failure on mailbox event processing.");
+            }
+
+            return Result.healthy(COMPONENT_NAME);
+        } catch (Exception e) {
+            LOGGER.error("Error checking EventDeadLettersHealthCheck", e);
+            return Result.unhealthy(COMPONENT_NAME, e.getMessage());
+        }
+    }
+}
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersHealthCheckContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersHealthCheckContract.java
new file mode 100644
index 0000000..cc7346c
--- /dev/null
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersHealthCheckContract.java
@@ -0,0 +1,130 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.events;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.james.core.Username;
+import org.apache.james.core.healthcheck.ComponentName;
+import org.apache.james.core.healthcheck.Result;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.model.MailboxConstants;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.model.TestId;
+import org.junit.jupiter.api.Test;
+
+interface EventDeadLettersHealthCheckContract {
+
+    ComponentName COMPONENT_NAME = new ComponentName("EventDeadLettersHealthCheck");
+
+    Username USERNAME = Username.of("user");
+    MailboxPath MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, USERNAME, "mailboxName");
+    MailboxSession.SessionId SESSION_ID = MailboxSession.SessionId.of(235);
+    TestId MAILBOX_ID = TestId.of(563);
+    Event.EventId EVENT_ID_1 = Event.EventId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b4");
+    Event.EventId EVENT_ID_2 = Event.EventId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b5");
+    MailboxListener.MailboxAdded EVENT_1 = new MailboxListener.MailboxAdded(SESSION_ID, USERNAME, MAILBOX_PATH, MAILBOX_ID, EVENT_ID_1);
+    MailboxListener.MailboxAdded EVENT_2 = new MailboxListener.MailboxAdded(SESSION_ID, USERNAME, MAILBOX_PATH, MAILBOX_ID, EVENT_ID_2);
+    EventDeadLetters.InsertionId INSERTION_ID_1 = EventDeadLetters.InsertionId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b7");
+    EventDeadLetters.InsertionId INSERTION_ID_2 = EventDeadLetters.InsertionId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b8");
+
+    Group GROUP_A = new EventBusTestFixture.GroupA();
+    Group GROUP_B = new EventBusTestFixture.GroupB();
+
+    EventDeadLettersHealthCheck testee();
+
+    EventDeadLetters eventDeadLetters();
+
+    void createErrorWhenDoingHealthCheck();
+
+    void resolveErrorWhenDoingHealthCheck();
+
+    @Test
+    default void checkShouldReturnHealthyWhenEventDeadLetterEmpty() {
+        assertThat(testee().check().isHealthy()).isTrue();
+        assertThat(testee().check())
+            .isEqualTo(Result.healthy(COMPONENT_NAME));
+    }
+
+    @Test
+    default void checkShouldReturnDegradedWhenEventDeadLetterContainEvent() {
+        eventDeadLetters().store(GROUP_A, EVENT_1, INSERTION_ID_1).block();
+
+        assertThat(testee().check().isDegraded()).isTrue();
+        assertThat(testee().check())
+            .isEqualTo(Result.degraded(COMPONENT_NAME, "EventDeadLetters contain events"));
+    }
+
+    @Test
+    default void checkShouldReturnDegradedWhenEventDeadLetterContainEvents() {
+        eventDeadLetters().store(GROUP_A, EVENT_1, INSERTION_ID_1).block();
+        eventDeadLetters().store(GROUP_B, EVENT_2, INSERTION_ID_2).block();
+
+        assertThat(testee().check().isDegraded()).isTrue();
+        assertThat(testee().check())
+            .isEqualTo(Result.degraded(COMPONENT_NAME, "EventDeadLetters contain events"));
+    }
+
+    @Test
+    default void checkShouldReturnHealthyWhenRemovedAllEventDeadLetters() {
+        eventDeadLetters().store(GROUP_A, EVENT_1, INSERTION_ID_1).block();
+        eventDeadLetters().store(GROUP_B, EVENT_2, INSERTION_ID_2).block();
+
+        assertThat(testee().check().isDegraded()).isTrue();
+        assertThat(testee().check())
+            .isEqualTo(Result.degraded(COMPONENT_NAME, "EventDeadLetters contain events"));
+
+        eventDeadLetters().remove(GROUP_A, INSERTION_ID_1).block();
+        eventDeadLetters().remove(GROUP_B, INSERTION_ID_2).block();
+
+        assertThat(testee().check().isHealthy()).isTrue();
+        assertThat(testee().check())
+            .isEqualTo(Result.healthy(COMPONENT_NAME));
+    }
+
+    @Test
+    default void checkShouldReturnDegradedWhenRemovedSomeEventDeadLetters() {
+        eventDeadLetters().store(GROUP_A, EVENT_1, INSERTION_ID_1).block();
+        eventDeadLetters().store(GROUP_B, EVENT_2, INSERTION_ID_2).block();
+
+        assertThat(testee().check().isDegraded()).isTrue();
+        assertThat(testee().check())
+            .isEqualTo(Result.degraded(COMPONENT_NAME, "EventDeadLetters contain events"));
+
+        eventDeadLetters().remove(GROUP_A, INSERTION_ID_1).block();
+
+        assertThat(testee().check().isDegraded()).isTrue();
+        assertThat(testee().check())
+            .isEqualTo(Result.degraded(COMPONENT_NAME, "EventDeadLetters contain events"));
+    }
+
+    @Test
+    default void checkShouldReturnUnHealthyWhenEventDeadLetterError() {
+        Result actualResult;
+        try {
+            createErrorWhenDoingHealthCheck();
+            actualResult = testee().check();
+        } finally {
+            resolveErrorWhenDoingHealthCheck();
+        }
+
+        assertThat(actualResult.isUnHealthy()).isTrue();
+    }
+}
diff --git a/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersHealthCheckTest.java b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersHealthCheckTest.java
new file mode 100644
index 0000000..cd8e7db
--- /dev/null
+++ b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersHealthCheckTest.java
@@ -0,0 +1,68 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.events;
+
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.DockerCassandra;
+import org.apache.james.event.json.EventSerializer;
+import org.apache.james.mailbox.model.TestId;
+import org.apache.james.mailbox.model.TestMessageId;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+
+class CassandraEventDeadLettersHealthCheckTest implements EventDeadLettersHealthCheckContract {
+    @RegisterExtension
+    static CassandraClusterExtension cassandraClusterExtension = new CassandraClusterExtension(CassandraEventDeadLettersModule.MODULE);
+    private EventDeadLettersHealthCheck testee;
+    private CassandraEventDeadLetters eventDeadLetters;
+    private DockerCassandra dockerCassandra;
+
+    @BeforeEach
+    void setUp(CassandraCluster cassandraCluster, DockerCassandra dockerCassandra) {
+        EventSerializer eventSerializer = new EventSerializer(new TestId.Factory(), new TestMessageId.Factory(), new DefaultUserQuotaRootResolver.DefaultQuotaRootDeserializer());
+        eventDeadLetters = new CassandraEventDeadLetters(new CassandraEventDeadLettersDAO(cassandraCluster.getConf(), eventSerializer),
+                                                         new CassandraEventDeadLettersGroupDAO(cassandraCluster.getConf()));
+        testee = new EventDeadLettersHealthCheck(eventDeadLetters);
+        this.dockerCassandra = dockerCassandra;
+    }
+
+    @Override
+    public EventDeadLettersHealthCheck testee() {
+        return testee;
+    }
+
+    @Override
+    public EventDeadLetters eventDeadLetters() {
+        return eventDeadLetters;
+    }
+
+    @Override
+    public void createErrorWhenDoingHealthCheck() {
+        dockerCassandra.pause();
+    }
+
+    @Override
+    public void resolveErrorWhenDoingHealthCheck() {
+        dockerCassandra.unpause();
+    }
+}
diff --git a/mailbox/event/event-memory/src/test/java/org/apache/james/mailbox/events/MemoryEventDeadLettersHealthCheckTest.java b/mailbox/event/event-memory/src/test/java/org/apache/james/mailbox/events/MemoryEventDeadLettersHealthCheckTest.java
new file mode 100644
index 0000000..e6275ee
--- /dev/null
+++ b/mailbox/event/event-memory/src/test/java/org/apache/james/mailbox/events/MemoryEventDeadLettersHealthCheckTest.java
@@ -0,0 +1,56 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.events;
+
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+public class MemoryEventDeadLettersHealthCheckTest implements EventDeadLettersHealthCheckContract {
+
+    private MemoryEventDeadLetters eventDeadLetters = new MemoryEventDeadLetters();
+    private EventDeadLettersHealthCheck testee = new EventDeadLettersHealthCheck(eventDeadLetters);
+
+    @Override
+    public EventDeadLettersHealthCheck testee() {
+        return testee;
+    }
+
+    @Override
+    public EventDeadLetters eventDeadLetters() {
+        return eventDeadLetters;
+    }
+
+    @Override
+    public void createErrorWhenDoingHealthCheck() {
+
+    }
+
+    @Override
+    public void resolveErrorWhenDoingHealthCheck() {
+        // Unable to trigger the EventDeadLetter error with memory version
+    }
+
+    @Override
+    @Test
+    @Disabled("Unable to trigger the EventDeadLetter error with memory version")
+    public void checkShouldReturnUnHealthyWhenEventDeadLetterError() {
+
+    }
+}


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


[james-project] 05/05: JAMES-3062: EventDeadLetters healthCheck

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 6e0f2c3f16858bbf39a1f5c81c31b15f0b06cb54
Author: duc91 <du...@gmail.com>
AuthorDate: Tue Feb 25 10:37:16 2020 +0700

    JAMES-3062: EventDeadLetters healthCheck
---
 .../apache/james/mailbox/events/EventDeadLettersContract.java |  2 +-
 .../mailbox/events/EventDeadLettersHealthCheckContract.java   | 11 ++++++-----
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
index 4ee51ec..ebbbdbc 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
@@ -459,7 +459,7 @@ interface EventDeadLettersContract {
         default void containEventsShouldReturnFalseWhenRemoveAllStoredEvents() {
             EventDeadLetters eventDeadLetters = eventDeadLetters();
             EventDeadLetters.InsertionId insertionId1 = eventDeadLetters().store(GROUP_A, EVENT_1).block();
-            EventDeadLetters.InsertionId insertionId2 = eventDeadLetters().store(GROUP_B, EVENT_2).block();
+            EventDeadLetters.InsertionId insertionId2 = eventDeadLetters().store(GROUP_A, EVENT_2).block();
 
             assertThat(eventDeadLetters.containEvents().block()).isTrue();
 
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersHealthCheckContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersHealthCheckContract.java
index 80a3147..6d1c49c 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersHealthCheckContract.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersHealthCheckContract.java
@@ -33,6 +33,7 @@ import org.junit.jupiter.api.Test;
 interface EventDeadLettersHealthCheckContract {
 
     ComponentName COMPONENT_NAME = new ComponentName("EventDeadLettersHealthCheck");
+    String EXPECTED_DEGRADED_MESSAGE = "EventDeadLetters contain events. This might indicate transient failure on mailbox event processing.";
 
     Username USERNAME = Username.of("user");
     MailboxPath MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, USERNAME, "mailboxName");
@@ -67,7 +68,7 @@ interface EventDeadLettersHealthCheckContract {
 
         assertThat(testee().check().isDegraded()).isTrue();
         assertThat(testee().check())
-            .isEqualTo(Result.degraded(COMPONENT_NAME, "EventDeadLetters contain events"));
+            .isEqualTo(Result.degraded(COMPONENT_NAME, EXPECTED_DEGRADED_MESSAGE));
     }
 
     @Test
@@ -77,7 +78,7 @@ interface EventDeadLettersHealthCheckContract {
 
         assertThat(testee().check().isDegraded()).isTrue();
         assertThat(testee().check())
-            .isEqualTo(Result.degraded(COMPONENT_NAME, "EventDeadLetters contain events"));
+            .isEqualTo(Result.degraded(COMPONENT_NAME, EXPECTED_DEGRADED_MESSAGE));
     }
 
     @Test
@@ -87,7 +88,7 @@ interface EventDeadLettersHealthCheckContract {
 
         assertThat(testee().check().isDegraded()).isTrue();
         assertThat(testee().check())
-            .isEqualTo(Result.degraded(COMPONENT_NAME, "EventDeadLetters contain events"));
+            .isEqualTo(Result.degraded(COMPONENT_NAME, EXPECTED_DEGRADED_MESSAGE));
 
         eventDeadLetters().remove(GROUP_A, insertionId1).block();
         eventDeadLetters().remove(GROUP_B, insertionId2).block();
@@ -104,13 +105,13 @@ interface EventDeadLettersHealthCheckContract {
 
         assertThat(testee().check().isDegraded()).isTrue();
         assertThat(testee().check())
-            .isEqualTo(Result.degraded(COMPONENT_NAME, "EventDeadLetters contain events"));
+            .isEqualTo(Result.degraded(COMPONENT_NAME, EXPECTED_DEGRADED_MESSAGE));
 
         eventDeadLetters().remove(GROUP_A, insertionId1).block();
 
         assertThat(testee().check().isDegraded()).isTrue();
         assertThat(testee().check())
-            .isEqualTo(Result.degraded(COMPONENT_NAME, "EventDeadLetters contain events"));
+            .isEqualTo(Result.degraded(COMPONENT_NAME, EXPECTED_DEGRADED_MESSAGE));
     }
 
     @Test


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


[james-project] 01/05: JAMES-3062: EventDeadLetters containEvents()

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 624fdef9818f71bc1cd4172592da2a505e298503
Author: duc91 <du...@gmail.com>
AuthorDate: Fri Feb 21 16:08:23 2020 +0700

    JAMES-3062: EventDeadLetters containEvents()
---
 .../james/mailbox/events/EventDeadLetters.java     |  2 +
 .../mailbox/events/EventDeadLettersContract.java   | 48 ++++++++++++++++++++++
 .../mailbox/events/CassandraEventDeadLetters.java  |  6 +++
 .../events/CassandraEventDeadLettersDAO.java       | 12 ++++++
 .../events/CassandraEventDeadLettersDAOTest.java   | 40 ++++++++++++++++++
 .../events/CassandraEventDeadLettersTest.java      |  8 +---
 .../mailbox/events/MemoryEventDeadLetters.java     |  5 +++
 .../mailbox/events/MemoryEventDeadLettersTest.java |  9 +---
 8 files changed, 115 insertions(+), 15 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventDeadLetters.java b/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventDeadLetters.java
index 0e1c805..053ba45 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventDeadLetters.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventDeadLetters.java
@@ -95,4 +95,6 @@ public interface EventDeadLetters {
     Flux<InsertionId> failedIds(Group registeredGroup);
 
     Flux<Group> groupsWithFailedEvents();
+
+    Mono<Boolean> containEvents();
 }
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
index 74cc2f2..5929c11 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
@@ -438,4 +438,52 @@ interface EventDeadLettersContract {
             assertThat(eventDeadLetters.groupsWithFailedEvents().toStream()).isEmpty();
         }
     }
+
+    interface ContainEventsContract extends EventDeadLettersContract {
+        @Test
+        default void containEventsShouldReturnFalseOnNothingStored() {
+            EventDeadLetters eventDeadLetters = eventDeadLetters();
+
+            assertThat(eventDeadLetters.containEvents().block()).isFalse();
+        }
+
+        @Test
+        default void containEventsShouldReturnTrueOnStoredEvents() {
+            EventDeadLetters eventDeadLetters = eventDeadLetters();
+            eventDeadLetters.store(GROUP_A, EVENT_1, INSERTION_ID_1).block();
+
+            assertThat(eventDeadLetters.containEvents().block()).isTrue();
+        }
+
+        @Test
+        default void containEventsShouldReturnFalseWhenRemoveAllStoredEvents() {
+            EventDeadLetters eventDeadLetters = eventDeadLetters();
+            eventDeadLetters.store(GROUP_A, EVENT_1, INSERTION_ID_1).block();
+            eventDeadLetters.store(GROUP_A, EVENT_2, INSERTION_ID_2).block();
+
+            assertThat(eventDeadLetters.containEvents().block()).isTrue();
+
+            eventDeadLetters.remove(GROUP_A, INSERTION_ID_1).block();
+            eventDeadLetters.remove(GROUP_A, INSERTION_ID_2).block();
+
+            assertThat(eventDeadLetters.containEvents().block()).isFalse();
+        }
+
+        @Test
+        default void containEventsShouldReturnTrueWhenRemoveSomeStoredEvents() {
+            EventDeadLetters eventDeadLetters = eventDeadLetters();
+            eventDeadLetters.store(GROUP_A, EVENT_1, INSERTION_ID_1).block();
+            eventDeadLetters.store(GROUP_A, EVENT_2, INSERTION_ID_2).block();
+
+            assertThat(eventDeadLetters.containEvents().block()).isTrue();
+
+            eventDeadLetters.remove(GROUP_A, INSERTION_ID_1).block();
+
+            assertThat(eventDeadLetters.containEvents().block()).isTrue();
+        }
+    }
+
+    interface AllContracts extends StoreContract, RemoveContract, FailedEventContract, FailedEventsContract, GroupsWithFailedEventsContract, ContainEventsContract {
+
+    }
 }
\ No newline at end of file
diff --git a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLetters.java b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLetters.java
index 920168c..97e4a8e 100644
--- a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLetters.java
+++ b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLetters.java
@@ -31,6 +31,7 @@ public class CassandraEventDeadLetters implements EventDeadLetters {
     private final CassandraEventDeadLettersDAO cassandraEventDeadLettersDAO;
     private final CassandraEventDeadLettersGroupDAO cassandraEventDeadLettersGroupDAO;
 
+
     @Inject
     CassandraEventDeadLetters(CassandraEventDeadLettersDAO cassandraEventDeadLettersDAO,
                               CassandraEventDeadLettersGroupDAO cassandraEventDeadLettersGroupDAO) {
@@ -76,4 +77,9 @@ public class CassandraEventDeadLetters implements EventDeadLetters {
     public Flux<Group> groupsWithFailedEvents() {
         return cassandraEventDeadLettersGroupDAO.retrieveAllGroups();
     }
+
+    @Override
+    public Mono<Boolean> containEvents() {
+        return cassandraEventDeadLettersDAO.containEvents();
+    }
 }
diff --git a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java
index 0afe2ba..d9913ad 100644
--- a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java
+++ b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java
@@ -47,6 +47,7 @@ public class CassandraEventDeadLettersDAO {
     private final PreparedStatement deleteStatement;
     private final PreparedStatement selectEventStatement;
     private final PreparedStatement selectEventIdsWithGroupStatement;
+    private final PreparedStatement containEventsStatement;
 
     @Inject
     CassandraEventDeadLettersDAO(Session session, EventSerializer eventSerializer) {
@@ -56,6 +57,7 @@ public class CassandraEventDeadLettersDAO {
         this.deleteStatement = prepareDeleteStatement(session);
         this.selectEventStatement = prepareSelectEventStatement(session);
         this.selectEventIdsWithGroupStatement = prepareSelectInsertionIdsWithGroupStatement(session);
+        this.containEventsStatement = prepareContainEventStatement(session);
     }
 
     private PreparedStatement prepareInsertStatement(Session session) {
@@ -85,6 +87,12 @@ public class CassandraEventDeadLettersDAO {
             .where(eq(GROUP, bindMarker(GROUP))));
     }
 
+    private PreparedStatement prepareContainEventStatement(Session session) {
+        return session.prepare(select(EVENT)
+            .from(TABLE_NAME)
+            .limit(1));
+    }
+
     Mono<Void> store(Group group, Event failedEvent, EventDeadLetters.InsertionId insertionId) {
         return executor.executeVoid(insertStatement.bind()
                 .setString(GROUP, group.asString())
@@ -111,6 +119,10 @@ public class CassandraEventDeadLettersDAO {
             .map(row -> EventDeadLetters.InsertionId.of(row.getUUID(INSERTION_ID)));
     }
 
+    Mono<Boolean> containEvents() {
+        return executor.executeReturnExists(containEventsStatement.bind().setFetchSize(1));
+    }
+
     private Event deserializeEvent(String serializedEvent) {
         return eventSerializer.fromJson(serializedEvent).get();
     }
diff --git a/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAOTest.java b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAOTest.java
index 729c671..35ab39f 100644
--- a/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAOTest.java
+++ b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAOTest.java
@@ -102,4 +102,44 @@ class CassandraEventDeadLettersDAOTest {
                 .collectList().block())
             .containsOnly(INSERTION_ID_1, INSERTION_ID_2, INSERTION_ID_3);
     }
+
+    @Test
+    void shouldReturnTrueWhenEventStored() {
+        cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_1, INSERTION_ID_1).block();
+        assertThat(cassandraEventDeadLettersDAO.containEvents().block()).isTrue();
+    }
+
+    @Test
+    void shouldReturnTrueWhenNoEventStored() {
+        assertThat(cassandraEventDeadLettersDAO.containEvents().block()).isFalse();
+    }
+
+    @Test
+    void shouldReturnTrueWhenEventsStoredAndRemovedSome() {
+        cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_1, INSERTION_ID_1).block();
+        cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_1, INSERTION_ID_2).block();
+        cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_1, INSERTION_ID_3).block();
+
+        assertThat(cassandraEventDeadLettersDAO.containEvents().block()).isTrue();
+
+        cassandraEventDeadLettersDAO.removeEvent(GROUP_B, INSERTION_ID_3).block();
+
+        assertThat(cassandraEventDeadLettersDAO.containEvents().block()).isTrue();
+    }
+
+    @Test
+    void shouldReturnFalseWhenRemovedAllEventsStored() {
+        cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_1, INSERTION_ID_1).block();
+        cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_1, INSERTION_ID_2).block();
+        cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_1, INSERTION_ID_3).block();
+
+        assertThat(cassandraEventDeadLettersDAO.containEvents().block()).isTrue();
+
+        cassandraEventDeadLettersDAO.removeEvent(GROUP_B, INSERTION_ID_3).block();
+        cassandraEventDeadLettersDAO.removeEvent(GROUP_B, INSERTION_ID_2).block();
+        cassandraEventDeadLettersDAO.removeEvent(GROUP_B, INSERTION_ID_1).block();
+
+        assertThat(cassandraEventDeadLettersDAO.containEvents().block()).isFalse();
+    }
+
 }
diff --git a/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java
index fce1ee7..9930e9f 100644
--- a/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java
+++ b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java
@@ -22,19 +22,13 @@ package org.apache.james.mailbox.events;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.event.json.EventSerializer;
-import org.apache.james.mailbox.events.EventDeadLettersContract.FailedEventContract;
-import org.apache.james.mailbox.events.EventDeadLettersContract.FailedEventsContract;
-import org.apache.james.mailbox.events.EventDeadLettersContract.GroupsWithFailedEventsContract;
-import org.apache.james.mailbox.events.EventDeadLettersContract.RemoveContract;
-import org.apache.james.mailbox.events.EventDeadLettersContract.StoreContract;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-class CassandraEventDeadLettersTest implements StoreContract, RemoveContract, FailedEventContract, FailedEventsContract,
-    GroupsWithFailedEventsContract {
+class CassandraEventDeadLettersTest implements EventDeadLettersContract.AllContracts {
 
     @RegisterExtension
     static CassandraClusterExtension cassandraClusterExtension = new CassandraClusterExtension(CassandraEventDeadLettersModule.MODULE);
diff --git a/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java b/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java
index 3c8f423..cbf37ab 100644
--- a/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java
+++ b/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java
@@ -83,4 +83,9 @@ public class MemoryEventDeadLetters implements EventDeadLetters {
             return Flux.fromIterable(ImmutableList.copyOf(deadLetters.rowKeySet()));
         }
     }
+
+    @Override
+    public Mono<Boolean> containEvents() {
+        return Mono.just(deadLetters.size() > 0);
+    }
 }
diff --git a/mailbox/event/event-memory/src/test/java/org/apache/james/mailbox/events/MemoryEventDeadLettersTest.java b/mailbox/event/event-memory/src/test/java/org/apache/james/mailbox/events/MemoryEventDeadLettersTest.java
index ab2c8a4..2ef0996 100644
--- a/mailbox/event/event-memory/src/test/java/org/apache/james/mailbox/events/MemoryEventDeadLettersTest.java
+++ b/mailbox/event/event-memory/src/test/java/org/apache/james/mailbox/events/MemoryEventDeadLettersTest.java
@@ -19,16 +19,9 @@
 
 package org.apache.james.mailbox.events;
 
-import static org.apache.james.mailbox.events.EventDeadLettersContract.FailedEventContract;
-import static org.apache.james.mailbox.events.EventDeadLettersContract.FailedEventsContract;
-import static org.apache.james.mailbox.events.EventDeadLettersContract.GroupsWithFailedEventsContract;
-import static org.apache.james.mailbox.events.EventDeadLettersContract.RemoveContract;
-import static org.apache.james.mailbox.events.EventDeadLettersContract.StoreContract;
-
 import org.junit.jupiter.api.BeforeEach;
 
-class MemoryEventDeadLettersTest implements StoreContract, RemoveContract, FailedEventContract, FailedEventsContract,
-    GroupsWithFailedEventsContract {
+class MemoryEventDeadLettersTest implements EventDeadLettersContract.AllContracts {
 
     private MemoryEventDeadLetters eventDeadLetters;
 


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


[james-project] 03/05: JAMES-3062: EventDeadLetters healthCheck guice binding

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit d9c64f3b7deb17a23a0ae4943bcbc6c634d5176a
Author: duc91 <du...@gmail.com>
AuthorDate: Fri Feb 21 16:09:28 2020 +0700

    JAMES-3062: EventDeadLetters healthCheck guice binding
---
 .../apache/james/modules/mailbox/CassandraDeadLetterModule.java    | 6 ++++++
 .../org/apache/james/modules/mailbox/MemoryDeadLetterModule.java   | 7 +++++++
 2 files changed, 13 insertions(+)

diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraDeadLetterModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraDeadLetterModule.java
index ae1bac4..786cfef 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraDeadLetterModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraDeadLetterModule.java
@@ -20,11 +20,13 @@
 package org.apache.james.modules.mailbox;
 
 import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.core.healthcheck.HealthCheck;
 import org.apache.james.mailbox.events.CassandraEventDeadLetters;
 import org.apache.james.mailbox.events.CassandraEventDeadLettersDAO;
 import org.apache.james.mailbox.events.CassandraEventDeadLettersGroupDAO;
 import org.apache.james.mailbox.events.CassandraEventDeadLettersModule;
 import org.apache.james.mailbox.events.EventDeadLetters;
+import org.apache.james.mailbox.events.EventDeadLettersHealthCheck;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Scopes;
@@ -42,5 +44,9 @@ public class CassandraDeadLetterModule extends AbstractModule {
         Multibinder.newSetBinder(binder(), CassandraModule.class)
             .addBinding()
             .toInstance(CassandraEventDeadLettersModule.MODULE);
+
+        Multibinder.newSetBinder(binder(), HealthCheck.class)
+            .addBinding()
+            .to(EventDeadLettersHealthCheck.class);
     }
 }
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MemoryDeadLetterModule.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MemoryDeadLetterModule.java
index 5bab450..588161f 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MemoryDeadLetterModule.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MemoryDeadLetterModule.java
@@ -19,16 +19,23 @@
 
 package org.apache.james.modules.mailbox;
 
+import org.apache.james.core.healthcheck.HealthCheck;
 import org.apache.james.mailbox.events.EventDeadLetters;
+import org.apache.james.mailbox.events.EventDeadLettersHealthCheck;
 import org.apache.james.mailbox.events.MemoryEventDeadLetters;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Scopes;
+import com.google.inject.multibindings.Multibinder;
 
 public class MemoryDeadLetterModule extends AbstractModule {
     @Override
     protected void configure() {
         bind(MemoryEventDeadLetters.class).in(Scopes.SINGLETON);
         bind(EventDeadLetters.class).to(MemoryEventDeadLetters.class);
+
+        Multibinder.newSetBinder(binder(), HealthCheck.class)
+            .addBinding()
+            .to(EventDeadLettersHealthCheck.class);
     }
 }


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


[james-project] 04/05: JAMES-3062: EventDeadLetters healthCheck documentation

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit c0a2ef0185e29c852b252aeed6afa3ff391138e4
Author: duc91 <du...@gmail.com>
AuthorDate: Fri Feb 21 16:10:12 2020 +0700

    JAMES-3062: EventDeadLetters healthCheck documentation
---
 CHANGELOG.md                                       |  1 +
 .../mailbox/events/EventDeadLettersContract.java   | 16 ++++++++--------
 .../EventDeadLettersHealthCheckContract.java       | 22 ++++++++++------------
 .../events/CassandraEventDeadLettersDAO.java       |  2 +-
 .../mailbox/events/MemoryEventDeadLetters.java     |  2 +-
 .../MemoryEventDeadLettersHealthCheckTest.java     |  5 +++--
 .../server/manage-guice-distributed-james.md       |  6 +++---
 src/site/markdown/server/manage-webadmin.md        |  4 +++-
 8 files changed, 30 insertions(+), 28 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 93c2163..273bdaa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,7 @@ of tasks being currently executed.
 - JAMES-2904 Authentication and SSL support for Cassandra backend
 - JAMES-2904 Authentication and SSL support for ElasticSearch backend
 - JAMES-3066 Add "allowed From headers" webadmin endpoint
+- JAMES-3062 EventDeadLettersHealthCheck
 
 ### Changed
 - Multiple changes have been made to enhance ElasticSearch performance:
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
index 5929c11..4ee51ec 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
@@ -450,7 +450,7 @@ interface EventDeadLettersContract {
         @Test
         default void containEventsShouldReturnTrueOnStoredEvents() {
             EventDeadLetters eventDeadLetters = eventDeadLetters();
-            eventDeadLetters.store(GROUP_A, EVENT_1, INSERTION_ID_1).block();
+            eventDeadLetters.store(GROUP_A, EVENT_1).block();
 
             assertThat(eventDeadLetters.containEvents().block()).isTrue();
         }
@@ -458,13 +458,13 @@ interface EventDeadLettersContract {
         @Test
         default void containEventsShouldReturnFalseWhenRemoveAllStoredEvents() {
             EventDeadLetters eventDeadLetters = eventDeadLetters();
-            eventDeadLetters.store(GROUP_A, EVENT_1, INSERTION_ID_1).block();
-            eventDeadLetters.store(GROUP_A, EVENT_2, INSERTION_ID_2).block();
+            EventDeadLetters.InsertionId insertionId1 = eventDeadLetters().store(GROUP_A, EVENT_1).block();
+            EventDeadLetters.InsertionId insertionId2 = eventDeadLetters().store(GROUP_B, EVENT_2).block();
 
             assertThat(eventDeadLetters.containEvents().block()).isTrue();
 
-            eventDeadLetters.remove(GROUP_A, INSERTION_ID_1).block();
-            eventDeadLetters.remove(GROUP_A, INSERTION_ID_2).block();
+            eventDeadLetters.remove(GROUP_A, insertionId1).block();
+            eventDeadLetters.remove(GROUP_A, insertionId2).block();
 
             assertThat(eventDeadLetters.containEvents().block()).isFalse();
         }
@@ -472,12 +472,12 @@ interface EventDeadLettersContract {
         @Test
         default void containEventsShouldReturnTrueWhenRemoveSomeStoredEvents() {
             EventDeadLetters eventDeadLetters = eventDeadLetters();
-            eventDeadLetters.store(GROUP_A, EVENT_1, INSERTION_ID_1).block();
-            eventDeadLetters.store(GROUP_A, EVENT_2, INSERTION_ID_2).block();
+            EventDeadLetters.InsertionId insertionId1 = eventDeadLetters().store(GROUP_A, EVENT_1).block();
+            eventDeadLetters().store(GROUP_B, EVENT_2).block();
 
             assertThat(eventDeadLetters.containEvents().block()).isTrue();
 
-            eventDeadLetters.remove(GROUP_A, INSERTION_ID_1).block();
+            eventDeadLetters.remove(GROUP_A, insertionId1).block();
 
             assertThat(eventDeadLetters.containEvents().block()).isTrue();
         }
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersHealthCheckContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersHealthCheckContract.java
index cc7346c..80a3147 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersHealthCheckContract.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersHealthCheckContract.java
@@ -42,8 +42,6 @@ interface EventDeadLettersHealthCheckContract {
     Event.EventId EVENT_ID_2 = Event.EventId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b5");
     MailboxListener.MailboxAdded EVENT_1 = new MailboxListener.MailboxAdded(SESSION_ID, USERNAME, MAILBOX_PATH, MAILBOX_ID, EVENT_ID_1);
     MailboxListener.MailboxAdded EVENT_2 = new MailboxListener.MailboxAdded(SESSION_ID, USERNAME, MAILBOX_PATH, MAILBOX_ID, EVENT_ID_2);
-    EventDeadLetters.InsertionId INSERTION_ID_1 = EventDeadLetters.InsertionId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b7");
-    EventDeadLetters.InsertionId INSERTION_ID_2 = EventDeadLetters.InsertionId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b8");
 
     Group GROUP_A = new EventBusTestFixture.GroupA();
     Group GROUP_B = new EventBusTestFixture.GroupB();
@@ -65,7 +63,7 @@ interface EventDeadLettersHealthCheckContract {
 
     @Test
     default void checkShouldReturnDegradedWhenEventDeadLetterContainEvent() {
-        eventDeadLetters().store(GROUP_A, EVENT_1, INSERTION_ID_1).block();
+        eventDeadLetters().store(GROUP_A, EVENT_1).block();
 
         assertThat(testee().check().isDegraded()).isTrue();
         assertThat(testee().check())
@@ -74,8 +72,8 @@ interface EventDeadLettersHealthCheckContract {
 
     @Test
     default void checkShouldReturnDegradedWhenEventDeadLetterContainEvents() {
-        eventDeadLetters().store(GROUP_A, EVENT_1, INSERTION_ID_1).block();
-        eventDeadLetters().store(GROUP_B, EVENT_2, INSERTION_ID_2).block();
+        eventDeadLetters().store(GROUP_A, EVENT_1).block();
+        eventDeadLetters().store(GROUP_B, EVENT_2).block();
 
         assertThat(testee().check().isDegraded()).isTrue();
         assertThat(testee().check())
@@ -84,15 +82,15 @@ interface EventDeadLettersHealthCheckContract {
 
     @Test
     default void checkShouldReturnHealthyWhenRemovedAllEventDeadLetters() {
-        eventDeadLetters().store(GROUP_A, EVENT_1, INSERTION_ID_1).block();
-        eventDeadLetters().store(GROUP_B, EVENT_2, INSERTION_ID_2).block();
+        EventDeadLetters.InsertionId insertionId1 = eventDeadLetters().store(GROUP_A, EVENT_1).block();
+        EventDeadLetters.InsertionId insertionId2 = eventDeadLetters().store(GROUP_B, EVENT_2).block();
 
         assertThat(testee().check().isDegraded()).isTrue();
         assertThat(testee().check())
             .isEqualTo(Result.degraded(COMPONENT_NAME, "EventDeadLetters contain events"));
 
-        eventDeadLetters().remove(GROUP_A, INSERTION_ID_1).block();
-        eventDeadLetters().remove(GROUP_B, INSERTION_ID_2).block();
+        eventDeadLetters().remove(GROUP_A, insertionId1).block();
+        eventDeadLetters().remove(GROUP_B, insertionId2).block();
 
         assertThat(testee().check().isHealthy()).isTrue();
         assertThat(testee().check())
@@ -101,14 +99,14 @@ interface EventDeadLettersHealthCheckContract {
 
     @Test
     default void checkShouldReturnDegradedWhenRemovedSomeEventDeadLetters() {
-        eventDeadLetters().store(GROUP_A, EVENT_1, INSERTION_ID_1).block();
-        eventDeadLetters().store(GROUP_B, EVENT_2, INSERTION_ID_2).block();
+        EventDeadLetters.InsertionId insertionId1 = eventDeadLetters().store(GROUP_A, EVENT_1).block();
+        eventDeadLetters().store(GROUP_B, EVENT_2).block();
 
         assertThat(testee().check().isDegraded()).isTrue();
         assertThat(testee().check())
             .isEqualTo(Result.degraded(COMPONENT_NAME, "EventDeadLetters contain events"));
 
-        eventDeadLetters().remove(GROUP_A, INSERTION_ID_1).block();
+        eventDeadLetters().remove(GROUP_A, insertionId1).block();
 
         assertThat(testee().check().isDegraded()).isTrue();
         assertThat(testee().check())
diff --git a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java
index d9913ad..7b62fc0 100644
--- a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java
+++ b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java
@@ -120,7 +120,7 @@ public class CassandraEventDeadLettersDAO {
     }
 
     Mono<Boolean> containEvents() {
-        return executor.executeReturnExists(containEventsStatement.bind().setFetchSize(1));
+        return executor.executeReturnExists(containEventsStatement.bind());
     }
 
     private Event deserializeEvent(String serializedEvent) {
diff --git a/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java b/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java
index cbf37ab..5f8af25 100644
--- a/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java
+++ b/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java
@@ -86,6 +86,6 @@ public class MemoryEventDeadLetters implements EventDeadLetters {
 
     @Override
     public Mono<Boolean> containEvents() {
-        return Mono.just(deadLetters.size() > 0);
+        return Mono.just(!deadLetters.isEmpty());
     }
 }
diff --git a/mailbox/event/event-memory/src/test/java/org/apache/james/mailbox/events/MemoryEventDeadLettersHealthCheckTest.java b/mailbox/event/event-memory/src/test/java/org/apache/james/mailbox/events/MemoryEventDeadLettersHealthCheckTest.java
index e6275ee..c05deb0 100644
--- a/mailbox/event/event-memory/src/test/java/org/apache/james/mailbox/events/MemoryEventDeadLettersHealthCheckTest.java
+++ b/mailbox/event/event-memory/src/test/java/org/apache/james/mailbox/events/MemoryEventDeadLettersHealthCheckTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.events;
 
+import org.apache.commons.lang3.NotImplementedException;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
@@ -39,12 +40,12 @@ public class MemoryEventDeadLettersHealthCheckTest implements EventDeadLettersHe
 
     @Override
     public void createErrorWhenDoingHealthCheck() {
-
+        throw new NotImplementedException("We can not instrument implementation this test case.");
     }
 
     @Override
     public void resolveErrorWhenDoingHealthCheck() {
-        // Unable to trigger the EventDeadLetter error with memory version
+        throw new NotImplementedException("We can not instrument implementation this test case.");
     }
 
     @Override
diff --git a/src/site/markdown/server/manage-guice-distributed-james.md b/src/site/markdown/server/manage-guice-distributed-james.md
index a7aa783..03c1a80 100644
--- a/src/site/markdown/server/manage-guice-distributed-james.md
+++ b/src/site/markdown/server/manage-guice-distributed-james.md
@@ -89,6 +89,7 @@ Here are the available checks alongside the insight they offer:
 
  - **Cassandra backend**: Cassandra storage. Ensure queries can be executed on the connection James uses.
  - **ElasticSearch Backend**: ElasticSearch storage. Triggers an ElasticSearch health request on indices James uses.
+ - **EventDeadLettersHealthCheck**: EventDeadLetters checking.
  - **RabbitMQ backend**: RabbitMQ messaging. Verifies an open connection and an open channel are well available.
  - **Guice application lifecycle**: Ensures James Guice successfully started, and is up. Logs should contain 
  explanations if James did not start well.
@@ -195,9 +196,8 @@ If after those retries the listener is still failing to perform its operation, t
 [Event Dead Letter](manage-webadmin.html#Event_Dead_Letter). 
 This API allows diagnosing issues, as well as redelivering the events. 
 
-To check that you have undelivered events in your system, you can first
-[list mailbox listener groups](manage-webadmin.html#Listing_mailbox_listener_groups).
-You will get a list of groups back, allowing you to check if those contain registered events in each by
+To check that you have undelivered events in your system, you can first run the associated with [event dead letter health check](manage-webadmin.html#Event_Dead_Letter)
+.You can explore Event DeadLetter content through WebAdmin. For this, [list mailbox listener groups](manage-webadmin.html#Listing_mailbox_listener_groups) you will get a list of groups back, allowing you to check if those contain registered events in each by
 [listing their failed events](manage-webadmin.html#Listing_failed_events).
 
 If you get failed events IDs back, you can as well [check their details](manage-webadmin.html#Getting_event_details).
diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md
index 40d5d3f..a4a9666 100644
--- a/src/site/markdown/server/manage-webadmin.md
+++ b/src/site/markdown/server/manage-webadmin.md
@@ -50,10 +50,10 @@ Finally, please note that in case of a malformed URL the 400 bad request respons
  - [Administrating mail queues](#Administrating_mail_queues)
  - [Administrating DLP Configuration](#Administrating_DLP_Configuration)
  - [Administrating Sieve quotas](#Administrating_Sieve_quotas)
- - [Event Dead Letter](#Event_Dead_Letter)
  - [Deleted Messages Vault](#Deleted_Messages_Vault)
  - [Task management](#Task_management)
  - [Cassandra extra operations](#Cassandra_extra_operations)
+ - [Event Dead Letter](#Event_Dead_Letter)
 
 ## HealthCheck
 
@@ -97,6 +97,7 @@ Supported health checks include:
 
  - **Cassandra backend**: Cassandra storage. Included in Cassandra Guice based products.
  - **ElasticSearch Backend**: ElasticSearch storage. Included in Cassandra Guice based products.
+ - **EventDeadLettersHealthCheck**: Included in all Guice products.
  - **Guice application lifecycle**: included in all Guice products.
  - **JPA Backend**: JPA storage. Included in JPA Guice based products.
  - **MessageFastViewProjection**: included in memory and Cassandra based Guice products. 
@@ -2856,6 +2857,7 @@ and the like.
 Upon exceptions, a bounded number of retries are performed (with exponential backoff delays). If after those retries the listener is still
 failing, then the event will be stored in the "Event Dead Letter". This API allows diagnosing issues, as well as performing event replay (not implemented yet).
 
+ - [Event Dead Letter](#Event_Dead_Letter)
  - [Listing mailbox listener groups](#Listing_mailbox_listener_groups)
  - [Listing failed events](#Listing_failed_events)
  - [Getting event details](#Getting_event_details)


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