diff --git a/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/extension/IProtocolExtension.java b/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/extension/IProtocolExtension.java index 180bc8649..b9fc81214 100644 --- a/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/extension/IProtocolExtension.java +++ b/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/extension/IProtocolExtension.java @@ -89,8 +89,9 @@ public interface IProtocolExtension { * telemetry manager. * * @param telemetryManager The telemetry manager to use for monitoring. + * @return Optional.of(true) if the protocol check succeeds, Optional.of(false) otherwise. */ - void checkProtocol(TelemetryManager telemetryManager); + Optional checkProtocol(TelemetryManager telemetryManager); /** * Executes a source operation based on the given source and configuration within the telemetry manager. @@ -141,4 +142,11 @@ public interface IProtocolExtension { */ IConfiguration buildConfiguration(String configurationType, JsonNode jsonNode, UnaryOperator decrypt) throws InvalidConfigurationException; + + /** + * Returns the identifier for protocol extension. + * + * @return The protocol identifier as a string. + */ + String getIdentifier(); } diff --git a/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/strategy/collect/ProtocolHealthCheckStrategy.java b/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/strategy/collect/ProtocolHealthCheckStrategy.java index de980b896..c13afd0f7 100644 --- a/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/strategy/collect/ProtocolHealthCheckStrategy.java +++ b/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/strategy/collect/ProtocolHealthCheckStrategy.java @@ -24,11 +24,11 @@ import java.util.List; import lombok.Builder; import lombok.NonNull; -import lombok.extern.slf4j.Slf4j; import org.sentrysoftware.metricshub.engine.client.ClientsExecutor; import org.sentrysoftware.metricshub.engine.extension.ExtensionManager; import org.sentrysoftware.metricshub.engine.extension.IProtocolExtension; import org.sentrysoftware.metricshub.engine.strategy.AbstractStrategy; +import org.sentrysoftware.metricshub.engine.telemetry.MetricFactory; import org.sentrysoftware.metricshub.engine.telemetry.TelemetryManager; /** @@ -42,7 +42,6 @@ * responding or not. *

*/ -@Slf4j public class ProtocolHealthCheckStrategy extends AbstractStrategy { /** @@ -78,14 +77,23 @@ public ProtocolHealthCheckStrategy( @Override public void run() { - // Retrieve the hostname - final String hostname = telemetryManager.getHostConfiguration().getHostname(); - - log.info("Hostname {} - Performing protocol health check.", hostname); - // Call the extensions to check the protocol health final List protocolExtensions = extensionManager.findProtocolCheckExtensions(telemetryManager); - protocolExtensions.forEach(protocolExtension -> protocolExtension.checkProtocol(telemetryManager)); + // CHECKSTYLE:OFF + protocolExtensions.forEach(protocolExtension -> + protocolExtension + .checkProtocol(telemetryManager) + .ifPresent(isUp -> + new MetricFactory() + .collectNumberMetric( + telemetryManager.getEndpointHostMonitor(), + "metricshub.host.up{protocol=\"" + protocolExtension.getIdentifier() + "\"}", + isUp ? UP : DOWN, + telemetryManager.getStrategyTime() + ) + ) + ); + // CHECKSTYLE:ON } @Override diff --git a/metricshub-engine/src/test/java/org/sentrysoftware/metricshub/engine/strategy/collect/ProtocolHealthCheckStrategyTest.java b/metricshub-engine/src/test/java/org/sentrysoftware/metricshub/engine/strategy/collect/ProtocolHealthCheckStrategyTest.java index 0d3793134..a57db6c28 100644 --- a/metricshub-engine/src/test/java/org/sentrysoftware/metricshub/engine/strategy/collect/ProtocolHealthCheckStrategyTest.java +++ b/metricshub-engine/src/test/java/org/sentrysoftware/metricshub/engine/strategy/collect/ProtocolHealthCheckStrategyTest.java @@ -1,8 +1,6 @@ package org.sentrysoftware.metricshub.engine.strategy.collect; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.sentrysoftware.metricshub.engine.common.helpers.KnownMonitorType.HOST; import static org.sentrysoftware.metricshub.engine.constants.Constants.HOSTNAME; @@ -82,8 +80,6 @@ void testCheckHealth() throws Exception { .when(protocolExtensionMock) .isValidConfiguration(telemetryManager.getHostConfiguration().getConfigurations().get(TestConfiguration.class)); - doNothing().when(protocolExtensionMock).checkProtocol(any(TelemetryManager.class)); - // Create a new protocol health check strategy final ProtocolHealthCheckStrategy healthCheckStrategy = new ProtocolHealthCheckStrategy( telemetryManager, diff --git a/metricshub-http-extension/src/main/java/org/sentrysoftware/metricshub/extension/http/HttpExtension.java b/metricshub-http-extension/src/main/java/org/sentrysoftware/metricshub/extension/http/HttpExtension.java index 02303e40d..576d393bd 100644 --- a/metricshub-http-extension/src/main/java/org/sentrysoftware/metricshub/extension/http/HttpExtension.java +++ b/metricshub-http-extension/src/main/java/org/sentrysoftware/metricshub/extension/http/HttpExtension.java @@ -28,6 +28,7 @@ import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.UnaryOperator; import lombok.extern.slf4j.Slf4j; @@ -41,8 +42,6 @@ import org.sentrysoftware.metricshub.engine.extension.IProtocolExtension; import org.sentrysoftware.metricshub.engine.strategy.detection.CriterionTestResult; import org.sentrysoftware.metricshub.engine.strategy.source.SourceTable; -import org.sentrysoftware.metricshub.engine.telemetry.MetricFactory; -import org.sentrysoftware.metricshub.engine.telemetry.Monitor; import org.sentrysoftware.metricshub.engine.telemetry.TelemetryManager; import org.sentrysoftware.metricshub.extension.http.utils.HttpRequest; @@ -53,6 +52,11 @@ @Slf4j public class HttpExtension implements IProtocolExtension { + /** + * The identifier for the Http protocol. + */ + private static final String IDENTIFIER = "http"; + private HttpRequestExecutor httpRequestExecutor; /** @@ -62,21 +66,6 @@ public HttpExtension() { httpRequestExecutor = new HttpRequestExecutor(); } - /** - * Protocol up status value '1.0' - */ - public static final Double UP = 1.0; - - /** - * Protocol down status value '0.0' - */ - public static final Double DOWN = 0.0; - - /** - * Up metric name format that will be saved by the metric factory - */ - public static final String HTTP_UP_METRIC = "metricshub.host.up{protocol=\"http\"}"; - @Override public boolean isValidConfiguration(IConfiguration configuration) { return configuration instanceof HttpConfiguration; @@ -98,13 +87,10 @@ public Set> getSupportedCriteria() { } @Override - public void checkProtocol(TelemetryManager telemetryManager) { + public Optional checkProtocol(TelemetryManager telemetryManager) { // Retrieve the hostname final String hostname = telemetryManager.getHostConfiguration().getHostname(); - // Retrieve the host endpoint monitor - final Monitor hostMonitor = telemetryManager.getEndpointHostMonitor(); - // Create and set the HTTP result to null String httpResult = null; @@ -116,9 +102,10 @@ public void checkProtocol(TelemetryManager telemetryManager) { // Stop the HTTP health check if there is not an HTTP configuration if (httpConfiguration == null) { - return; + return Optional.empty(); } + log.info("Hostname {} - Performing {} protocol health check.", hostname, getIdentifier()); log.info("Hostname {} - Checking HTTP protocol status. Sending GET request to '/'.", hostname); // Execute HTTP test request @@ -142,16 +129,7 @@ public void checkProtocol(TelemetryManager telemetryManager) { ); } - // Generate a metric from the Http result - // CHECKSTYLE:OFF - new MetricFactory() - .collectNumberMetric( - hostMonitor, - HTTP_UP_METRIC, - httpResult != null ? UP : DOWN, - telemetryManager.getStrategyTime() - ); - // CHECKSTYLE:ON + return Optional.of(httpResult != null); } @Override @@ -188,7 +166,7 @@ public CriterionTestResult processCriterion( @Override public boolean isSupportedConfigurationType(String configurationType) { - return "http".equalsIgnoreCase(configurationType); + return IDENTIFIER.equalsIgnoreCase(configurationType); } @Override @@ -233,4 +211,9 @@ public static JsonMapper newObjectMapper() { .configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false) .build(); } + + @Override + public String getIdentifier() { + return IDENTIFIER; + } } diff --git a/metricshub-http-extension/src/test/java/org/sentrysoftware/metricshub/extension/http/HttpExtensionTest.java b/metricshub-http-extension/src/test/java/org/sentrysoftware/metricshub/extension/http/HttpExtensionTest.java index 54c786b85..070d13470 100644 --- a/metricshub-http-extension/src/test/java/org/sentrysoftware/metricshub/extension/http/HttpExtensionTest.java +++ b/metricshub-http-extension/src/test/java/org/sentrysoftware/metricshub/extension/http/HttpExtensionTest.java @@ -11,7 +11,6 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; import static org.sentrysoftware.metricshub.engine.common.helpers.KnownMonitorType.HOST; -import static org.sentrysoftware.metricshub.extension.http.HttpExtension.HTTP_UP_METRIC; import com.fasterxml.jackson.databind.node.BooleanNode; import com.fasterxml.jackson.databind.node.IntNode; @@ -21,6 +20,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import java.util.UUID; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -108,9 +108,10 @@ void testCheckHttpDownHealth() { .when(httpRequestExecutorMock) .executeHttp(any(HttpRequest.class), anyBoolean(), any(TelemetryManager.class)); - httpExtension.checkProtocol(telemetryManager); + Optional result = httpExtension.checkProtocol(telemetryManager); - assertEquals(HttpExtension.DOWN, telemetryManager.getEndpointHostMonitor().getMetric(HTTP_UP_METRIC).getValue()); + // Assert the result + assertFalse(result.get()); } @Test @@ -122,9 +123,10 @@ void testCheckHttpUpHealth() { .when(httpRequestExecutorMock) .executeHttp(any(HttpRequest.class), anyBoolean(), any(TelemetryManager.class)); - httpExtension.checkProtocol(telemetryManager); + Optional result = httpExtension.checkProtocol(telemetryManager); - assertEquals(HttpExtension.UP, telemetryManager.getEndpointHostMonitor().getMetric(HTTP_UP_METRIC).getValue()); + // Assert the result + assertTrue(result.get()); } @Test diff --git a/metricshub-ipmi-extension/src/main/java/org/sentrysoftware/metricshub/extension/ipmi/IpmiExtension.java b/metricshub-ipmi-extension/src/main/java/org/sentrysoftware/metricshub/extension/ipmi/IpmiExtension.java index ef4306f23..c0ce802b2 100644 --- a/metricshub-ipmi-extension/src/main/java/org/sentrysoftware/metricshub/extension/ipmi/IpmiExtension.java +++ b/metricshub-ipmi-extension/src/main/java/org/sentrysoftware/metricshub/extension/ipmi/IpmiExtension.java @@ -28,6 +28,7 @@ import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.UnaryOperator; import lombok.extern.slf4j.Slf4j; @@ -44,29 +45,17 @@ import org.sentrysoftware.metricshub.engine.extension.IProtocolExtension; import org.sentrysoftware.metricshub.engine.strategy.detection.CriterionTestResult; import org.sentrysoftware.metricshub.engine.strategy.source.SourceTable; -import org.sentrysoftware.metricshub.engine.telemetry.MetricFactory; -import org.sentrysoftware.metricshub.engine.telemetry.Monitor; import org.sentrysoftware.metricshub.engine.telemetry.TelemetryManager; @Slf4j public class IpmiExtension implements IProtocolExtension { - private IpmiRequestExecutor ipmiRequestExecutor = new IpmiRequestExecutor(); - /** - * Protocol up status value '1.0' + * The identifier for the Ipmi protocol. */ - public static final Double UP = 1.0; + private static final String IDENTIFIER = "ipmi"; - /** - * Protocol down status value '0.0' - */ - public static final Double DOWN = 0.0; - - /** - * IPMI Up metric - */ - public static final String IPMI_UP_METRIC = "metricshub.host.up{protocol=\"ipmi\"}"; + private IpmiRequestExecutor ipmiRequestExecutor = new IpmiRequestExecutor(); @Override public boolean isValidConfiguration(IConfiguration configuration) { @@ -89,13 +78,10 @@ public Set> getSupportedCriteria() { } @Override - public void checkProtocol(TelemetryManager telemetryManager) { + public Optional checkProtocol(TelemetryManager telemetryManager) { // Retrieve the hostname String hostname = telemetryManager.getHostConfiguration().getHostname(); - // Retrieve the host endpoint monitor - final Monitor hostMonitor = telemetryManager.getEndpointHostMonitor(); - // Create and set the IPMI result to null String ipmiResult = null; @@ -107,9 +93,10 @@ public void checkProtocol(TelemetryManager telemetryManager) { // Stop the IPMI health check if there is not an IPMI configuration if (ipmiConfiguration == null) { - return; + return Optional.empty(); } + log.info("Hostname {} - Performing {} protocol health check.", hostname, getIdentifier()); log.info( "Hostname {} - Checking IPMI protocol status. Sending a IPMI 'Get Chassis Status As String Result' request.", hostname @@ -135,17 +122,7 @@ public void checkProtocol(TelemetryManager telemetryManager) { e ); } - - // Generate a metric from the IPMI result - // CHECKSTYLE:OFF - new MetricFactory() - .collectNumberMetric( - hostMonitor, - IPMI_UP_METRIC, - ipmiResult != null ? UP : DOWN, - telemetryManager.getStrategyTime() - ); - // CHECKSTYLE:ON + return Optional.of(ipmiResult != null); } @Override @@ -226,7 +203,7 @@ public CriterionTestResult processCriterion( @Override public boolean isSupportedConfigurationType(String configurationType) { - return "ipmi".equalsIgnoreCase(configurationType); + return IDENTIFIER.equalsIgnoreCase(configurationType); } @Override @@ -271,4 +248,9 @@ public static JsonMapper newObjectMapper() { .configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false) .build(); } + + @Override + public String getIdentifier() { + return IDENTIFIER; + } } diff --git a/metricshub-ipmi-extension/src/test/java/org/sentrysoftware/IpmiExtensionTest.java b/metricshub-ipmi-extension/src/test/java/org/sentrysoftware/IpmiExtensionTest.java index cf6714a3a..0977a9512 100644 --- a/metricshub-ipmi-extension/src/test/java/org/sentrysoftware/IpmiExtensionTest.java +++ b/metricshub-ipmi-extension/src/test/java/org/sentrysoftware/IpmiExtensionTest.java @@ -8,9 +8,6 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; import static org.sentrysoftware.metricshub.engine.common.helpers.KnownMonitorType.HOST; -import static org.sentrysoftware.metricshub.engine.strategy.collect.ProtocolHealthCheckStrategy.DOWN; -import static org.sentrysoftware.metricshub.engine.strategy.collect.ProtocolHealthCheckStrategy.UP; -import static org.sentrysoftware.metricshub.extension.ipmi.IpmiExtension.IPMI_UP_METRIC; import com.fasterxml.jackson.databind.node.BooleanNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; @@ -18,6 +15,7 @@ import com.fasterxml.jackson.databind.node.TextNode; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import java.util.UUID; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; @@ -106,9 +104,9 @@ void testCheckIpmiUpHealth() { .thenReturn(SUCCESS_RESPONSE); // Start the IPMI Health Check strategy - ipmiExtension.checkProtocol(telemetryManager); + Optional result = ipmiExtension.checkProtocol(telemetryManager); - assertEquals(UP, telemetryManager.getEndpointHostMonitor().getMetric(IPMI_UP_METRIC).getValue()); + assertTrue(result.get()); } } @@ -123,9 +121,9 @@ void testCheckIpmiDownHealth() { .thenReturn(null); // Start the IPMI Health Check strategy - ipmiExtension.checkProtocol(telemetryManager); + Optional result = ipmiExtension.checkProtocol(telemetryManager); - assertEquals(DOWN, telemetryManager.getEndpointHostMonitor().getMetric(IPMI_UP_METRIC).getValue()); + assertFalse(result.get()); } } diff --git a/metricshub-oscommand-extension/src/main/java/org/sentrysoftware/metricshub/extension/oscommand/OsCommandExtension.java b/metricshub-oscommand-extension/src/main/java/org/sentrysoftware/metricshub/extension/oscommand/OsCommandExtension.java index 0a369445d..296cc3760 100644 --- a/metricshub-oscommand-extension/src/main/java/org/sentrysoftware/metricshub/extension/oscommand/OsCommandExtension.java +++ b/metricshub-oscommand-extension/src/main/java/org/sentrysoftware/metricshub/extension/oscommand/OsCommandExtension.java @@ -28,6 +28,7 @@ import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.UnaryOperator; import lombok.extern.slf4j.Slf4j; @@ -43,7 +44,6 @@ import org.sentrysoftware.metricshub.engine.extension.IProtocolExtension; import org.sentrysoftware.metricshub.engine.strategy.detection.CriterionTestResult; import org.sentrysoftware.metricshub.engine.strategy.source.SourceTable; -import org.sentrysoftware.metricshub.engine.telemetry.MetricFactory; import org.sentrysoftware.metricshub.engine.telemetry.TelemetryManager; import org.sentrysoftware.metricshub.extension.oscommand.ipmi.UnixIpmiCriterionProcessor; import org.sentrysoftware.metricshub.extension.oscommand.ipmi.UnixIpmiSourceProcessor; @@ -70,11 +70,6 @@ public class OsCommandExtension implements IProtocolExtension { */ public static final Double DOWN = 0.0; - /** - * Up metric name format that will be saved by the metric factory - */ - public static final String SSH_UP_METRIC = "metricshub.host.up{protocol=\"ssh\"}"; - /** * SSH test command to execute */ @@ -104,7 +99,7 @@ public Set> getSupportedCriteria() { } @Override - public void checkProtocol(TelemetryManager telemetryManager) { + public Optional checkProtocol(TelemetryManager telemetryManager) { // Create and set the SSH result to null Double sshResult = UP; @@ -119,9 +114,10 @@ public void checkProtocol(TelemetryManager telemetryManager) { // Stop the SSH health check if there is not any SSH configuration if (sshConfiguration == null || !telemetryManager.getHostProperties().isMustCheckSshStatus()) { - return; + return Optional.empty(); } + log.info("Hostname {} - Performing {} protocol health check.", hostname, getIdentifier()); log.info("Hostname {} - Checking SSH protocol status. Sending an SSH 'echo test' command.", hostname); // Execute Local test @@ -133,16 +129,7 @@ public void checkProtocol(TelemetryManager telemetryManager) { sshResult = remoteSshTest(hostname, sshResult, sshConfiguration); } - // Generate a metric from the SSH result - // CHECKSTYLE:OFF - new MetricFactory() - .collectNumberMetric( - telemetryManager.getEndpointHostMonitor(), - SSH_UP_METRIC, - sshResult, - telemetryManager.getStrategyTime() - ); - // CHECKSTYLE:ON + return Optional.of(sshResult == UP); } @Override @@ -318,4 +305,9 @@ public static JsonMapper newObjectMapper() { .configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false) .build(); } + + @Override + public String getIdentifier() { + return "ssh"; + } } diff --git a/metricshub-oscommand-extension/src/test/java/org/sentrysoftware/metricshub/extension/oscommand/OsCommandExtensionTest.java b/metricshub-oscommand-extension/src/test/java/org/sentrysoftware/metricshub/extension/oscommand/OsCommandExtensionTest.java index b486536c2..b026698d5 100644 --- a/metricshub-oscommand-extension/src/test/java/org/sentrysoftware/metricshub/extension/oscommand/OsCommandExtensionTest.java +++ b/metricshub-oscommand-extension/src/test/java/org/sentrysoftware/metricshub/extension/oscommand/OsCommandExtensionTest.java @@ -12,9 +12,6 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mockStatic; import static org.sentrysoftware.metricshub.engine.common.helpers.KnownMonitorType.HOST; -import static org.sentrysoftware.metricshub.engine.strategy.collect.ProtocolHealthCheckStrategy.DOWN; -import static org.sentrysoftware.metricshub.engine.strategy.collect.ProtocolHealthCheckStrategy.UP; -import static org.sentrysoftware.metricshub.extension.oscommand.OsCommandExtension.SSH_UP_METRIC; import com.fasterxml.jackson.databind.node.BooleanNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; @@ -26,6 +23,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.stream.Stream; import org.junit.jupiter.api.Test; @@ -325,9 +323,10 @@ void testCheckSshHealthLocally() { .thenReturn(SUCCESS_RESPONSE); // Start the SSH Health Check strategy - osCommandExtension.checkProtocol(telemetryManager); + Optional result = osCommandExtension.checkProtocol(telemetryManager); - assertEquals(UP, telemetryManager.getEndpointHostMonitor().getMetric(SSH_UP_METRIC).getValue()); + // Assert the result + assertTrue(result.get()); } try (MockedStatic staticOsCommandHelper = Mockito.mockStatic(OsCommandService.class)) { @@ -336,9 +335,10 @@ void testCheckSshHealthLocally() { .thenReturn(null); // Start the SSH Health Check strategy - osCommandExtension.checkProtocol(telemetryManager); + Optional result = osCommandExtension.checkProtocol(telemetryManager); - assertEquals(DOWN, telemetryManager.getEndpointHostMonitor().getMetric(SSH_UP_METRIC).getValue()); + // Assert the result + assertFalse(result.get()); } } @@ -360,9 +360,10 @@ void testCheckSshUpHealthRemotely() { .thenReturn(SUCCESS_RESPONSE); // Start the SSH Health Check strategy - osCommandExtension.checkProtocol(telemetryManager); + Optional result = osCommandExtension.checkProtocol(telemetryManager); - assertEquals(UP, telemetryManager.getEndpointHostMonitor().getMetric(SSH_UP_METRIC).getValue()); + // Assert the result + assertTrue(result.get()); } try (MockedStatic staticOsCommandHelper = Mockito.mockStatic(OsCommandService.class)) { @@ -373,9 +374,10 @@ void testCheckSshUpHealthRemotely() { .thenReturn(null); // Start the SSH Health Check strategy - osCommandExtension.checkProtocol(telemetryManager); + Optional result = osCommandExtension.checkProtocol(telemetryManager); - assertEquals(DOWN, telemetryManager.getEndpointHostMonitor().getMetric(SSH_UP_METRIC).getValue()); + // Assert the result + assertFalse(result.get()); } } @@ -402,9 +404,10 @@ void testCheckSshUpHealthBothLocallyAndRemotely() { .thenReturn(SUCCESS_RESPONSE); // Start the SSH Health Check strategy - osCommandExtension.checkProtocol(telemetryManager); + Optional result = osCommandExtension.checkProtocol(telemetryManager); - assertEquals(UP, telemetryManager.getEndpointHostMonitor().getMetric(SSH_UP_METRIC).getValue()); + // Assert the result + assertTrue(result.get()); } // Local commands not working @@ -420,9 +423,10 @@ void testCheckSshUpHealthBothLocallyAndRemotely() { .thenReturn(null); // Start the SSH Health Check strategy - osCommandExtension.checkProtocol(telemetryManager); + Optional result = osCommandExtension.checkProtocol(telemetryManager); - assertEquals(DOWN, telemetryManager.getEndpointHostMonitor().getMetric(SSH_UP_METRIC).getValue()); + // Assert the result + assertFalse(result.get()); } // remote command not working try (MockedStatic staticOsCommandHelper = Mockito.mockStatic(OsCommandService.class)) { @@ -437,9 +441,10 @@ void testCheckSshUpHealthBothLocallyAndRemotely() { .thenReturn(SUCCESS_RESPONSE); // Start the SSH Health Check strategy - osCommandExtension.checkProtocol(telemetryManager); + Optional result = osCommandExtension.checkProtocol(telemetryManager); - assertEquals(DOWN, telemetryManager.getEndpointHostMonitor().getMetric(SSH_UP_METRIC).getValue()); + // Assert the result + assertFalse(result.get()); } // Both local and remote commands not working, but not throwing exceptions @@ -454,10 +459,10 @@ void testCheckSshUpHealthBothLocallyAndRemotely() { .when(() -> OsCommandService.runLocalCommand(anyString(), anyLong(), any())) .thenReturn(null); - // Start the SSH Health Check strategy - osCommandExtension.checkProtocol(telemetryManager); + Optional result = osCommandExtension.checkProtocol(telemetryManager); - assertEquals(DOWN, telemetryManager.getEndpointHostMonitor().getMetric(SSH_UP_METRIC).getValue()); + // Assert the result + assertFalse(result.get()); } } @@ -472,9 +477,10 @@ void testCheckSshNoHealthWhenMustCheckFalse() { telemetryManager.getHostProperties().setOsCommandExecutesRemotely(true); // Start the SSH Health Check strategy - osCommandExtension.checkProtocol(telemetryManager); + Optional result = osCommandExtension.checkProtocol(telemetryManager); - assertNull(telemetryManager.getEndpointHostMonitor().getMetric(SSH_UP_METRIC)); + // Assert the result + assertEquals(Optional.empty(), result); } @Test @@ -488,10 +494,10 @@ void testCheckSshNoHealthWhenNoConfiguration() { telemetryManager.getHostProperties().setOsCommandExecutesRemotely(true); // Start the SSH Health Check strategy - osCommandExtension.checkProtocol(telemetryManager); + Optional result = osCommandExtension.checkProtocol(telemetryManager); - // make sure that SSH health check is not performed if an SSH config is not present - assertNull(telemetryManager.getEndpointHostMonitor().getMetric(SSH_UP_METRIC)); + // Assert the result + assertEquals(Optional.empty(), result); } @Test diff --git a/metricshub-ping-extension/src/main/java/org/sentrysoftware/metricshub/extension/ping/PingExtension.java b/metricshub-ping-extension/src/main/java/org/sentrysoftware/metricshub/extension/ping/PingExtension.java index 720462451..65606bd3f 100644 --- a/metricshub-ping-extension/src/main/java/org/sentrysoftware/metricshub/extension/ping/PingExtension.java +++ b/metricshub-ping-extension/src/main/java/org/sentrysoftware/metricshub/extension/ping/PingExtension.java @@ -28,6 +28,7 @@ import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.UnaryOperator; import lombok.extern.slf4j.Slf4j; @@ -38,8 +39,6 @@ import org.sentrysoftware.metricshub.engine.extension.IProtocolExtension; import org.sentrysoftware.metricshub.engine.strategy.detection.CriterionTestResult; import org.sentrysoftware.metricshub.engine.strategy.source.SourceTable; -import org.sentrysoftware.metricshub.engine.telemetry.MetricFactory; -import org.sentrysoftware.metricshub.engine.telemetry.Monitor; import org.sentrysoftware.metricshub.engine.telemetry.TelemetryManager; /** @@ -49,27 +48,17 @@ @Slf4j public class PingExtension implements IProtocolExtension { + /** + * The identifier for ping. + */ + private static final String IDENTIFIER = "ping"; + private PingRequestExecutor pingRequestExecutor; public PingExtension() { pingRequestExecutor = new PingRequestExecutor(); } - /** - * Protocol up status value '1.0' - */ - public static final Double UP = 1.0; - - /** - * Protocol down status value '0.0' - */ - public static final Double DOWN = 0.0; - - /** - * ICMP Ping Up metric name format that will be saved by the metric factory - */ - public static final String PING_UP_METRIC = "metricshub.host.up{protocol=\"ping\"}"; - @Override public boolean isValidConfiguration(IConfiguration configuration) { return configuration instanceof PingConfiguration; @@ -91,13 +80,10 @@ public Set> getSupportedCriteria() { } @Override - public void checkProtocol(TelemetryManager telemetryManager) { + public Optional checkProtocol(TelemetryManager telemetryManager) { // Retrieve the hostname final String hostname = telemetryManager.getHostConfiguration().getHostname(); - // Retrieve the host endpoint monitor - final Monitor hostMonitor = telemetryManager.getEndpointHostMonitor(); - // Create and set the Ping result to null boolean pingResult = false; @@ -109,8 +95,10 @@ public void checkProtocol(TelemetryManager telemetryManager) { // Stop the Ping check if there is not a Ping configuration if (pingConfiguration == null) { - return; + return Optional.empty(); } + + log.info("Hostname {} - Performing {} protocol health check.", hostname, getIdentifier()); log.info("Hostname {} - Checking Ping protocol status. Sending a ping to '/'.", hostname); // Execute a Ping request @@ -119,12 +107,7 @@ public void checkProtocol(TelemetryManager telemetryManager) { } catch (Exception e) { log.debug("Hostname {} - Checking Ping protocol status. Exception when performing a Ping request: ", hostname, e); } - - // Generate a metric from the Ping result - // CHECKSTYLE:OFF - new MetricFactory() - .collectNumberMetric(hostMonitor, PING_UP_METRIC, pingResult ? UP : DOWN, telemetryManager.getStrategyTime()); - // CHECKSTYLE:ON + return Optional.of(pingResult); } @Override @@ -143,7 +126,7 @@ public CriterionTestResult processCriterion( @Override public boolean isSupportedConfigurationType(String configurationType) { - return "ping".equalsIgnoreCase(configurationType); + return IDENTIFIER.equalsIgnoreCase(configurationType); } @Override @@ -178,4 +161,9 @@ public static JsonMapper newObjectMapper() { .configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false) .build(); } + + @Override + public String getIdentifier() { + return IDENTIFIER; + } } diff --git a/metricshub-ping-extension/src/test/java/org/sentrysoftware/metricshub/extension/ping/PingExtensionTest.java b/metricshub-ping-extension/src/test/java/org/sentrysoftware/metricshub/extension/ping/PingExtensionTest.java index 733b38787..6845afd8c 100644 --- a/metricshub-ping-extension/src/test/java/org/sentrysoftware/metricshub/extension/ping/PingExtensionTest.java +++ b/metricshub-ping-extension/src/test/java/org/sentrysoftware/metricshub/extension/ping/PingExtensionTest.java @@ -7,7 +7,6 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doReturn; import static org.sentrysoftware.metricshub.engine.common.helpers.KnownMonitorType.HOST; -import static org.sentrysoftware.metricshub.extension.ping.PingExtension.PING_UP_METRIC; import com.fasterxml.jackson.databind.node.IntNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; @@ -16,6 +15,7 @@ import java.net.UnknownHostException; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import java.util.UUID; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -92,9 +92,10 @@ void testCheckPingDown() throws UnknownHostException { // Mock false protocol health check response doReturn(false).when(pingRequestExecutorMock).ping(anyString(), anyInt()); - pingExtension.checkProtocol(telemetryManager); + Optional result = pingExtension.checkProtocol(telemetryManager); - assertEquals(PingExtension.DOWN, telemetryManager.getEndpointHostMonitor().getMetric(PING_UP_METRIC).getValue()); + // Assert the result + assertFalse(result.get()); } @Test @@ -104,9 +105,10 @@ void testCheckPingUp() throws UnknownHostException { // Mock ICMP Ping protocol health check response doReturn(true).when(pingRequestExecutorMock).ping(anyString(), anyInt()); - pingExtension.checkProtocol(telemetryManager); + Optional result = pingExtension.checkProtocol(telemetryManager); - assertEquals(PingExtension.UP, telemetryManager.getEndpointHostMonitor().getMetric(PING_UP_METRIC).getValue()); + // Assert the result + assertTrue(result.get()); } @Test diff --git a/metricshub-snmp-extension/src/main/java/org/sentrysoftware/metricshub/extension/snmp/SnmpExtension.java b/metricshub-snmp-extension/src/main/java/org/sentrysoftware/metricshub/extension/snmp/SnmpExtension.java index 8b2826561..76e0a608f 100644 --- a/metricshub-snmp-extension/src/main/java/org/sentrysoftware/metricshub/extension/snmp/SnmpExtension.java +++ b/metricshub-snmp-extension/src/main/java/org/sentrysoftware/metricshub/extension/snmp/SnmpExtension.java @@ -28,6 +28,7 @@ import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.function.UnaryOperator; @@ -45,8 +46,6 @@ import org.sentrysoftware.metricshub.engine.extension.IProtocolExtension; import org.sentrysoftware.metricshub.engine.strategy.detection.CriterionTestResult; import org.sentrysoftware.metricshub.engine.strategy.source.SourceTable; -import org.sentrysoftware.metricshub.engine.telemetry.MetricFactory; -import org.sentrysoftware.metricshub.engine.telemetry.Monitor; import org.sentrysoftware.metricshub.engine.telemetry.TelemetryManager; import org.sentrysoftware.metricshub.extension.snmp.detection.SnmpGetCriterionProcessor; import org.sentrysoftware.metricshub.extension.snmp.detection.SnmpGetNextCriterionProcessor; @@ -72,24 +71,14 @@ public SnmpExtension() { } /** - * Protocol up status value '1.0' - */ - public static final Double UP = 1.0; - - /** - * Protocol down status value '0.0' - */ - public static final Double DOWN = 0.0; - - /** - * Up metric name format that will be saved by the metric factory + * The SNMP OID value to use in the health check test */ - static final String SNMP_UP_METRIC = "metricshub.host.up{protocol=\"snmp\"}"; + public static final String SNMP_OID = "1.3.6.1"; /** - * The SNMP OID value to use in the health check test + * The identifier for the Snmp protocol. */ - public static final String SNMP_OID = "1.3.6.1"; + private static final String IDENTIFIER = "snmp"; @Override public boolean isValidConfiguration(IConfiguration configuration) { @@ -107,13 +96,10 @@ public Set> getSupportedCriteria() { } @Override - public void checkProtocol(TelemetryManager telemetryManager) { + public Optional checkProtocol(TelemetryManager telemetryManager) { // Retrieve the hostname final String hostname = telemetryManager.getHostConfiguration().getHostname(); - // Retrieve the host endpoint monitor - final Monitor hostMonitor = telemetryManager.getEndpointHostMonitor(); - // Create and set the SNMP result to null String snmpResult = null; @@ -125,9 +111,10 @@ public void checkProtocol(TelemetryManager telemetryManager) { // Stop the SNMP health check if there is not an SNMP configuration if (snmpConfiguration == null) { - return; + return Optional.empty(); } + log.info("Hostname {} - Performing {} protocol health check.", hostname, getIdentifier()); log.info("Hostname {} - Checking SNMP protocol status. Sending Get Next request on {}.", hostname, SNMP_OID); // Execute SNMP test command @@ -141,17 +128,7 @@ public void checkProtocol(TelemetryManager telemetryManager) { e ); } - - // Generate a metric from the SNMP result - // CHECKSTYLE:OFF - new MetricFactory() - .collectNumberMetric( - hostMonitor, - SNMP_UP_METRIC, - snmpResult != null ? UP : DOWN, - telemetryManager.getStrategyTime() - ); - // CHECKSTYLE:ON + return Optional.of(snmpResult != null); } @Override @@ -207,7 +184,7 @@ public Map, Set>> getCon @Override public boolean isSupportedConfigurationType(String configurationType) { - return "snmp".equalsIgnoreCase(configurationType); + return IDENTIFIER.equalsIgnoreCase(configurationType); } @Override @@ -255,4 +232,9 @@ public static JsonMapper newObjectMapper() { .configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false) .build(); } + + @Override + public String getIdentifier() { + return IDENTIFIER; + } } diff --git a/metricshub-snmp-extension/src/test/java/org/sentrysoftware/metricshub/extension/snmp/SnmpExtensionTest.java b/metricshub-snmp-extension/src/test/java/org/sentrysoftware/metricshub/extension/snmp/SnmpExtensionTest.java index c62fb8993..79a08911f 100644 --- a/metricshub-snmp-extension/src/test/java/org/sentrysoftware/metricshub/extension/snmp/SnmpExtensionTest.java +++ b/metricshub-snmp-extension/src/test/java/org/sentrysoftware/metricshub/extension/snmp/SnmpExtensionTest.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.databind.node.TextNode; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import java.util.UUID; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; @@ -482,12 +483,9 @@ void testCheckSnmpUpHealth() throws InterruptedException, ExecutionException, Ti .executeSNMPGetNext(eq(SnmpExtension.SNMP_OID), any(SnmpConfiguration.class), anyString(), anyBoolean()); // Start the SNMP protocol check - snmpExtension.checkProtocol(telemetryManager); + Optional result = snmpExtension.checkProtocol(telemetryManager); - assertEquals( - SnmpExtension.UP, - telemetryManager.getEndpointHostMonitor().getMetric(SnmpExtension.SNMP_UP_METRIC).getValue() - ); + assertTrue(result.get()); } @Test @@ -501,12 +499,9 @@ void testCheckSnmpDownHealth() throws InterruptedException, ExecutionException, .executeSNMPGetNext(eq(SnmpExtension.SNMP_OID), any(SnmpConfiguration.class), anyString(), anyBoolean()); // Start the SNMP protocol check - snmpExtension.checkProtocol(telemetryManager); + Optional result = snmpExtension.checkProtocol(telemetryManager); - assertEquals( - SnmpExtension.DOWN, - telemetryManager.getEndpointHostMonitor().getMetric(SnmpExtension.SNMP_UP_METRIC).getValue() - ); + assertFalse(result.get()); } @Test diff --git a/metricshub-snmpv3-extension/src/main/java/org/sentrysoftware/metricshub/extension/snmpv3/SnmpV3Extension.java b/metricshub-snmpv3-extension/src/main/java/org/sentrysoftware/metricshub/extension/snmpv3/SnmpV3Extension.java index 965758cf1..b557002f2 100644 --- a/metricshub-snmpv3-extension/src/main/java/org/sentrysoftware/metricshub/extension/snmpv3/SnmpV3Extension.java +++ b/metricshub-snmpv3-extension/src/main/java/org/sentrysoftware/metricshub/extension/snmpv3/SnmpV3Extension.java @@ -28,6 +28,7 @@ import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.function.UnaryOperator; @@ -44,8 +45,6 @@ import org.sentrysoftware.metricshub.engine.extension.IProtocolExtension; import org.sentrysoftware.metricshub.engine.strategy.detection.CriterionTestResult; import org.sentrysoftware.metricshub.engine.strategy.source.SourceTable; -import org.sentrysoftware.metricshub.engine.telemetry.MetricFactory; -import org.sentrysoftware.metricshub.engine.telemetry.Monitor; import org.sentrysoftware.metricshub.engine.telemetry.TelemetryManager; import org.sentrysoftware.metricshub.extension.snmp.ISnmpConfiguration; import org.sentrysoftware.metricshub.extension.snmp.detection.SnmpGetCriterionProcessor; @@ -61,24 +60,14 @@ public class SnmpV3Extension implements IProtocolExtension { /** - * Protocol up status value '1.0' - */ - public static final Double UP = 1.0; - - /** - * Protocol down status value '0.0' - */ - public static final Double DOWN = 0.0; - - /** - * Up metric name format that will be saved by the metric factory + * The SNMP V3 OID value to use in the health check test */ - public static final String SNMPV3_UP_METRIC = "metricshub.host.up{protocol=\"snmpv3\"}"; + public static final String SNMPV3_OID = "1.3.6.1"; /** - * The SNMP V3 OID value to use in the health check test + * The identifier for the Snmp version 3 protocol. */ - public static final String SNMPV3_OID = "1.3.6.1"; + private static final String IDENTIFIER = "snmpv3"; private SnmpV3RequestExecutor snmpV3RequestExecutor; @@ -105,15 +94,12 @@ public Set> getSupportedCriteria() { } @Override - public void checkProtocol(TelemetryManager telemetryManager) { + public Optional checkProtocol(TelemetryManager telemetryManager) { // Retrieve the hostname final String hostname = telemetryManager.getHostConfiguration().getHostname(); - // Retrieve the host endpoint monitor - final Monitor hostMonitor = telemetryManager.getEndpointHostMonitor(); - // Create and set the SNMP V3 result to null - String snmpResult = null; + String snmpV3Result = null; // Retrieve SNMP V3 Configuration from the telemetry manager host configuration final SnmpV3Configuration snmpV3Configuration = (SnmpV3Configuration) telemetryManager @@ -123,14 +109,15 @@ public void checkProtocol(TelemetryManager telemetryManager) { // Stop the SNMP V3 health check if there is not an SNMP V3 configuration if (snmpV3Configuration == null) { - return; + return Optional.empty(); } + log.info("Hostname {} - Performing {} protocol health check.", hostname, getIdentifier()); log.info("Hostname {} - Checking SNMP V3 protocol status. Sending Get Next request on {}.", hostname, SNMPV3_OID); // Execute SNMP test command try { - snmpResult = snmpV3RequestExecutor.executeSNMPGetNext(SNMPV3_OID, snmpV3Configuration, hostname, true); + snmpV3Result = snmpV3RequestExecutor.executeSNMPGetNext(SNMPV3_OID, snmpV3Configuration, hostname, true); } catch (Exception e) { log.debug( "Hostname {} - Checking SNMP V3 protocol status. SNMP V3 exception when performing a SNMP Get Next query on {}: ", @@ -139,17 +126,7 @@ public void checkProtocol(TelemetryManager telemetryManager) { e ); } - - // Generate a metric from the SNMP result - // CHECKSTYLE:OFF - new MetricFactory() - .collectNumberMetric( - hostMonitor, - SNMPV3_UP_METRIC, - snmpResult != null ? UP : DOWN, - telemetryManager.getStrategyTime() - ); - // CHECKSTYLE:ON + return Optional.of(snmpV3Result != null); } @Override @@ -205,7 +182,7 @@ public Map, Set>> getCon @Override public boolean isSupportedConfigurationType(String configurationType) { - return "snmpv3".equalsIgnoreCase(configurationType); + return IDENTIFIER.equalsIgnoreCase(configurationType); } @Override @@ -264,4 +241,9 @@ public static JsonMapper newObjectMapper() { .configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false) .build(); } + + @Override + public String getIdentifier() { + return IDENTIFIER; + } } diff --git a/metricshub-snmpv3-extension/src/test/java/org/sentrysoftware/metricshub/extension/snmpv3/SnmpV3ExtensionTest.java b/metricshub-snmpv3-extension/src/test/java/org/sentrysoftware/metricshub/extension/snmpv3/SnmpV3ExtensionTest.java index eb6bbbea1..7d0363a03 100644 --- a/metricshub-snmpv3-extension/src/test/java/org/sentrysoftware/metricshub/extension/snmpv3/SnmpV3ExtensionTest.java +++ b/metricshub-snmpv3-extension/src/test/java/org/sentrysoftware/metricshub/extension/snmpv3/SnmpV3ExtensionTest.java @@ -3,7 +3,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; @@ -11,7 +10,6 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; import static org.sentrysoftware.metricshub.engine.common.helpers.KnownMonitorType.HOST; import com.fasterxml.jackson.databind.node.IntNode; @@ -20,6 +18,7 @@ import com.fasterxml.jackson.databind.node.TextNode; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import java.util.UUID; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; @@ -34,13 +33,9 @@ import org.sentrysoftware.metricshub.engine.connector.model.common.DeviceKind; import org.sentrysoftware.metricshub.engine.connector.model.identity.criterion.SnmpGetCriterion; import org.sentrysoftware.metricshub.engine.connector.model.identity.criterion.SnmpGetNextCriterion; -import org.sentrysoftware.metricshub.engine.connector.model.monitor.task.source.SnmpTableSource; -import org.sentrysoftware.metricshub.engine.connector.model.monitor.task.source.Source; import org.sentrysoftware.metricshub.engine.strategy.detection.CriterionTestResult; -import org.sentrysoftware.metricshub.engine.strategy.source.SourceTable; import org.sentrysoftware.metricshub.engine.telemetry.Monitor; import org.sentrysoftware.metricshub.engine.telemetry.TelemetryManager; -import org.sentrysoftware.metricshub.extension.snmp.source.SnmpTableSourceProcessor; import org.sentrysoftware.metricshub.extension.snmpv3.SnmpV3Configuration.AuthType; import org.sentrysoftware.metricshub.extension.snmpv3.SnmpV3Configuration.Privacy; @@ -494,12 +489,9 @@ void testCheckSnmpUpHealth() throws InterruptedException, ExecutionException, Ti .executeSNMPGetNext(eq(SnmpV3Extension.SNMPV3_OID), any(SnmpV3Configuration.class), anyString(), anyBoolean()); // Start the SNMP protocol check - snmpV3Extension.checkProtocol(telemetryManager); + Optional result = snmpV3Extension.checkProtocol(telemetryManager); - assertEquals( - SnmpV3Extension.UP, - telemetryManager.getEndpointHostMonitor().getMetric(SnmpV3Extension.SNMPV3_UP_METRIC).getValue() - ); + assertTrue(result.get()); } @Test @@ -513,12 +505,9 @@ void testCheckSnmpDownHealth() throws InterruptedException, ExecutionException, .executeSNMPGetNext(eq(SnmpV3Extension.SNMPV3_OID), any(SnmpV3Configuration.class), anyString(), anyBoolean()); // Start the SNMP protocol check - snmpV3Extension.checkProtocol(telemetryManager); + Optional result = snmpV3Extension.checkProtocol(telemetryManager); - assertEquals( - SnmpV3Extension.DOWN, - telemetryManager.getEndpointHostMonitor().getMetric(SnmpV3Extension.SNMPV3_UP_METRIC).getValue() - ); + assertFalse(result.get()); } @Test diff --git a/metricshub-wbem-extension/src/main/java/org/sentrysoftware/metricshub/extension/wbem/WbemExtension.java b/metricshub-wbem-extension/src/main/java/org/sentrysoftware/metricshub/extension/wbem/WbemExtension.java index 293bee852..a3005430e 100644 --- a/metricshub-wbem-extension/src/main/java/org/sentrysoftware/metricshub/extension/wbem/WbemExtension.java +++ b/metricshub-wbem-extension/src/main/java/org/sentrysoftware/metricshub/extension/wbem/WbemExtension.java @@ -29,6 +29,7 @@ import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.UnaryOperator; import lombok.extern.slf4j.Slf4j; @@ -41,8 +42,6 @@ import org.sentrysoftware.metricshub.engine.extension.IProtocolExtension; import org.sentrysoftware.metricshub.engine.strategy.detection.CriterionTestResult; import org.sentrysoftware.metricshub.engine.strategy.source.SourceTable; -import org.sentrysoftware.metricshub.engine.telemetry.MetricFactory; -import org.sentrysoftware.metricshub.engine.telemetry.Monitor; import org.sentrysoftware.metricshub.engine.telemetry.TelemetryManager; @Slf4j @@ -53,21 +52,6 @@ public class WbemExtension implements IProtocolExtension { */ private static final String INTEROP_LOWER_CASE = "interop"; - /** - * Protocol up status value '1.0' - */ - public static final Double UP = 1.0; - - /** - * Protocol down status value '0.0' - */ - public static final Double DOWN = 0.0; - - /** - * WBEM Up metric - */ - public static final String WBEM_UP_METRIC = "metricshub.host.up{protocol=\"wbem\"}"; - /** * List of WBEM protocol health check test Namespaces */ @@ -83,6 +67,11 @@ public class WbemExtension implements IProtocolExtension { */ public static final String WBEM_TEST_QUERY = "SELECT Name FROM CIM_NameSpace"; + /** + * The identifier for the Wbem protocol. + */ + private static final String IDENTIFIER = "wbem"; + private WbemRequestExecutor wbemRequestExecutor; /** @@ -113,15 +102,12 @@ public Set> getSupportedCriteria() { } @Override - public void checkProtocol(TelemetryManager telemetryManager) { + public Optional checkProtocol(TelemetryManager telemetryManager) { // Retrieve the hostname final String hostname = telemetryManager.getHostConfiguration().getHostname(); - // Retrieve the host endpoint monitor - final Monitor hostMonitor = telemetryManager.getEndpointHostMonitor(); - // Create and set the WBEM result to null - String wbemResult = null; + List> wbemResult = null; // Retrieve WBEM configuration from the telemetry manager final WbemConfiguration wbemConfiguration = (WbemConfiguration) telemetryManager @@ -131,17 +117,15 @@ public void checkProtocol(TelemetryManager telemetryManager) { // Stop the WBEM health check if there is not an WBEM configuration if (wbemConfiguration == null) { - return; + return Optional.empty(); } + log.info("Hostname {} - Performing {} protocol health check.", hostname, getIdentifier()); log.info( "Hostname {} - Checking WBEM protocol status. Sending a WQL SELECT request on different namespaces.", hostname ); - final Long strategyTime = telemetryManager.getStrategyTime(); - final MetricFactory metricFactory = new MetricFactory(); - for (final String wbemNamespace : WBEM_UP_TEST_NAMESPACES) { try { log.info( @@ -149,29 +133,18 @@ public void checkProtocol(TelemetryManager telemetryManager) { hostname, wbemNamespace ); - // The query on the WBEM namespace returned a result - //CHECKSTYLE:OFF - if ( + wbemResult = wbemRequestExecutor.executeWbem( hostname, wbemConfiguration, WBEM_TEST_QUERY, wbemNamespace, telemetryManager - ) != - null - //CHECKSTYLE:OFF - ) { - // Collect the metric with a '1.0' value and stop the test - metricFactory.collectNumberMetric(hostMonitor, WBEM_UP_METRIC, UP, strategyTime); - return; - } + ); } catch (Exception e) { if (wbemRequestExecutor.isAcceptableException(e)) { - // Collect the WBEM metric with a '1.0' value and stop the test as the thrown exception is acceptable - metricFactory.collectNumberMetric(hostMonitor, WBEM_UP_METRIC, UP, strategyTime); - return; + return Optional.of(true); } log.debug( "Hostname {} - Checking WBEM protocol status. WBEM exception when performing a WQL SELECT query on '{}' namespace: ", @@ -181,11 +154,7 @@ public void checkProtocol(TelemetryManager telemetryManager) { ); } } - - // Generate a metric from the WBEM result - // CHECKSTYLE:OFF - metricFactory.collectNumberMetric(hostMonitor, WBEM_UP_METRIC, wbemResult != null ? UP : DOWN, strategyTime); - // CHECKSTYLE:ON + return Optional.of(wbemResult != null); } @Override @@ -222,7 +191,7 @@ public SourceTable processSource(Source source, String connectorId, TelemetryMan @Override public boolean isSupportedConfigurationType(String configurationType) { - return "wbem".equalsIgnoreCase(configurationType); + return IDENTIFIER.equalsIgnoreCase(configurationType); } @Override @@ -265,4 +234,9 @@ public static JsonMapper newObjectMapper() { .configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false) .build(); } + + @Override + public String getIdentifier() { + return IDENTIFIER; + } } diff --git a/metricshub-wbem-extension/src/test/java/org/sentrysoftware/metricshub/extension/wbem/WbemExtensionTest.java b/metricshub-wbem-extension/src/test/java/org/sentrysoftware/metricshub/extension/wbem/WbemExtensionTest.java index cff7598f0..3bce1edef 100644 --- a/metricshub-wbem-extension/src/test/java/org/sentrysoftware/metricshub/extension/wbem/WbemExtensionTest.java +++ b/metricshub-wbem-extension/src/test/java/org/sentrysoftware/metricshub/extension/wbem/WbemExtensionTest.java @@ -14,7 +14,6 @@ import static org.mockito.Mockito.mockStatic; import static org.sentrysoftware.metricshub.engine.common.helpers.KnownMonitorType.HOST; import static org.sentrysoftware.metricshub.engine.common.helpers.MetricsHubConstants.AUTOMATIC_NAMESPACE; -import static org.sentrysoftware.metricshub.engine.strategy.collect.ProtocolHealthCheckStrategy.DOWN; import static org.sentrysoftware.metricshub.extension.wbem.WbemExtension.WBEM_TEST_QUERY; import com.fasterxml.jackson.databind.node.BooleanNode; @@ -27,6 +26,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -113,12 +113,9 @@ void testCheckProtocolUp() throws ClientException { .doWbemQuery(anyString(), any(WbemConfiguration.class), anyString(), anyString()); // Start the WBEM Health Check strategy - wbemExtension.checkProtocol(telemetryManager); + Optional result = wbemExtension.checkProtocol(telemetryManager); - assertEquals( - WbemExtension.UP, - telemetryManager.getEndpointHostMonitor().getMetric(WbemExtension.WBEM_UP_METRIC).getValue() - ); + assertTrue(result.get()); } { @@ -130,13 +127,10 @@ void testCheckProtocolUp() throws ClientException { doCallRealMethod().when(wbemRequestExecutorSpy).isAcceptableException(any()); - // Start the WBEM Health Check - wbemExtension.checkProtocol(telemetryManager); + // Start the WBEM Health Check strategy + Optional result = wbemExtension.checkProtocol(telemetryManager); - assertEquals( - WbemExtension.UP, - telemetryManager.getEndpointHostMonitor().getMetric(WbemExtension.WBEM_UP_METRIC).getValue() - ); + assertTrue(result.get()); } } @@ -150,9 +144,9 @@ void testCheckWbemDownHealth() throws ClientException { .doWbemQuery(anyString(), any(WbemConfiguration.class), anyString(), anyString()); // Start the WBEM Health Check strategy - wbemExtension.checkProtocol(telemetryManager); + Optional result = wbemExtension.checkProtocol(telemetryManager); - assertEquals(DOWN, telemetryManager.getEndpointHostMonitor().getMetric(WbemExtension.WBEM_UP_METRIC).getValue()); + assertFalse(result.get()); } @Test diff --git a/metricshub-winrm-extension/src/main/java/org/sentrysoftware/metricshub/extension/winrm/WinRmExtension.java b/metricshub-winrm-extension/src/main/java/org/sentrysoftware/metricshub/extension/winrm/WinRmExtension.java index 5a311768b..0c6879a89 100644 --- a/metricshub-winrm-extension/src/main/java/org/sentrysoftware/metricshub/extension/winrm/WinRmExtension.java +++ b/metricshub-winrm-extension/src/main/java/org/sentrysoftware/metricshub/extension/winrm/WinRmExtension.java @@ -29,6 +29,7 @@ import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.function.UnaryOperator; @@ -48,8 +49,6 @@ import org.sentrysoftware.metricshub.engine.extension.IProtocolExtension; import org.sentrysoftware.metricshub.engine.strategy.detection.CriterionTestResult; import org.sentrysoftware.metricshub.engine.strategy.source.SourceTable; -import org.sentrysoftware.metricshub.engine.telemetry.MetricFactory; -import org.sentrysoftware.metricshub.engine.telemetry.Monitor; import org.sentrysoftware.metricshub.engine.telemetry.TelemetryManager; import org.sentrysoftware.metricshub.extension.win.IWinConfiguration; import org.sentrysoftware.metricshub.extension.win.WinCommandService; @@ -69,21 +68,6 @@ @Slf4j public class WinRmExtension implements IProtocolExtension { - /** - * Protocol up status value '1.0' - */ - public static final Double UP = 1.0; - - /** - * Protocol down status value '0.0' - */ - public static final Double DOWN = 0.0; - - /** - * WinRm Up metric name format that will be saved by the metric factory - */ - public static final String WINRM_UP_METRIC = "metricshub.host.up{protocol=\"winrm\"}"; - /** * WinRm Test Query */ @@ -94,6 +78,11 @@ public class WinRmExtension implements IProtocolExtension { */ public static final String WINRM_TEST_NAMESPACE = "root\\cimv2"; + /** + * The identifier for the WinRm protocol. + */ + private static final String IDENTIFIER = "winrm"; + private WinRmRequestExecutor winRmRequestExecutor; private WmiDetectionService wmiDetectionService; private WinCommandService winCommandService; @@ -128,7 +117,7 @@ public Set> getSupportedCriteria() { } @Override - public void checkProtocol(TelemetryManager telemetryManager) { + public Optional checkProtocol(TelemetryManager telemetryManager) { // Retrieve WinRM Configuration from the telemetry manager host configuration final WinRmConfiguration winRmConfiguration = (WinRmConfiguration) telemetryManager .getHostConfiguration() @@ -137,7 +126,7 @@ public void checkProtocol(TelemetryManager telemetryManager) { // Stop the health check if there is not an WinRM configuration if (winRmConfiguration == null) { - return; + return Optional.empty(); } // Create and set the WinRM result to null @@ -146,29 +135,19 @@ public void checkProtocol(TelemetryManager telemetryManager) { // Retrieve the hostname final String hostname = telemetryManager.getHostname(); + log.info("Hostname {} - Performing {} protocol health check.", hostname, getIdentifier()); log.info( "Hostname {} - Checking WinRM protocol status. Sending a WQL SELECT request on {} namespace.", hostname, WINRM_TEST_NAMESPACE ); - // Retrieve the host endpoint monitor - final Monitor hostMonitor = telemetryManager.getEndpointHostMonitor(); - - // Create the MetricFactory in order to collect the up metric - final MetricFactory metricFactory = new MetricFactory(); - - // Get the strategy time which represents the collect time of the up metric - final Long strategyTime = telemetryManager.getStrategyTime(); - try { winRmResult = winRmRequestExecutor.executeWmi(hostname, winRmConfiguration, WINRM_TEST_QUERY, WINRM_TEST_NAMESPACE); } catch (Exception e) { if (winRmRequestExecutor.isAcceptableException(e)) { - // Generate a metric from the WinRM result - metricFactory.collectNumberMetric(hostMonitor, WINRM_UP_METRIC, UP, strategyTime); - return; + return Optional.of(true); } log.debug( "Hostname {} - Checking WinRM protocol status. WinRM exception when performing a WQL SELECT request on {} namespace: ", @@ -178,8 +157,7 @@ public void checkProtocol(TelemetryManager telemetryManager) { ); } - // Generate a metric from the WinRm result - metricFactory.collectNumberMetric(hostMonitor, WINRM_UP_METRIC, winRmResult != null ? UP : DOWN, strategyTime); + return Optional.of(winRmResult != null); } @Override @@ -241,7 +219,7 @@ public SourceTable processSource(Source source, String connectorId, TelemetryMan @Override public boolean isSupportedConfigurationType(String configurationType) { - return "winrm".equalsIgnoreCase(configurationType); + return IDENTIFIER.equalsIgnoreCase(configurationType); } @Override @@ -289,4 +267,9 @@ public static JsonMapper newObjectMapper() { .configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false) .build(); } + + @Override + public String getIdentifier() { + return IDENTIFIER; + } } diff --git a/metricshub-winrm-extension/src/test/java/org/sentrysoftware/metricshub/extension/winrm/WinRmExtensionTest.java b/metricshub-winrm-extension/src/test/java/org/sentrysoftware/metricshub/extension/winrm/WinRmExtensionTest.java index d8a3bd9ef..46af0d6e6 100644 --- a/metricshub-winrm-extension/src/test/java/org/sentrysoftware/metricshub/extension/winrm/WinRmExtensionTest.java +++ b/metricshub-winrm-extension/src/test/java/org/sentrysoftware/metricshub/extension/winrm/WinRmExtensionTest.java @@ -13,11 +13,8 @@ import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mockStatic; import static org.sentrysoftware.metricshub.engine.common.helpers.KnownMonitorType.HOST; -import static org.sentrysoftware.metricshub.extension.winrm.WinRmExtension.DOWN; -import static org.sentrysoftware.metricshub.extension.winrm.WinRmExtension.UP; import static org.sentrysoftware.metricshub.extension.winrm.WinRmExtension.WINRM_TEST_NAMESPACE; import static org.sentrysoftware.metricshub.extension.winrm.WinRmExtension.WINRM_TEST_QUERY; -import static org.sentrysoftware.metricshub.extension.winrm.WinRmExtension.WINRM_UP_METRIC; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.IntNode; @@ -28,6 +25,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; import org.junit.jupiter.api.Test; @@ -150,10 +148,10 @@ void testCheckProtocolUp() throws ClientException { .when(winRmRequestExecutorMock) .executeWmi(anyString(), any(WinRmConfiguration.class), eq(WINRM_TEST_QUERY), eq(WINRM_TEST_NAMESPACE)); - // Start the WinRm Health Check strategy - WinRmExtension.checkProtocol(telemetryManager); + // Start the WinRm Health Check + Optional result = WinRmExtension.checkProtocol(telemetryManager); - assertEquals(UP, telemetryManager.getEndpointHostMonitor().getMetric(WINRM_UP_METRIC).getValue()); + assertTrue(result.get()); } { @@ -165,9 +163,9 @@ void testCheckProtocolUp() throws ClientException { doCallRealMethod().when(winRmRequestExecutorMock).isAcceptableException(any()); // Start the WinRm Health Check - WinRmExtension.checkProtocol(telemetryManager); + Optional result = WinRmExtension.checkProtocol(telemetryManager); - assertEquals(UP, telemetryManager.getEndpointHostMonitor().getMetric(WINRM_UP_METRIC).getValue()); + assertTrue(result.get()); } } @@ -182,9 +180,9 @@ void testCheckProtocolDown() throws ClientException { .executeWmi(anyString(), any(WinRmConfiguration.class), eq(WINRM_TEST_QUERY), eq(WINRM_TEST_NAMESPACE)); // Start the WinRm Health Check - WinRmExtension.checkProtocol(telemetryManager); + Optional result = WinRmExtension.checkProtocol(telemetryManager); - assertEquals(DOWN, telemetryManager.getEndpointHostMonitor().getMetric(WINRM_UP_METRIC).getValue()); + assertFalse(result.get()); } @Test diff --git a/metricshub-wmi-extension/src/main/java/org/sentrysoftware/metricshub/extension/wmi/WmiExtension.java b/metricshub-wmi-extension/src/main/java/org/sentrysoftware/metricshub/extension/wmi/WmiExtension.java index 38c5c36ad..9ee96e5dc 100644 --- a/metricshub-wmi-extension/src/main/java/org/sentrysoftware/metricshub/extension/wmi/WmiExtension.java +++ b/metricshub-wmi-extension/src/main/java/org/sentrysoftware/metricshub/extension/wmi/WmiExtension.java @@ -29,6 +29,7 @@ import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.function.UnaryOperator; @@ -49,8 +50,6 @@ import org.sentrysoftware.metricshub.engine.extension.IProtocolExtension; import org.sentrysoftware.metricshub.engine.strategy.detection.CriterionTestResult; import org.sentrysoftware.metricshub.engine.strategy.source.SourceTable; -import org.sentrysoftware.metricshub.engine.telemetry.MetricFactory; -import org.sentrysoftware.metricshub.engine.telemetry.Monitor; import org.sentrysoftware.metricshub.engine.telemetry.TelemetryManager; import org.sentrysoftware.metricshub.extension.win.IWinConfiguration; import org.sentrysoftware.metricshub.extension.win.WinCommandService; @@ -71,21 +70,6 @@ @Slf4j public class WmiExtension implements IProtocolExtension { - /** - * Protocol up status value '1.0' - */ - public static final Double UP = 1.0; - - /** - * Protocol down status value '0.0' - */ - public static final Double DOWN = 0.0; - - /** - * Up metric name format that will be saved by the metric factory - */ - public static final String WMI_UP_METRIC = "metricshub.host.up{protocol=\"wmi\"}"; - /** * WMI namespace */ @@ -96,6 +80,11 @@ public class WmiExtension implements IProtocolExtension { */ public static final String WMI_TEST_QUERY = "SELECT Name FROM Win32_ComputerSystem"; + /** + * The identifier for the Wmi protocol. + */ + private static final String IDENTIFIER = "wmi"; + private WmiRequestExecutor wmiRequestExecutor; private WmiDetectionService wmiDetectionService; private WinCommandService winCommandService; @@ -130,7 +119,7 @@ public Set> getSupportedCriteria() { } @Override - public void checkProtocol(TelemetryManager telemetryManager) { + public Optional checkProtocol(TelemetryManager telemetryManager) { // Create and set the WMI result to null List> wmiResult = null; @@ -143,33 +132,23 @@ public void checkProtocol(TelemetryManager telemetryManager) { .getConfigurations() .get(WmiConfiguration.class); - // Retrieve the host endpoint monitor - final Monitor hostMonitor = telemetryManager.getEndpointHostMonitor(); - // Stop the health check if there is not an WMI configuration if (wmiConfiguration == null) { - return; + return Optional.empty(); } + log.info("Hostname {} - Performing {} protocol health check.", hostname, getIdentifier()); log.info( "Hostname {} - Checking WMI protocol status. Sending a WQL SELECT request on {} namespace.", hostname, WMI_TEST_NAMESPACE ); - // Create the MetricFactory in order to collect the up metric - final MetricFactory metricFactory = new MetricFactory(); - - // Get the strategy time which represents the collect time of the up metric - final Long strategyTime = telemetryManager.getStrategyTime(); - try { wmiResult = wmiRequestExecutor.executeWmi(hostname, wmiConfiguration, WMI_TEST_QUERY, WMI_TEST_NAMESPACE); } catch (Exception e) { if (wmiRequestExecutor.isAcceptableException(e)) { - // Generate a metric from the WMI result - metricFactory.collectNumberMetric(hostMonitor, WMI_UP_METRIC, UP, strategyTime); - return; + return Optional.of(true); } log.debug( "Hostname {} - Checking WMI protocol status. WMI exception when performing a WQL SELECT request on {} namespace: ", @@ -178,9 +157,7 @@ public void checkProtocol(TelemetryManager telemetryManager) { e ); } - - // Generate a metric from the WMI result - metricFactory.collectNumberMetric(hostMonitor, WMI_UP_METRIC, wmiResult != null ? UP : DOWN, strategyTime); + return Optional.of(wmiResult != null); } @Override @@ -245,7 +222,7 @@ public SourceTable processSource(Source source, String connectorId, TelemetryMan @Override public boolean isSupportedConfigurationType(String configurationType) { - return "wmi".equalsIgnoreCase(configurationType); + return IDENTIFIER.equalsIgnoreCase(configurationType); } @Override @@ -293,4 +270,9 @@ public static JsonMapper newObjectMapper() { .configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false) .build(); } + + @Override + public String getIdentifier() { + return IDENTIFIER; + } } diff --git a/metricshub-wmi-extension/src/test/java/org/sentrysoftware/metricshub/extension/wmi/WmiExtensionTest.java b/metricshub-wmi-extension/src/test/java/org/sentrysoftware/metricshub/extension/wmi/WmiExtensionTest.java index 0b695119d..52bd2d6cd 100644 --- a/metricshub-wmi-extension/src/test/java/org/sentrysoftware/metricshub/extension/wmi/WmiExtensionTest.java +++ b/metricshub-wmi-extension/src/test/java/org/sentrysoftware/metricshub/extension/wmi/WmiExtensionTest.java @@ -21,6 +21,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; import org.junit.jupiter.api.Test; @@ -145,12 +146,9 @@ void testCheckProtocolUp() throws ClientException { ); // Start the WMI Health Check strategy - wmiExtension.checkProtocol(telemetryManager); + Optional result = wmiExtension.checkProtocol(telemetryManager); - assertEquals( - WmiExtension.UP, - telemetryManager.getEndpointHostMonitor().getMetric(WmiExtension.WMI_UP_METRIC).getValue() - ); + assertTrue(result.get()); } { @@ -167,12 +165,9 @@ void testCheckProtocolUp() throws ClientException { doCallRealMethod().when(wmiRequestExecutorMock).isAcceptableException(any()); // Start the WMI Health Check - wmiExtension.checkProtocol(telemetryManager); + Optional result = wmiExtension.checkProtocol(telemetryManager); - assertEquals( - WmiExtension.UP, - telemetryManager.getEndpointHostMonitor().getMetric(WmiExtension.WMI_UP_METRIC).getValue() - ); + assertTrue(result.get()); } } @@ -192,12 +187,9 @@ void testCheckProtocolDown() throws ClientException { ); // Start the WMI Health Check - wmiExtension.checkProtocol(telemetryManager); + Optional result = wmiExtension.checkProtocol(telemetryManager); - assertEquals( - WmiExtension.DOWN, - telemetryManager.getEndpointHostMonitor().getMetric(WmiExtension.WMI_UP_METRIC).getValue() - ); + assertFalse(result.get()); } @Test @@ -487,4 +479,11 @@ void testBuildConfiguration() throws InvalidConfigurationException { ); assertNull(wmiConfiguration.getNamespace()); } + + @Test + void testGetIdentifier() { + String identifier = wmiExtension.getIdentifier(); + + assertEquals("wmi", identifier); + } }