Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue #203 : Refactor extensions code to check protocol efficiently #225

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
e79db5a
- Fixed error on compute (null table)
NassimBtk Jun 2, 2024
87ddbac
Issue #203: Refactor-Extensions-code-to-check-protocol-efficiently
SafaeAJ Jun 3, 2024
51aef13
Merge branch 'main' into feature/issue-203-Refactor-Extensions-code-t…
SafaeAJ Jun 3, 2024
31be857
Issue #203: Refactor-Extensions-code-to-check-protocol-efficiently
SafaeAJ Jun 3, 2024
d024d54
Issue #203: Refactor-Extensions-code-to-check-protocol-efficiently
SafaeAJ Jun 3, 2024
bc4fb13
Issue #203: Refactor-Extensions-code-to-check-protocol-efficiently
SafaeAJ Jun 3, 2024
0eadaee
Issue #203: Refactor-Extensions-code-to-check-protocol-efficiently
SafaeAJ Jun 4, 2024
125162c
Issue #203: Refactor-Extensions-code-to-check-protocol-efficiently
SafaeAJ Jun 4, 2024
974c845
Issue #203: Refactor-Extensions-code-to-check-protocol-efficiently
SafaeAJ Jun 4, 2024
65a46de
Issue #203: Refactor-Extensions-code-to-check-protocol-efficiently
SafaeAJ Jun 4, 2024
0681744
Issue #203: Refactor-Extensions-code-to-check-protocol-efficiently
SafaeAJ Jun 4, 2024
ad04d4d
Issue #203: Refactor-Extensions-code-to-check-protocol-efficiently
SafaeAJ Jun 4, 2024
c9f74d9
Issue #203: Refactor-Extensions-code-to-check-protocol-efficiently
SafaeAJ Jun 4, 2024
0cba537
Issue #203: Refactor-Extensions-code-to-check-protocol-efficiently
SafaeAJ Jun 4, 2024
93544ac
Issue #203: Refactor-Extensions-code-to-check-protocol-efficiently
SafaeAJ Jun 4, 2024
92a15f9
Issue #203: Refactor-Extensions-code-to-check-protocol-efficiently
SafaeAJ Jun 4, 2024
05c7654
Issue #203: Refactor-Extensions-code-to-check-protocol-efficiently
NassimBtk Jun 5, 2024
9dd2034
Merge branch 'feature/issue-203-refactor-extensions-code-to-check-pro…
NassimBtk Jun 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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<Boolean> checkProtocol(TelemetryManager telemetryManager);

/**
* Executes a source operation based on the given source and configuration within the telemetry manager.
Expand Down Expand Up @@ -141,4 +142,11 @@ public interface IProtocolExtension {
*/
IConfiguration buildConfiguration(String configurationType, JsonNode jsonNode, UnaryOperator<char[]> decrypt)
throws InvalidConfigurationException;

/**
* Returns the identifier for protocol extension.
*
* @return The protocol identifier as a string.
*/
String getIdentifier();
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand All @@ -42,7 +42,6 @@
* responding or not.
* </p>
*/
@Slf4j
public class ProtocolHealthCheckStrategy extends AbstractStrategy {

/**
Expand Down Expand Up @@ -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<IProtocolExtension> 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
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand All @@ -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;

/**
Expand All @@ -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;
Expand All @@ -98,13 +87,10 @@ public Set<Class<? extends Criterion>> getSupportedCriteria() {
}

@Override
public void checkProtocol(TelemetryManager telemetryManager) {
public Optional<Boolean> 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;

Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -188,7 +166,7 @@ public CriterionTestResult processCriterion(

@Override
public boolean isSupportedConfigurationType(String configurationType) {
return "http".equalsIgnoreCase(configurationType);
return IDENTIFIER.equalsIgnoreCase(configurationType);
}

@Override
Expand Down Expand Up @@ -233,4 +211,9 @@ public static JsonMapper newObjectMapper() {
.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false)
.build();
}

@Override
public String getIdentifier() {
return IDENTIFIER;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -108,9 +108,10 @@ void testCheckHttpDownHealth() {
.when(httpRequestExecutorMock)
.executeHttp(any(HttpRequest.class), anyBoolean(), any(TelemetryManager.class));

httpExtension.checkProtocol(telemetryManager);
Optional<Boolean> result = httpExtension.checkProtocol(telemetryManager);

assertEquals(HttpExtension.DOWN, telemetryManager.getEndpointHostMonitor().getMetric(HTTP_UP_METRIC).getValue());
// Assert the result
assertFalse(result.get());
}

@Test
Expand All @@ -122,9 +123,10 @@ void testCheckHttpUpHealth() {
.when(httpRequestExecutorMock)
.executeHttp(any(HttpRequest.class), anyBoolean(), any(TelemetryManager.class));

httpExtension.checkProtocol(telemetryManager);
Optional<Boolean> result = httpExtension.checkProtocol(telemetryManager);

assertEquals(HttpExtension.UP, telemetryManager.getEndpointHostMonitor().getMetric(HTTP_UP_METRIC).getValue());
// Assert the result
assertTrue(result.get());
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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) {
Expand All @@ -89,13 +78,10 @@ public Set<Class<? extends Criterion>> getSupportedCriteria() {
}

@Override
public void checkProtocol(TelemetryManager telemetryManager) {
public Optional<Boolean> 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;

Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -226,7 +203,7 @@ public CriterionTestResult processCriterion(

@Override
public boolean isSupportedConfigurationType(String configurationType) {
return "ipmi".equalsIgnoreCase(configurationType);
return IDENTIFIER.equalsIgnoreCase(configurationType);
}

@Override
Expand Down Expand Up @@ -271,4 +248,9 @@ public static JsonMapper newObjectMapper() {
.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false)
.build();
}

@Override
public String getIdentifier() {
return IDENTIFIER;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,14 @@
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;
import com.fasterxml.jackson.databind.node.ObjectNode;
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;
Expand Down Expand Up @@ -106,9 +104,9 @@ void testCheckIpmiUpHealth() {
.thenReturn(SUCCESS_RESPONSE);

// Start the IPMI Health Check strategy
ipmiExtension.checkProtocol(telemetryManager);
Optional<Boolean> result = ipmiExtension.checkProtocol(telemetryManager);

assertEquals(UP, telemetryManager.getEndpointHostMonitor().getMetric(IPMI_UP_METRIC).getValue());
assertTrue(result.get());
}
}

Expand All @@ -123,9 +121,9 @@ void testCheckIpmiDownHealth() {
.thenReturn(null);

// Start the IPMI Health Check strategy
ipmiExtension.checkProtocol(telemetryManager);
Optional<Boolean> result = ipmiExtension.checkProtocol(telemetryManager);

assertEquals(DOWN, telemetryManager.getEndpointHostMonitor().getMetric(IPMI_UP_METRIC).getValue());
assertFalse(result.get());
}
}

Expand Down
Loading