diff --git a/dil/src/main/java/org/assimbly/dil/blocks/errorhandler/ErrorHandler.java b/dil/src/main/java/org/assimbly/dil/blocks/errorhandler/ErrorHandler.java index 3179ccc2..b98bf672 100644 --- a/dil/src/main/java/org/assimbly/dil/blocks/errorhandler/ErrorHandler.java +++ b/dil/src/main/java/org/assimbly/dil/blocks/errorhandler/ErrorHandler.java @@ -5,6 +5,8 @@ import org.apache.camel.builder.DeadLetterChannelBuilder; import org.apache.commons.lang3.StringUtils; import org.assimbly.dil.blocks.processors.FailureProcessor; +import org.assimbly.dil.blocks.processors.LastFailureProcessor; + import java.util.TreeMap; @@ -46,6 +48,8 @@ public DeadLetterChannelBuilder configure() { .logExhaustedMessageBody(true) .logExhaustedMessageHistory(true); + deadLetterChannelBuilder.onExceptionOccurred(new LastFailureProcessor()); + if(failureProcessorEnabled) { Processor failureProcessor = new FailureProcessor(); deadLetterChannelBuilder.onExceptionOccurred(failureProcessor); diff --git a/dil/src/main/java/org/assimbly/dil/blocks/processors/LastFailureProcessor.java b/dil/src/main/java/org/assimbly/dil/blocks/processors/LastFailureProcessor.java new file mode 100644 index 00000000..fdd8ea08 --- /dev/null +++ b/dil/src/main/java/org/assimbly/dil/blocks/processors/LastFailureProcessor.java @@ -0,0 +1,30 @@ +package org.assimbly.dil.blocks.processors; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.commons.lang3.StringUtils; +import org.assimbly.dil.event.domain.FlowEvent; + +import java.util.Date; +import java.util.concurrent.ConcurrentHashMap; + +public class LastFailureProcessor implements Processor { + + public static final ConcurrentHashMap lastFailureTimestamp = new ConcurrentHashMap<>(); + + @Override + public void process(Exchange exchange) throws Exception { + Date date = new Date(); + FlowEvent flowEvent = new FlowEvent(exchange.getFromRouteId(), date, exchange.getException().getMessage()); + + String flowId; + if(!flowEvent.getFlowId().contains("-")){ + flowId = flowEvent.getFlowId(); + }else{ + flowId = StringUtils.substringBefore(flowEvent.getFlowId(),"-"); + } + + lastFailureTimestamp.put(flowId, System.currentTimeMillis()); + } + +} \ No newline at end of file diff --git a/integration/src/main/java/org/assimbly/integration/impl/manager/StatsManager.java b/integration/src/main/java/org/assimbly/integration/impl/manager/StatsManager.java index 08235731..06f6ef42 100644 --- a/integration/src/main/java/org/assimbly/integration/impl/manager/StatsManager.java +++ b/integration/src/main/java/org/assimbly/integration/impl/manager/StatsManager.java @@ -1,8 +1,5 @@ package org.assimbly.integration.impl.manager; -import javax.management.*; -import java.util.*; - import com.codahale.metrics.MetricRegistry; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; @@ -21,6 +18,7 @@ import org.apache.camel.health.HealthCheckRepository; import org.apache.camel.support.CamelContextHelper; import org.apache.commons.lang3.StringUtils; +import org.assimbly.dil.blocks.processors.LastFailureProcessor; import org.assimbly.dil.event.collect.MicrometerTimestampRoutePolicyFactory; import org.assimbly.docconverter.DocConverter; import org.json.JSONArray; @@ -28,11 +26,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.management.JMX; +import javax.management.ObjectName; import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.lang.management.MemoryUsage; import java.lang.management.ThreadInfo; import java.text.DecimalFormat; +import java.util.*; import java.util.concurrent.ConcurrentMap; public class StatsManager { @@ -170,7 +171,9 @@ private FlowStatistics calculateFlowStatistics(String flowId, boolean fullStats) if (fullStats) { stats.uptimeMillis = managedRouteGroup.getUptimeMillis(); stats.uptime = managedRouteGroup.getUptime(); - stats.lastFailed = managedRouteGroup.getLastExchangeFailureTimestamp() != null ? managedRouteGroup.getLastExchangeFailureTimestamp().getTime() : 0L; + stats.lastFailed = failed > 0 && LastFailureProcessor.lastFailureTimestamp.containsKey(flowId) + ? LastFailureProcessor.lastFailureTimestamp.get(flowId) + : 0L; stats.lastCompleted = managedRouteGroup.getLastExchangeCompletedTimestamp() != null ? managedRouteGroup.getLastExchangeCompletedTimestamp().getTime() : 0L; }