diff --git a/spring-geode-actuator/src/main/java/org/springframework/geode/boot/actuate/GeodeContinuousQueriesHealthIndicator.java b/spring-geode-actuator/src/main/java/org/springframework/geode/boot/actuate/GeodeContinuousQueriesHealthIndicator.java index f4152403..bab20b5d 100644 --- a/spring-geode-actuator/src/main/java/org/springframework/geode/boot/actuate/GeodeContinuousQueriesHealthIndicator.java +++ b/spring-geode-actuator/src/main/java/org/springframework/geode/boot/actuate/GeodeContinuousQueriesHealthIndicator.java @@ -89,14 +89,27 @@ public class GeodeContinuousQueriesHealthIndicator extends AbstractGeodeHealthIn if (getContinuousQueryListenerContainer().isPresent()) { - List continuousQueries = getContinuousQueryListenerContainer() - .map(ContinuousQueryListenerContainer::getQueryService) + Optional queryService = getContinuousQueryListenerContainer() + .map(ContinuousQueryListenerContainer::getQueryService); + + List continuousQueries = queryService .map(QueryService::getCqs) .map(Arrays::asList) .orElseGet(Collections::emptyList); builder.withDetail("geode.continuous-query.count", continuousQueries.size()); + queryService + .map(QueryService::getCqStatistics) + .ifPresent(cqServiceStatistics -> { + + builder.withDetail("geode.continuous-query.number-of-active", cqServiceStatistics.numCqsActive()) + .withDetail("geode.continuous-query.number-of-closed", cqServiceStatistics.numCqsClosed()) + .withDetail("geode.continuous-query.number-of-created", cqServiceStatistics.numCqsCreated()) + .withDetail("geode.continuous-query.number-of-stopped", cqServiceStatistics.numCqsStopped()) + .withDetail("geode.continuous-query.number-on-client", cqServiceStatistics.numCqsOnClient()); + }); + continuousQueries.stream() .filter(Objects::nonNull) .forEach(continuousQuery -> { diff --git a/spring-geode-actuator/src/test/java/org/springframework/geode/boot/actuate/GeodeContinuousQueriesHealthIndicatorUnitTests.java b/spring-geode-actuator/src/test/java/org/springframework/geode/boot/actuate/GeodeContinuousQueriesHealthIndicatorUnitTests.java index 20b5b792..a7debbbc 100644 --- a/spring-geode-actuator/src/test/java/org/springframework/geode/boot/actuate/GeodeContinuousQueriesHealthIndicatorUnitTests.java +++ b/spring-geode-actuator/src/test/java/org/springframework/geode/boot/actuate/GeodeContinuousQueriesHealthIndicatorUnitTests.java @@ -25,6 +25,7 @@ import static org.mockito.Mockito.when; import java.util.Map; import org.apache.geode.cache.query.CqQuery; +import org.apache.geode.cache.query.CqServiceStatistics; import org.apache.geode.cache.query.CqState; import org.apache.geode.cache.query.CqStatistics; import org.apache.geode.cache.query.Query; @@ -112,6 +113,15 @@ public class GeodeContinuousQueriesHealthIndicatorUnitTests { when(this.mockQueryService.getCqs()).thenReturn(mockContinuousQueries); + CqServiceStatistics mockContinuousQueryServiceStatistics = mock(CqServiceStatistics.class); + + when(mockContinuousQueryServiceStatistics.numCqsActive()).thenReturn(42L); + when(mockContinuousQueryServiceStatistics.numCqsClosed()).thenReturn(8L); + when(mockContinuousQueryServiceStatistics.numCqsCreated()).thenReturn(51L); + when(mockContinuousQueryServiceStatistics.numCqsStopped()).thenReturn(16L); + when(mockContinuousQueryServiceStatistics.numCqsOnClient()).thenReturn(64L); + when(this.mockQueryService.getCqStatistics()).thenReturn(mockContinuousQueryServiceStatistics); + Health.Builder builder = new Health.Builder(); this.continuousQueriesHealthIndicator.doHealthCheck(builder); @@ -126,6 +136,11 @@ public class GeodeContinuousQueriesHealthIndicatorUnitTests { assertThat(healthDetails).isNotNull(); assertThat(healthDetails).isNotEmpty(); assertThat(healthDetails).containsEntry("geode.continuous-query.count", mockContinuousQueries.length); + assertThat(healthDetails).containsEntry("geode.continuous-query.number-of-active", 42L); + assertThat(healthDetails).containsEntry("geode.continuous-query.number-of-closed", 8L); + assertThat(healthDetails).containsEntry("geode.continuous-query.number-of-created", 51L); + assertThat(healthDetails).containsEntry("geode.continuous-query.number-of-stopped", 16L); + assertThat(healthDetails).containsEntry("geode.continuous-query.number-on-client", 64L); assertThat(healthDetails).containsEntry("geode.continuous-query.MockContinuousQuery.oql-query-string", "SELECT * FROM /Example WHERE status = 'RUNNING'"); assertThat(healthDetails).containsEntry("geode.continuous-query.MockContinuousQuery.closed", "No"); assertThat(healthDetails).containsEntry("geode.continuous-query.MockContinuousQuery.closing", "No");