-
Notifications
You must be signed in to change notification settings - Fork 2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Servicebus health indicator implementation and doc. (#23050)
* Add health indicator doc. * Service bus health indicator logic implementation. * Add unit tests.
- Loading branch information
1 parent
ee215fc
commit c2b1294
Showing
32 changed files
with
689 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -76,5 +76,4 @@ public ServiceBusConnectionStringProvider serviceBusConnectionStringProvider( | |
|
||
return null; | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
47 changes: 47 additions & 0 deletions
47
...c/main/java/com/azure/spring/servicebus/stream/binder/ServiceBusQueueHealthIndicator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
// Copyright (c) Microsoft Corporation. All rights reserved. | ||
// Licensed under the MIT License. | ||
package com.azure.spring.servicebus.stream.binder; | ||
|
||
import com.azure.spring.integration.servicebus.health.Instrumentation; | ||
import com.azure.spring.integration.servicebus.health.InstrumentationManager; | ||
import com.azure.spring.integration.servicebus.queue.ServiceBusQueueOperation; | ||
import org.springframework.boot.actuate.health.AbstractHealthIndicator; | ||
import org.springframework.boot.actuate.health.Health; | ||
|
||
/** | ||
* Implementation of a {@link AbstractHealthIndicator} returning status information for | ||
* service bus queue. | ||
*/ | ||
public class ServiceBusQueueHealthIndicator extends AbstractHealthIndicator { | ||
|
||
private final InstrumentationManager instrumentationManager; | ||
|
||
public ServiceBusQueueHealthIndicator(ServiceBusQueueOperation serviceBusQueueOperation) { | ||
super("Service bus health check failed"); | ||
this.instrumentationManager = serviceBusQueueOperation.getInstrumentationManager(); | ||
} | ||
|
||
@Override | ||
protected void doHealthCheck(Health.Builder builder) { | ||
if (instrumentationManager == null || instrumentationManager.getHealthInstrumentations().isEmpty()) { | ||
builder.unknown(); | ||
return; | ||
} | ||
if (instrumentationManager.getHealthInstrumentations().stream() | ||
.allMatch(Instrumentation::isUp)) { | ||
builder.up(); | ||
return; | ||
} | ||
if (instrumentationManager.getHealthInstrumentations().stream() | ||
.allMatch(Instrumentation::isOutOfService)) { | ||
builder.outOfService(); | ||
return; | ||
} | ||
builder.down(); | ||
instrumentationManager.getHealthInstrumentations().stream() | ||
.filter(instrumentation -> !instrumentation.isStarted()) | ||
.forEach(instrumentation -> builder | ||
.withDetail(instrumentation.getName() + ":" + instrumentation.getType().getTypeName(), | ||
instrumentation.getStartException())); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
25 changes: 25 additions & 0 deletions
25
...ng/servicebus/stream/binder/config/ServiceBusQueueBinderHealthIndicatorConfiguration.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
// Copyright (c) Microsoft Corporation. All rights reserved. | ||
// Licensed under the MIT License. | ||
package com.azure.spring.servicebus.stream.binder.config; | ||
|
||
import com.azure.spring.integration.servicebus.queue.ServiceBusQueueOperation; | ||
import com.azure.spring.servicebus.stream.binder.ServiceBusQueueHealthIndicator; | ||
import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator; | ||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; | ||
import org.springframework.context.annotation.Bean; | ||
import org.springframework.context.annotation.Configuration; | ||
|
||
/** | ||
* Auto configuration for {@link ServiceBusQueueHealthIndicator}. | ||
*/ | ||
@Configuration | ||
@ConditionalOnClass(name = "org.springframework.boot.actuate.health.HealthIndicator") | ||
@ConditionalOnEnabledHealthIndicator("binders") | ||
public class ServiceBusQueueBinderHealthIndicatorConfiguration { | ||
|
||
@Bean | ||
public ServiceBusQueueHealthIndicator serviceBusQueueHealthIndicator(ServiceBusQueueOperation serviceBusQueueOperation) { | ||
return new ServiceBusQueueHealthIndicator(serviceBusQueueOperation); | ||
} | ||
|
||
} |
80 changes: 80 additions & 0 deletions
80
...a/com/azure/spring/servicebus/stream/binder/ServiceBusQueueBinderHealthIndicatorTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
// Copyright (c) Microsoft Corporation. All rights reserved. | ||
// Licensed under the MIT License. | ||
|
||
package com.azure.spring.servicebus.stream.binder; | ||
|
||
import com.azure.messaging.servicebus.ServiceBusProcessorClient; | ||
import com.azure.spring.integration.servicebus.ServiceBusClientConfig; | ||
import com.azure.spring.integration.servicebus.ServiceBusMessageProcessor; | ||
import com.azure.spring.integration.servicebus.ServiceBusRuntimeException; | ||
import com.azure.spring.integration.servicebus.factory.ServiceBusQueueClientFactory; | ||
import com.azure.spring.integration.servicebus.queue.ServiceBusQueueTemplate; | ||
import org.junit.jupiter.api.BeforeEach; | ||
import org.junit.jupiter.api.Test; | ||
import org.mockito.Mock; | ||
import org.mockito.MockitoAnnotations; | ||
import org.springframework.boot.actuate.health.Health; | ||
import org.springframework.boot.actuate.health.Status; | ||
import org.springframework.messaging.Message; | ||
|
||
import java.util.function.Consumer; | ||
|
||
import static org.assertj.core.api.Assertions.assertThat; | ||
import static org.junit.jupiter.api.Assertions.assertThrows; | ||
import static org.mockito.ArgumentMatchers.any; | ||
import static org.mockito.ArgumentMatchers.anyString; | ||
import static org.mockito.Mockito.doThrow; | ||
import static org.mockito.Mockito.when; | ||
|
||
public class ServiceBusQueueBinderHealthIndicatorTest { | ||
|
||
@Mock | ||
private ServiceBusQueueClientFactory serviceBusQueueClientFactory; | ||
|
||
@Mock | ||
private ServiceBusProcessorClient processorClient; | ||
|
||
private ServiceBusQueueHealthIndicator serviceBusQueueHealthIndicator; | ||
|
||
private ServiceBusQueueTemplate serviceBusQueueTemplate; | ||
|
||
private Consumer<Message<?>> consumer = message -> { | ||
}; | ||
|
||
@BeforeEach | ||
public void init() { | ||
MockitoAnnotations.openMocks(this); | ||
serviceBusQueueTemplate = new ServiceBusQueueTemplate(serviceBusQueueClientFactory); | ||
serviceBusQueueHealthIndicator = new ServiceBusQueueHealthIndicator(serviceBusQueueTemplate); | ||
} | ||
|
||
@Test | ||
public void testNoInstrumentationInUse() { | ||
final Health health = serviceBusQueueHealthIndicator.health(); | ||
assertThat(health.getStatus()).isEqualTo(Status.UNKNOWN); | ||
} | ||
|
||
@SuppressWarnings({ "unchecked", "rawtypes" }) | ||
@Test | ||
public void testServiceBusQueueIsUp() { | ||
when(serviceBusQueueClientFactory.getOrCreateProcessor(anyString(), any(ServiceBusClientConfig.class), | ||
any(ServiceBusMessageProcessor.class))).thenReturn(processorClient); | ||
serviceBusQueueTemplate.subscribe("queue-test-1", consumer, byte[].class); | ||
final Health health = serviceBusQueueHealthIndicator.health(); | ||
assertThat(health.getStatus()).isEqualTo(Status.UP); | ||
} | ||
|
||
@SuppressWarnings({ "unchecked", "rawtypes" }) | ||
@Test | ||
public void testServiceBusQueueIsDown() { | ||
when(serviceBusQueueClientFactory.getOrCreateProcessor(anyString(), any(ServiceBusClientConfig.class), | ||
any(ServiceBusMessageProcessor.class))).thenReturn(processorClient); | ||
doThrow(NullPointerException.class).when(processorClient).start(); | ||
assertThrows(ServiceBusRuntimeException.class, () -> { | ||
serviceBusQueueTemplate.subscribe("queue-test-1", consumer, byte[].class); | ||
}); | ||
final Health health = serviceBusQueueHealthIndicator.health(); | ||
assertThat(health.getStatus()).isEqualTo(Status.DOWN); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.