diff --git a/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/connector/model/common/ExecuteForEachEntryOf.java b/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/connector/model/common/ExecuteForEachEntryOf.java index 4635c99ef..1c09a2149 100644 --- a/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/connector/model/common/ExecuteForEachEntryOf.java +++ b/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/connector/model/common/ExecuteForEachEntryOf.java @@ -38,6 +38,7 @@ import lombok.NoArgsConstructor; import lombok.NonNull; import org.sentrysoftware.metricshub.engine.connector.deserializer.custom.NonBlankDeserializer; +import org.sentrysoftware.metricshub.engine.connector.deserializer.custom.PositiveIntegerDeserializer; /** * Represents a configuration for executing an operation for each entry of a specified source. @@ -62,20 +63,30 @@ public class ExecuteForEachEntryOf implements Serializable { @JsonSetter(nulls = SKIP) private IEntryConcatMethod concatMethod = EntryConcatMethod.LIST; + /** + * The sleep integer in ms. + */ + @JsonDeserialize(using = PositiveIntegerDeserializer.class) + @JsonSetter(nulls = SKIP) + private Integer sleep; + /** * Constructs an instance of {@link ExecuteForEachEntryOf}. * * @param source The source for executing the operation for each entry. * @param concatMethod The method used to concatenate entries. + * @param sleep The sleep integer in ms. */ @Builder @JsonCreator public ExecuteForEachEntryOf( @JsonProperty(value = "source", required = true) @NonNull String source, - @JsonProperty("concatMethod") IEntryConcatMethod concatMethod + @JsonProperty("concatMethod") IEntryConcatMethod concatMethod, + @JsonProperty(value = "sleep", required = false) Integer sleep ) { this.source = source; this.concatMethod = concatMethod == null ? EntryConcatMethod.LIST : concatMethod; + this.sleep = sleep; } /** @@ -84,7 +95,7 @@ public ExecuteForEachEntryOf( * @return A new instance of {@link ExecuteForEachEntryOf} with the same source and concatenation method. */ public ExecuteForEachEntryOf copy() { - return ExecuteForEachEntryOf.builder().source(source).concatMethod(concatMethod.copy()).build(); + return ExecuteForEachEntryOf.builder().source(source).concatMethod(concatMethod.copy()).sleep(sleep).build(); } @Override @@ -93,6 +104,7 @@ public String toString() { addNonNull(stringJoiner, "- executeForEachEntryOf=", source); addNonNull(stringJoiner, "- concatMethod=", concatMethod != null ? concatMethod.getDescription() : EMPTY); + addNonNull(stringJoiner, "- sleep=", sleep); return stringJoiner.toString(); } diff --git a/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/connector/model/monitor/task/source/Source.java b/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/connector/model/monitor/task/source/Source.java index 9921ca01d..9b800d0af 100644 --- a/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/connector/model/monitor/task/source/Source.java +++ b/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/connector/model/monitor/task/source/Source.java @@ -188,4 +188,13 @@ public IEntryConcatMethod getEntryConcatMethod() { public String getExecuteForEachEntryOf() { return executeForEachEntryOf != null ? executeForEachEntryOf.getSource() : null; } + + /** + * Get the executeForEachEntryOf sleep Integer value + * + * @return Integer value + */ + public Integer getSleepExecuteForEachEntryOf() { + return executeForEachEntryOf != null ? executeForEachEntryOf.getSleep() : null; + } } diff --git a/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/strategy/source/SourceUpdaterProcessor.java b/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/strategy/source/SourceUpdaterProcessor.java index e6ea28437..1d20deb9d 100644 --- a/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/strategy/source/SourceUpdaterProcessor.java +++ b/metricshub-engine/src/main/java/org/sentrysoftware/metricshub/engine/strategy/source/SourceUpdaterProcessor.java @@ -490,6 +490,8 @@ private SourceTable processExecuteForEachEntryOf(final Source source, final Stri final SourceTable result = SourceTable.builder().rawData(EMPTY).build(); + final Integer sleep = source.getSleepExecuteForEachEntryOf(); + for (List row : maybeSourceTable.get().getTable()) { final Source copy = source.copy(); @@ -505,6 +507,17 @@ private SourceTable processExecuteForEachEntryOf(final Source source, final Stri copy.update(value -> replaceSourceReference(value, copy)); concatEntryResult(source, result, row, copy.accept(sourceProcessor)); + if (sleep != null && sleep != 0) { + try { + Thread.sleep(sleep); + } catch (InterruptedException e) { + log.error( + "Hostname {} - Thread interrupted during sleep between two 'execute for each entry' requests.", + hostname + ); + Thread.currentThread().interrupt(); + } + } } return result; diff --git a/metricshub-engine/src/test/java/org/sentrysoftware/metricshub/engine/connector/deserializer/source/HttpSourceDeserializerTest.java b/metricshub-engine/src/test/java/org/sentrysoftware/metricshub/engine/connector/deserializer/source/HttpSourceDeserializerTest.java index a10d74242..9f69029bf 100644 --- a/metricshub-engine/src/test/java/org/sentrysoftware/metricshub/engine/connector/deserializer/source/HttpSourceDeserializerTest.java +++ b/metricshub-engine/src/test/java/org/sentrysoftware/metricshub/engine/connector/deserializer/source/HttpSourceDeserializerTest.java @@ -115,7 +115,7 @@ void testDeserializeHttpSourceWithExecuteForEachEntryOf() throws IOException { .type("http") .url("/device-detail/$entry.column(1)$") .method(GET) - .executeForEachEntryOf(new ExecuteForEachEntryOf("${source::pre.devices}", EntryConcatMethod.LIST)) + .executeForEachEntryOf(new ExecuteForEachEntryOf("${source::pre.devices}", EntryConcatMethod.LIST, 0)) .build() ) ); diff --git a/metricshub-engine/src/test/java/org/sentrysoftware/metricshub/engine/strategy/source/SourceUpdaterProcessorTest.java b/metricshub-engine/src/test/java/org/sentrysoftware/metricshub/engine/strategy/source/SourceUpdaterProcessorTest.java index 0a8d6e12f..fc5bc2728 100644 --- a/metricshub-engine/src/test/java/org/sentrysoftware/metricshub/engine/strategy/source/SourceUpdaterProcessorTest.java +++ b/metricshub-engine/src/test/java/org/sentrysoftware/metricshub/engine/strategy/source/SourceUpdaterProcessorTest.java @@ -234,6 +234,45 @@ void testProcessHTTPSourceCustomExecuteForEachEntry() { assertEquals(expectedResult, result.getRawData()); } + @Test + void testProcessHTTPSourceExecuteForEachEntrySleep() { + final HttpSource httpSource = HttpSource.builder().url(URL).build(); + assertNull(httpSource.getSleepExecuteForEachEntryOf()); + + httpSource.setExecuteForEachEntryOf( + ExecuteForEachEntryOf.builder().source(ENCLOSURE_COLLECT_SOURCE_1).concatMethod(EntryConcatMethod.LIST).build() + ); + + assertEquals(null, httpSource.getSleepExecuteForEachEntryOf()); + + httpSource.setExecuteForEachEntryOf( + ExecuteForEachEntryOf + .builder() + .source(ENCLOSURE_COLLECT_SOURCE_1) + .concatMethod(EntryConcatMethod.LIST) + .sleep(200) + .build() + ); + + assertEquals(200, httpSource.getSleepExecuteForEachEntryOf()); + + final CustomConcatMethod customConcatMethod = CustomConcatMethod + .builder() + .concatStart("concatStart:{") + .concatEnd("}concatEnd;") + .build(); + + httpSource.setExecuteForEachEntryOf( + ExecuteForEachEntryOf + .builder() + .source(ENCLOSURE_COLLECT_SOURCE_1) + .concatMethod(customConcatMethod) + .sleep(400) + .build() + ); + assertEquals(400, httpSource.getSleepExecuteForEachEntryOf()); + } + @Test void testProcessSNMPGetSource() { final SnmpConfiguration snmpConfiguration = SnmpConfiguration.builder().port(161).timeout(120L).build();