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:41 UTC

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

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