This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 3de03c0d3265cfc00c2e7e203c460941ff852a63 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Tue Jun 11 21:08:40 2019 +0200 CAMEL-13369: Message History EIP now supports filtering nodes and to keep a copy of the traced message. --- MIGRATION.md | 2 + .../messagehistory/MetricsMessageHistory.java | 5 ++- .../MetricsMessageHistoryFactory.java | 47 ++++++++++++++++++++-- .../messagehistory/MicrometerMessageHistory.java | 8 ++-- .../MicrometerMessageHistoryFactory.java | 46 +++++++++++++++++++-- .../support/DefaultMessageHistoryFactory.java | 6 +-- 6 files changed, 100 insertions(+), 14 deletions(-) diff --git a/MIGRATION.md b/MIGRATION.md index 9cd0d13..8a2f453 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -262,6 +262,8 @@ Rename various APIs in camel-core to fix the typo `chiper` to `cipher`. The classes `ReloadStrategySupport` and `FileWatcherReloadStrategy` has been removed. +The `MessageHistoryFactory` interface has some options to filter and copy the message and a slight change in its API. + #### camel-test If you are using camel-test and override the `createRegistry` method, for example to register beans from the `JndiRegisty` class, then this is no longer necessary, and instead diff --git a/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/messagehistory/MetricsMessageHistory.java b/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/messagehistory/MetricsMessageHistory.java index 5b04202..c3b6d3b 100644 --- a/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/messagehistory/MetricsMessageHistory.java +++ b/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/messagehistory/MetricsMessageHistory.java @@ -17,6 +17,7 @@ package org.apache.camel.component.metrics.messagehistory; import com.codahale.metrics.Timer; +import org.apache.camel.Message; import org.apache.camel.MessageHistory; import org.apache.camel.NamedNode; import org.apache.camel.support.DefaultMessageHistory; @@ -28,8 +29,8 @@ public class MetricsMessageHistory extends DefaultMessageHistory { private final Timer.Context context; - public MetricsMessageHistory(String routeId, NamedNode namedNode, Timer timer, long timestamp) { - super(routeId, namedNode, timestamp); + public MetricsMessageHistory(String routeId, NamedNode namedNode, Timer timer, long timestamp, Message message) { + super(routeId, namedNode, timestamp, message); this.context = timer.time(); } diff --git a/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/messagehistory/MetricsMessageHistoryFactory.java b/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/messagehistory/MetricsMessageHistoryFactory.java index e2832cc..75076e4 100644 --- a/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/messagehistory/MetricsMessageHistoryFactory.java +++ b/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/messagehistory/MetricsMessageHistoryFactory.java @@ -22,12 +22,15 @@ import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.Timer; import org.apache.camel.CamelContext; import org.apache.camel.CamelContextAware; +import org.apache.camel.Exchange; +import org.apache.camel.Message; import org.apache.camel.MessageHistory; import org.apache.camel.NamedNode; import org.apache.camel.NonManagedService; import org.apache.camel.RuntimeCamelException; import org.apache.camel.StaticService; import org.apache.camel.spi.MessageHistoryFactory; +import org.apache.camel.support.PatternHelper; import org.apache.camel.support.service.ServiceSupport; import org.apache.camel.util.ObjectHelper; @@ -39,6 +42,8 @@ public class MetricsMessageHistoryFactory extends ServiceSupport implements Came private CamelContext camelContext; private MetricsMessageHistoryService messageHistoryService; private MetricRegistry metricsRegistry; + private boolean copyMessage; + private String nodePattern; private boolean useJmx; private String jmxDomain = "org.apache.camel.metrics"; private boolean prettyPrint; @@ -125,9 +130,45 @@ public class MetricsMessageHistoryFactory extends ServiceSupport implements Came } @Override - public MessageHistory newMessageHistory(String routeId, NamedNode namedNode, long timestamp) { - Timer timer = metricsRegistry.timer(createName("history", routeId, namedNode.getId())); - return new MetricsMessageHistory(routeId, namedNode, timer, timestamp); + public boolean isCopyMessage() { + return copyMessage; + } + + @Override + public void setCopyMessage(boolean copyMessage) { + this.copyMessage = copyMessage; + } + + @Override + public String getNodePattern() { + return nodePattern; + } + + @Override + public void setNodePattern(String nodePattern) { + this.nodePattern = nodePattern; + } + + @Override + public MessageHistory newMessageHistory(String routeId, NamedNode node, long timestamp, Exchange exchange) { + if (nodePattern != null) { + String name = node.getShortName(); + String[] parts = nodePattern.split(","); + for (String part : parts) { + boolean match = PatternHelper.matchPattern(name, part); + if (!match) { + return null; + } + } + } + + Message msg = null; + if (copyMessage) { + msg = exchange.getMessage().copy(); + } + + Timer timer = metricsRegistry.timer(createName("history", routeId, node.getId())); + return new MetricsMessageHistory(routeId, node, timer, timestamp, msg); } private String createName(String type, String routeId, String id) { diff --git a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/messagehistory/MicrometerMessageHistory.java b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/messagehistory/MicrometerMessageHistory.java index 095d903..af5413b 100644 --- a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/messagehistory/MicrometerMessageHistory.java +++ b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/messagehistory/MicrometerMessageHistory.java @@ -18,13 +18,14 @@ package org.apache.camel.component.micrometer.messagehistory; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Timer; +import org.apache.camel.Message; import org.apache.camel.MessageHistory; import org.apache.camel.NamedNode; import org.apache.camel.Route; import org.apache.camel.support.DefaultMessageHistory; /** - * A micrometer metrics based {@link MessageHistory}. This could also use {@link #elapsed} + * A micrometer metrics based {@link MessageHistory}. This could also use {@link #getElapsed()} * provided by the super class, but Micrometer can potentially use other {@link io.micrometer.core.instrument.Clock clocks} * and measures in nano-second precision. */ @@ -35,8 +36,9 @@ public class MicrometerMessageHistory extends DefaultMessageHistory { private final MeterRegistry meterRegistry; private final MicrometerMessageHistoryNamingStrategy namingStrategy; - public MicrometerMessageHistory(MeterRegistry meterRegistry, Route route, NamedNode namedNode, MicrometerMessageHistoryNamingStrategy namingStrategy, long timestamp) { - super(route.getId(), namedNode, timestamp); + public MicrometerMessageHistory(MeterRegistry meterRegistry, Route route, NamedNode namedNode, + MicrometerMessageHistoryNamingStrategy namingStrategy, long timestamp, Message message) { + super(route.getId(), namedNode, timestamp, message); this.meterRegistry = meterRegistry; this.route = route; this.namingStrategy = namingStrategy; diff --git a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/messagehistory/MicrometerMessageHistoryFactory.java b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/messagehistory/MicrometerMessageHistoryFactory.java index eb2f582..7f7ead9 100644 --- a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/messagehistory/MicrometerMessageHistoryFactory.java +++ b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/messagehistory/MicrometerMessageHistoryFactory.java @@ -21,6 +21,8 @@ import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Tags; import org.apache.camel.CamelContext; import org.apache.camel.CamelContextAware; +import org.apache.camel.Exchange; +import org.apache.camel.Message; import org.apache.camel.MessageHistory; import org.apache.camel.NamedNode; import org.apache.camel.NonManagedService; @@ -29,6 +31,7 @@ import org.apache.camel.RuntimeCamelException; import org.apache.camel.StaticService; import org.apache.camel.component.micrometer.MicrometerUtils; import org.apache.camel.spi.MessageHistoryFactory; +import org.apache.camel.support.PatternHelper; import org.apache.camel.support.service.ServiceSupport; import static org.apache.camel.component.micrometer.MicrometerConstants.METRICS_REGISTRY_NAME; @@ -41,6 +44,8 @@ public class MicrometerMessageHistoryFactory extends ServiceSupport implements C private CamelContext camelContext; private MeterRegistry meterRegistry; + private boolean copyMessage; + private String nodePattern; private boolean prettyPrint = true; private TimeUnit durationUnit = TimeUnit.MILLISECONDS; private MicrometerMessageHistoryNamingStrategy namingStrategy = MicrometerMessageHistoryNamingStrategy.DEFAULT; @@ -102,10 +107,46 @@ public class MicrometerMessageHistoryFactory extends ServiceSupport implements C } @Override - public MessageHistory newMessageHistory(String routeId, NamedNode namedNode, long timestamp) { + public boolean isCopyMessage() { + return copyMessage; + } + + @Override + public void setCopyMessage(boolean copyMessage) { + this.copyMessage = copyMessage; + } + + @Override + public String getNodePattern() { + return nodePattern; + } + + @Override + public void setNodePattern(String nodePattern) { + this.nodePattern = nodePattern; + } + + @Override + public MessageHistory newMessageHistory(String routeId, NamedNode namedNode, long timestamp, Exchange exchange) { + if (nodePattern != null) { + String name = namedNode.getShortName(); + String[] parts = nodePattern.split(","); + for (String part : parts) { + boolean match = PatternHelper.matchPattern(name, part); + if (!match) { + return null; + } + } + } + + Message msg = null; + if (copyMessage) { + msg = exchange.getMessage().copy(); + } + Route route = camelContext.getRoute(routeId); if (route != null) { - return new MicrometerMessageHistory(getMeterRegistry(), route, namedNode, getNamingStrategy(), timestamp); + return new MicrometerMessageHistory(getMeterRegistry(), route, namedNode, getNamingStrategy(), timestamp, msg); } else { return null; } @@ -113,7 +154,6 @@ public class MicrometerMessageHistoryFactory extends ServiceSupport implements C @Override protected void doStart() throws Exception { - if (meterRegistry == null) { meterRegistry = MicrometerUtils.getOrCreateMeterRegistry(camelContext.getRegistry(), METRICS_REGISTRY_NAME); } diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultMessageHistoryFactory.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultMessageHistoryFactory.java index 9864f2a..71c1f3f 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultMessageHistoryFactory.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultMessageHistoryFactory.java @@ -40,12 +40,12 @@ public class DefaultMessageHistoryFactory implements MessageHistoryFactory { } } - Message target = null; + Message msg = null; if (copyMessage) { - target = exchange.getMessage().copy(); + msg = exchange.getMessage().copy(); } - return new DefaultMessageHistory(routeId, node, timestamp, target); + return new DefaultMessageHistory(routeId, node, timestamp, msg); } @Override