diff --git a/src/main/java/com/orange/lo/sample/mqtt2eventhub/evthub/EventHubClientFacade.java b/src/main/java/com/orange/lo/sample/mqtt2eventhub/evthub/EventHubClientFacade.java index 5edb2a9..63bfb88 100644 --- a/src/main/java/com/orange/lo/sample/mqtt2eventhub/evthub/EventHubClientFacade.java +++ b/src/main/java/com/orange/lo/sample/mqtt2eventhub/evthub/EventHubClientFacade.java @@ -11,7 +11,7 @@ import com.microsoft.azure.eventhubs.EventData; import com.microsoft.azure.eventhubs.EventHubClient; import com.microsoft.azure.eventhubs.EventHubException; -import com.orange.lo.sample.mqtt2eventhub.utils.ConnectorHealthActuatorEndpoint; +import com.orange.lo.sample.mqtt2eventhub.utils.Counters; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -32,13 +32,13 @@ public class EventHubClientFacade { private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); public static final String EVENT_HUB_CLIENT_NOT_INITIALIZED_MESSAGE = "The event hub client has not been initialized. Check the validity of your credentials"; - private final ConnectorHealthActuatorEndpoint connectorHealthActuatorEndpoint; + private final Counters counters; private final EventHubProperties eventHubProperties; private EventHubClient eventHubClient; - public EventHubClientFacade(EventHubProperties eventHubProperties, ConnectorHealthActuatorEndpoint connectorHealthActuatorEndpoint) { + public EventHubClientFacade(EventHubProperties eventHubProperties, Counters counters) { this.eventHubProperties = eventHubProperties; - this.connectorHealthActuatorEndpoint = connectorHealthActuatorEndpoint; + this.counters = counters; } @PostConstruct @@ -56,7 +56,7 @@ private void init() { this.eventHubClient = EventHubClient.createFromConnectionStringSync(conn.toString(), executor); } catch (Exception e) { LOG.error("Problem with connection. Check Event Hub credentials. " + e.getMessage(), e); - connectorHealthActuatorEndpoint.setCloudConnectionStatus(false); + counters.setCloudConnectionStatus(false); } } diff --git a/src/main/java/com/orange/lo/sample/mqtt2eventhub/evthub/EventHubSender.java b/src/main/java/com/orange/lo/sample/mqtt2eventhub/evthub/EventHubSender.java index 0757c7f..d50bfc3 100644 --- a/src/main/java/com/orange/lo/sample/mqtt2eventhub/evthub/EventHubSender.java +++ b/src/main/java/com/orange/lo/sample/mqtt2eventhub/evthub/EventHubSender.java @@ -9,7 +9,6 @@ import com.orange.lo.sample.mqtt2eventhub.liveobjects.LoMessage; import com.orange.lo.sample.mqtt2eventhub.liveobjects.LoService; -import com.orange.lo.sample.mqtt2eventhub.utils.ConnectorHealthActuatorEndpoint; import com.orange.lo.sample.mqtt2eventhub.utils.Counters; import net.jodah.failsafe.Failsafe; import net.jodah.failsafe.RetryPolicy; @@ -39,18 +38,15 @@ public class EventHubSender { private final Counters counters; private final EventHubProperties eventHubProperties; private final ExecutorService executorService; - private final ConnectorHealthActuatorEndpoint connectorHealthActuatorEndpoint; private final LoService loService; private final Queue messageQueue; EventHubSender(EventHubClientFacade eventHubClientFacade, Counters counters, EventHubProperties eventHubProperties, - ExecutorService executorService, ConnectorHealthActuatorEndpoint connectorHealthActuatorEndpoint, - LoService loService, Queue messageQueue) { + ExecutorService executorService, LoService loService, Queue messageQueue) { this.eventHubClientFacade = eventHubClientFacade; this.counters = counters; this.eventHubProperties = eventHubProperties; this.executorService = executorService; - this.connectorHealthActuatorEndpoint = connectorHealthActuatorEndpoint; this.loService = loService; this.messageQueue = messageQueue; } @@ -79,10 +75,10 @@ public void send(List messages) { try { List messageContentList = messages.stream().map(LoMessage::message).toList(); eventHubClientFacade.sendSync(messageContentList); - connectorHealthActuatorEndpoint.setCloudConnectionStatus(true); + counters.setCloudConnectionStatus(true); } catch (EventHubClientFacadeException e) { LOG.error("Problem with connection. Check Event Hub credentials. " + e.getMessage(), e); - connectorHealthActuatorEndpoint.setCloudConnectionStatus(false); + counters.setCloudConnectionStatus(false); throw e; } }); @@ -94,7 +90,7 @@ private void checkConnection() { eventHubClientFacade.sendSync(new byte[0]); } catch (EventHubClientFacadeException e) { LOG.error("Problem with connection. Check Event Hub credentials. " + e.getMessage(), e); - connectorHealthActuatorEndpoint.setCloudConnectionStatus(false); + counters.setCloudConnectionStatus(false); } } diff --git a/src/main/java/com/orange/lo/sample/mqtt2eventhub/liveobjects/LoMqttReconnectHandler.java b/src/main/java/com/orange/lo/sample/mqtt2eventhub/liveobjects/LoMqttReconnectHandler.java index 174f628..0ecd716 100644 --- a/src/main/java/com/orange/lo/sample/mqtt2eventhub/liveobjects/LoMqttReconnectHandler.java +++ b/src/main/java/com/orange/lo/sample/mqtt2eventhub/liveobjects/LoMqttReconnectHandler.java @@ -7,26 +7,26 @@ package com.orange.lo.sample.mqtt2eventhub.liveobjects; -import com.orange.lo.sample.mqtt2eventhub.utils.ConnectorHealthActuatorEndpoint; +import com.orange.lo.sample.mqtt2eventhub.utils.Counters; import com.orange.lo.sdk.mqtt.DataManagementReconnectCallback; import org.springframework.stereotype.Component; @Component public class LoMqttReconnectHandler implements DataManagementReconnectCallback { - private final ConnectorHealthActuatorEndpoint connectorHealthActuatorEndpoint; + private final Counters counters; - public LoMqttReconnectHandler(ConnectorHealthActuatorEndpoint connectorHealthActuatorEndpoint) { - this.connectorHealthActuatorEndpoint = connectorHealthActuatorEndpoint; + public LoMqttReconnectHandler(Counters counters) { + this.counters = counters; } @Override public void connectComplete(boolean b, String s) { - connectorHealthActuatorEndpoint.setLoConnectionStatus(true); + counters.setLoConnectionStatus(true); } @Override public void connectionLost(Throwable throwable) { - connectorHealthActuatorEndpoint.setLoConnectionStatus(false); + counters.setLoConnectionStatus(false); } } \ No newline at end of file diff --git a/src/main/java/com/orange/lo/sample/mqtt2eventhub/liveobjects/LoService.java b/src/main/java/com/orange/lo/sample/mqtt2eventhub/liveobjects/LoService.java index 0290651..954fb28 100644 --- a/src/main/java/com/orange/lo/sample/mqtt2eventhub/liveobjects/LoService.java +++ b/src/main/java/com/orange/lo/sample/mqtt2eventhub/liveobjects/LoService.java @@ -7,7 +7,7 @@ package com.orange.lo.sample.mqtt2eventhub.liveobjects; -import com.orange.lo.sample.mqtt2eventhub.utils.ConnectorHealthActuatorEndpoint; +import com.orange.lo.sample.mqtt2eventhub.utils.Counters; import com.orange.lo.sdk.LOApiClient; import com.orange.lo.sdk.fifomqtt.DataManagementFifo; import com.orange.lo.sdk.mqtt.exceptions.LoMqttException; @@ -27,13 +27,13 @@ public class LoService { private final DataManagementFifo dataManagementFifo; private final LoProperties loProperties; - private final ConnectorHealthActuatorEndpoint connectorHealthActuatorEndpoint; + private final Counters counters; - public LoService(LOApiClient loApiClient, ConnectorHealthActuatorEndpoint connectorHealthActuatorEndpoint, + public LoService(LOApiClient loApiClient, Counters counters, LoProperties loProperties) { this.dataManagementFifo = loApiClient.getDataManagementFifo(); this.loProperties = loProperties; - this.connectorHealthActuatorEndpoint = connectorHealthActuatorEndpoint; + this.counters = counters; } @PostConstruct @@ -42,10 +42,10 @@ public void start() { dataManagementFifo.connect(); } catch (LoMqttException e) { LOG.error("Problem with connection. Check LO credentials. ", e); - connectorHealthActuatorEndpoint.setLoConnectionStatus(false); + counters.setLoConnectionStatus(false); } - if (connectorHealthActuatorEndpoint.isCloudConnectionStatus() && connectorHealthActuatorEndpoint.isLoConnectionStatus()) + if (counters.isCloudConnectionStatusUp() && counters.isLoConnectionStatusUp()) dataManagementFifo.connectAndSubscribe(); } diff --git a/src/main/java/com/orange/lo/sample/mqtt2eventhub/utils/ConnectorHealthActuatorEndpoint.java b/src/main/java/com/orange/lo/sample/mqtt2eventhub/utils/ConnectorHealthActuatorEndpoint.java index 3843ae7..ec19ce5 100644 --- a/src/main/java/com/orange/lo/sample/mqtt2eventhub/utils/ConnectorHealthActuatorEndpoint.java +++ b/src/main/java/com/orange/lo/sample/mqtt2eventhub/utils/ConnectorHealthActuatorEndpoint.java @@ -1,3 +1,10 @@ +/** + * Copyright (c) Orange, Inc. and its affiliates. All Rights Reserved. + *

+ * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + package com.orange.lo.sample.mqtt2eventhub.utils; import org.springframework.boot.actuate.health.Health; @@ -8,8 +15,11 @@ @Component public class ConnectorHealthActuatorEndpoint implements HealthIndicator { - boolean cloudConnectionStatus = true; - boolean loConnectionStatus = true; + private Counters counters; + + public ConnectorHealthActuatorEndpoint(Counters counters) { + this.counters = counters; + } @Override public Health getHealth(boolean includeDetails) { @@ -20,24 +30,8 @@ public Health getHealth(boolean includeDetails) { public Health health() { Health.Builder builder = new Health.Builder(Status.UP); - builder.withDetail("loMqttConnectionStatus", loConnectionStatus); - builder.withDetail("cloudConnectionStatus", cloudConnectionStatus); + builder.withDetail("loMqttConnectionStatus", counters.isLoConnectionStatusUp()); + builder.withDetail("cloudConnectionStatus", counters.isCloudConnectionStatusUp()); return builder.build(); } - - public void setCloudConnectionStatus(boolean cloudConnectionStatus) { - this.cloudConnectionStatus = cloudConnectionStatus; - } - - public boolean isCloudConnectionStatus() { - return cloudConnectionStatus; - } - - public void setLoConnectionStatus(boolean cloudConnectionStatus) { - this.loConnectionStatus = cloudConnectionStatus; - } - - public boolean isLoConnectionStatus() { - return loConnectionStatus; - } } \ No newline at end of file diff --git a/src/main/java/com/orange/lo/sample/mqtt2eventhub/utils/Counters.java b/src/main/java/com/orange/lo/sample/mqtt2eventhub/utils/Counters.java index 7fc427e..76a3a09 100644 --- a/src/main/java/com/orange/lo/sample/mqtt2eventhub/utils/Counters.java +++ b/src/main/java/com/orange/lo/sample/mqtt2eventhub/utils/Counters.java @@ -13,6 +13,7 @@ import java.util.Arrays; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; @Component public class Counters { @@ -22,6 +23,8 @@ public class Counters { private final Counter mesasageSentAttemptFailedCounter; private final Counter mesasageSentCounter; private final Counter mesasageSentFailedCounter; + private AtomicInteger loConnectionStatus; + private AtomicInteger cloudConnectionStatus; public Counters(MeterRegistry meterRegistry) { mesasageReadCounter = meterRegistry.counter("message.read"); @@ -29,6 +32,8 @@ public Counters(MeterRegistry meterRegistry) { mesasageSentAttemptFailedCounter = meterRegistry.counter("message.sent.attempt.failed"); mesasageSentCounter = meterRegistry.counter("message.sent"); mesasageSentFailedCounter = meterRegistry.counter("message.sent.failed"); + loConnectionStatus = meterRegistry.gauge("status.connection.lo", new AtomicInteger(1)); + cloudConnectionStatus = meterRegistry.gauge("status.connection.cloud", new AtomicInteger(1)); } public Counter getMesasageReadCounter() { @@ -50,7 +55,23 @@ public Counter getMesasageSentCounter() { public Counter getMesasageSentFailedCounter() { return mesasageSentFailedCounter; } - + + public void setLoConnectionStatus(boolean status) { + loConnectionStatus.set(status ? 1 : 0); + } + + public void setCloudConnectionStatus(boolean status) { + cloudConnectionStatus.set(status ? 1 : 0); + } + + public boolean isCloudConnectionStatusUp() { + return cloudConnectionStatus.get() > 0; + } + + public boolean isLoConnectionStatusUp() { + return loConnectionStatus.get() > 0; + } + public List getAll() { return Arrays.asList(mesasageReadCounter, mesasageSentAttemptCounter, mesasageSentAttemptFailedCounter, mesasageSentCounter, mesasageSentFailedCounter); } diff --git a/src/main/java/com/orange/lo/sample/mqtt2eventhub/utils/MeterRegistryConfig.java b/src/main/java/com/orange/lo/sample/mqtt2eventhub/utils/MeterRegistryConfig.java index 3edf721..297645a 100644 --- a/src/main/java/com/orange/lo/sample/mqtt2eventhub/utils/MeterRegistryConfig.java +++ b/src/main/java/com/orange/lo/sample/mqtt2eventhub/utils/MeterRegistryConfig.java @@ -11,6 +11,8 @@ import io.micrometer.cloudwatch2.CloudWatchMeterRegistry; import io.micrometer.core.instrument.Clock; import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.Gauge; +import io.micrometer.core.instrument.Meter; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.config.MeterFilter; import io.micrometer.core.instrument.step.StepMeterRegistry; @@ -30,15 +32,20 @@ import java.lang.invoke.MethodHandles; import java.time.Duration; +import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; @Configuration public class MeterRegistryConfig { private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private static final String AWS_SERVICE_PROFILE_NAME = "service-profile"; + public static final String MESSAGE_METRICS_PREFIX = "message"; + public static final String STATUS_METRICS_PREFIX = "status"; private final MetricsProperties metricsProperties; public MeterRegistryConfig(MetricsProperties metricsProperties) { @@ -66,7 +73,7 @@ private CloudWatchMeterRegistry getCloudWatchMeterRegistry() { CloudWatchMeterRegistry cloudWatchMeterRegistry = new CloudWatchMeterRegistry(cloudWatchConfig(), Clock.SYSTEM, cloudWatchAsyncClient); cloudWatchMeterRegistry.config() - .meterFilter(MeterFilter.deny(id -> !id.getName().startsWith("message"))) + .meterFilter(MeterFilter.deny(id -> !isAConnectorMetric(id))) .commonTags(metricsProperties.getDimensionName(), metricsProperties.getDimensionValue()); return cloudWatchMeterRegistry; } @@ -99,6 +106,11 @@ public String namespace() { }; } + private static boolean isAConnectorMetric(Meter.Id id) { + String name = id.getName(); + return name.startsWith(MESSAGE_METRICS_PREFIX) || name.startsWith(STATUS_METRICS_PREFIX); + } + private StepMeterRegistry stepMeterRegistry() { StepMeterRegistry stepMeterRegistry = new StepMeterRegistry(stepRegistryConfig(), Clock.SYSTEM) { @@ -110,10 +122,22 @@ protected TimeUnit getBaseTimeUnit() { @Override protected void publish() { - getMeters().stream() - .filter(m -> m.getId().getName().startsWith("message") ) - .map(m -> get(m.getId().getName()).counter()) - .forEach(c -> LOG.info("{} = {}", c.getId().getName(), val(c))); + Stream message = getMeters().stream() + .filter(m -> m.getId().getName().startsWith(MESSAGE_METRICS_PREFIX)) + .map(m -> { + Counter counter = get(m.getId().getName()).counter(); + return counter.getId().getName() + " = " + val(counter); + }); + + Stream status = getMeters().stream() + .filter(m -> m.getId().getName().startsWith(STATUS_METRICS_PREFIX)) + .map(m -> { + Gauge gauge = get(m.getId().getName()).gauge(); + return gauge.getId().getName() + " = " + Math.round(gauge.value()); + }); + + List collect = Stream.concat(message, status).collect(Collectors.toList()); + collect.forEach(LOG::info); } @Override diff --git a/src/test/java/com/orange/lo/sample/mqtt2eventhub/evthub/EventHubSenderTest.java b/src/test/java/com/orange/lo/sample/mqtt2eventhub/evthub/EventHubSenderTest.java index 307df27..16ddc0e 100644 --- a/src/test/java/com/orange/lo/sample/mqtt2eventhub/evthub/EventHubSenderTest.java +++ b/src/test/java/com/orange/lo/sample/mqtt2eventhub/evthub/EventHubSenderTest.java @@ -2,33 +2,29 @@ import com.orange.lo.sample.mqtt2eventhub.liveobjects.LoMessage; import com.orange.lo.sample.mqtt2eventhub.liveobjects.LoService; -import com.orange.lo.sample.mqtt2eventhub.utils.ConnectorHealthActuatorEndpoint; import com.orange.lo.sample.mqtt2eventhub.utils.Counters; import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.step.StepMeterRegistry; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentMatcher; import org.mockito.ArgumentMatchers; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.time.Duration; -import java.util.ArrayList; import java.util.LinkedList; import java.util.List; -import java.util.Queue; import java.util.concurrent.ExecutorService; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import java.util.stream.IntStream; -import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyList; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; +import static org.mockito.Mockito.mock; @ExtendWith(MockitoExtension.class) class EventHubSenderTest { @@ -43,8 +39,6 @@ class EventHubSenderTest { @Mock private ExecutorService executorService; @Mock - private ConnectorHealthActuatorEndpoint connectorHealthActuatorEndpoint; - @Mock private LoService loService; EventHubSender eventHubSender; @@ -56,7 +50,7 @@ void setUp() { private void prepareService(LinkedList messageQueue) { eventHubSender = new EventHubSender(eventHubClientFacade, counters, eventHubProperties, executorService, - connectorHealthActuatorEndpoint, loService, messageQueue); + loService, messageQueue); } @Test @@ -129,16 +123,16 @@ private LinkedList getExampleMessageQueue(int batchSize) { .collect(Collectors.toCollection(LinkedList::new)); } - class IsListWithGivenSize implements ArgumentMatcher { - int size; - - public IsListWithGivenSize(int size) { - this.size = size; - } - - @Override - public boolean matches(List list) { - return list.size() == size; - } - } +// private MeterRegistry mockMeterRegistry() { +// StepMeterRegistry meterRegistry = mock(StepMeterRegistry.class); +// when(meterRegistry.counter("message.read")).thenReturn(mock(Counter.class)); +// when(meterRegistry.counter("message.sent")).thenReturn(mesasageSentCounter); +// when(meterRegistry.counter("message.sent.attempt")).thenReturn(mesasageSentAttemptCounter); +// when(meterRegistry.counter("message.sent.attempt.failed")).thenReturn(mesasageSentAttemptFailedCounter); +// when(meterRegistry.counter("message.sent.failed")).thenReturn(mock(Counter.class)); +// when(meterRegistry.gauge(eq("status.connection.lo"), any())).thenReturn(new AtomicInteger()); +// when(meterRegistry.gauge(eq("status.connection.cloud"), any())).thenReturn(new AtomicInteger()); +// +// return meterRegistry; +// } } \ No newline at end of file diff --git a/src/test/java/com/orange/lo/sample/mqtt2eventhub/liveobjects/LoMqttReconnectHandlerTest.java b/src/test/java/com/orange/lo/sample/mqtt2eventhub/liveobjects/LoMqttReconnectHandlerTest.java index 60de095..d07dcea 100644 --- a/src/test/java/com/orange/lo/sample/mqtt2eventhub/liveobjects/LoMqttReconnectHandlerTest.java +++ b/src/test/java/com/orange/lo/sample/mqtt2eventhub/liveobjects/LoMqttReconnectHandlerTest.java @@ -1,38 +1,60 @@ package com.orange.lo.sample.mqtt2eventhub.liveobjects; -import com.orange.lo.sample.mqtt2eventhub.utils.ConnectorHealthActuatorEndpoint; +import com.orange.lo.sample.mqtt2eventhub.utils.Counters; +import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.step.StepMeterRegistry; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class LoMqttReconnectHandlerTest { - @Mock - private ConnectorHealthActuatorEndpoint connectorHealthActuatorEndpoint; + private Counters counters; private LoMqttReconnectHandler loMqttReconnectHandler; @BeforeEach void setUp() { - this.loMqttReconnectHandler = new LoMqttReconnectHandler(connectorHealthActuatorEndpoint); + MeterRegistry meterRegistry = mockMeterRegistry(); + this.counters = new Counters(meterRegistry); + this.loMqttReconnectHandler = new LoMqttReconnectHandler(counters); } @Test void shouldChangeLoConnectionStausWhenConnectComplete() { loMqttReconnectHandler.connectComplete(false, ""); - verify(connectorHealthActuatorEndpoint, times(1)).setLoConnectionStatus(true); + assertTrue(counters.isLoConnectionStatusUp()); } @Test void shouldChangeLoConnectionStausWhenConnectionLost() { loMqttReconnectHandler.connectionLost(new Exception()); - verify(connectorHealthActuatorEndpoint, times(1)).setLoConnectionStatus(false); + assertFalse(counters.isLoConnectionStatusUp()); + } + + private MeterRegistry mockMeterRegistry() { + StepMeterRegistry meterRegistry = mock(StepMeterRegistry.class); + when(meterRegistry.counter("message.read")).thenReturn(mock(Counter.class)); + when(meterRegistry.counter("message.sent")).thenReturn(mock(Counter.class)); + when(meterRegistry.counter("message.sent.attempt")).thenReturn(mock(Counter.class)); + when(meterRegistry.counter("message.sent.attempt.failed")).thenReturn(mock(Counter.class)); + when(meterRegistry.counter("message.sent.failed")).thenReturn(mock(Counter.class)); + when(meterRegistry.gauge(eq("status.connection.lo"), any())).thenReturn(new AtomicInteger()); + when(meterRegistry.gauge(eq("status.connection.cloud"), any())).thenReturn(new AtomicInteger()); + + return meterRegistry; } } \ No newline at end of file diff --git a/src/test/java/com/orange/lo/sample/mqtt2eventhub/liveobjects/LoServiceTest.java b/src/test/java/com/orange/lo/sample/mqtt2eventhub/liveobjects/LoServiceTest.java index fddce65..afac3b3 100644 --- a/src/test/java/com/orange/lo/sample/mqtt2eventhub/liveobjects/LoServiceTest.java +++ b/src/test/java/com/orange/lo/sample/mqtt2eventhub/liveobjects/LoServiceTest.java @@ -7,7 +7,7 @@ package com.orange.lo.sample.mqtt2eventhub.liveobjects; -import com.orange.lo.sample.mqtt2eventhub.utils.ConnectorHealthActuatorEndpoint; +import com.orange.lo.sample.mqtt2eventhub.utils.Counters; import com.orange.lo.sdk.LOApiClient; import com.orange.lo.sdk.fifomqtt.DataManagementFifo; import org.junit.jupiter.api.BeforeEach; @@ -28,7 +28,7 @@ class LoServiceTest { @Mock private LoProperties loProperties; @Mock - private ConnectorHealthActuatorEndpoint connectorHealthActuatorEndpoint; + private Counters counters; @BeforeEach void setUp() { @@ -37,10 +37,10 @@ void setUp() { @Test void startShouldConnectAndSubscribe() { - when(connectorHealthActuatorEndpoint.isLoConnectionStatus()).thenReturn(true); - when(connectorHealthActuatorEndpoint.isCloudConnectionStatus()).thenReturn(true); + when(counters.isLoConnectionStatusUp()).thenReturn(true); + when(counters.isCloudConnectionStatusUp()).thenReturn(true); - LoService loService = new LoService(loApiClient, connectorHealthActuatorEndpoint, loProperties); + LoService loService = new LoService(loApiClient, counters, loProperties); loService.start(); verify(dataManagementFifo, times(1)).connectAndSubscribe(); @@ -48,14 +48,14 @@ void startShouldConnectAndSubscribe() { @Test void shouldInvokeDisconnect() { - LoService loService = new LoService(loApiClient, connectorHealthActuatorEndpoint, loProperties); + LoService loService = new LoService(loApiClient, counters, loProperties); loService.stop(); verify(dataManagementFifo, times(1)).disconnect(); } @Test void shouldSendAck() { - LoService loService = new LoService(loApiClient, connectorHealthActuatorEndpoint, loProperties); + LoService loService = new LoService(loApiClient, counters, loProperties); int messageId = 12345; loService.sendAck(messageId); diff --git a/src/test/java/com/orange/lo/sample/mqtt2eventhub/utils/ConnectorHealthActuatorEndpointTest.java b/src/test/java/com/orange/lo/sample/mqtt2eventhub/utils/ConnectorHealthActuatorEndpointTest.java index 36aeffd..8a82c88 100644 --- a/src/test/java/com/orange/lo/sample/mqtt2eventhub/utils/ConnectorHealthActuatorEndpointTest.java +++ b/src/test/java/com/orange/lo/sample/mqtt2eventhub/utils/ConnectorHealthActuatorEndpointTest.java @@ -1,50 +1,62 @@ package com.orange.lo.sample.mqtt2eventhub.utils; +import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.step.StepMeterRegistry; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.boot.actuate.health.Health; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +@ExtendWith(MockitoExtension.class) class ConnectorHealthActuatorEndpointTest { + private Counters counters; private ConnectorHealthActuatorEndpoint connectorHealthActuatorEndpoint; @BeforeEach void setUp() { - this.connectorHealthActuatorEndpoint = new ConnectorHealthActuatorEndpoint(); + MeterRegistry meterRegistry = mockMeterRegistry(); + this.counters = new Counters(meterRegistry); + this.connectorHealthActuatorEndpoint = new ConnectorHealthActuatorEndpoint(counters); } @ParameterizedTest @MethodSource("provideTestData") void checkCloudConnectionStatus(boolean isConnected) { // when - connectorHealthActuatorEndpoint.setCloudConnectionStatus(isConnected); + counters.setCloudConnectionStatus(isConnected); boolean cloudConnectionStatus = (boolean) connectorHealthActuatorEndpoint.health().getDetails() .get("cloudConnectionStatus"); // then assertEquals(isConnected, cloudConnectionStatus); - assertEquals(isConnected, connectorHealthActuatorEndpoint.isCloudConnectionStatus()); } @ParameterizedTest @MethodSource("provideTestData") void checkLoConnectionStatus(boolean isConnected) { // when - connectorHealthActuatorEndpoint.setLoConnectionStatus(isConnected); + counters.setLoConnectionStatus(isConnected); boolean loMqttConnectionStatus = (boolean) connectorHealthActuatorEndpoint.health().getDetails() .get("loMqttConnectionStatus"); // then assertEquals(isConnected, loMqttConnectionStatus); - assertEquals(isConnected, connectorHealthActuatorEndpoint.isLoConnectionStatus()); } @ParameterizedTest @@ -64,4 +76,16 @@ private static Stream provideTestData() { Arguments.of(false)); } + private MeterRegistry mockMeterRegistry() { + StepMeterRegistry meterRegistry = mock(StepMeterRegistry.class); + when(meterRegistry.counter("message.read")).thenReturn(mock(Counter.class)); + when(meterRegistry.counter("message.sent")).thenReturn(mock(Counter.class)); + when(meterRegistry.counter("message.sent.attempt")).thenReturn(mock(Counter.class)); + when(meterRegistry.counter("message.sent.attempt.failed")).thenReturn(mock(Counter.class)); + when(meterRegistry.counter("message.sent.failed")).thenReturn(mock(Counter.class)); + when(meterRegistry.gauge(eq("status.connection.lo"), any())).thenReturn(new AtomicInteger()); + when(meterRegistry.gauge(eq("status.connection.cloud"), any())).thenReturn(new AtomicInteger()); + + return meterRegistry; + } } \ No newline at end of file