Return-Path: X-Original-To: apmail-camel-commits-archive@www.apache.org Delivered-To: apmail-camel-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 04ACD974F for ; Thu, 14 Mar 2013 15:48:30 +0000 (UTC) Received: (qmail 4795 invoked by uid 500); 14 Mar 2013 15:48:29 -0000 Delivered-To: apmail-camel-commits-archive@camel.apache.org Received: (qmail 4710 invoked by uid 500); 14 Mar 2013 15:48:29 -0000 Mailing-List: contact commits-help@camel.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@camel.apache.org Delivered-To: mailing list commits@camel.apache.org Received: (qmail 4688 invoked by uid 99); 14 Mar 2013 15:48:28 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 14 Mar 2013 15:48:28 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 14 Mar 2013 15:48:26 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 1E0A32388847; Thu, 14 Mar 2013 15:46:21 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1456490 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/api/management/mbean/ main/java/org/apache/camel/management/mbean/ main/java/org/apache/camel/processor/interceptor/ test/java/org/apache/camel/management/ Date: Thu, 14 Mar 2013 15:46:20 -0000 To: commits@camel.apache.org From: davsclaus@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20130314154621.1E0A32388847@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: davsclaus Date: Thu Mar 14 15:46:20 2013 New Revision: 1456490 URL: http://svn.apache.org/r1456490 Log: CAMEL-6148: BacklogTracer allow to configure a trace pattern to filter what to trace at runtime Added: camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternRouteTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternTest.java - copied, changed from r1456471, camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedTracerBacklogMBean.java camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedBacklogTracer.java camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogTracer.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedTracerBacklogMBean.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedTracerBacklogMBean.java?rev=1456490&r1=1456489&r2=1456490&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedTracerBacklogMBean.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedTracerBacklogMBean.java Thu Mar 14 15:46:20 2013 @@ -35,6 +35,12 @@ public interface ManagedTracerBacklogMBe @ManagedAttribute(description = "Number of traced messages to keep in the backlog (FIFO queue)") void setBacklogSize(int backlogSize); + @ManagedAttribute(description = "To filter tracing by nodes (pattern)") + void setTracePattern(String pattern); + + @ManagedAttribute(description = "To filter tracing by nodes (pattern)") + String getTracePattern(); + @ManagedAttribute(description = "Number of total traced messages") long getTraceCounter(); Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedBacklogTracer.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedBacklogTracer.java?rev=1456490&r1=1456489&r2=1456490&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedBacklogTracer.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedBacklogTracer.java Thu Mar 14 15:46:20 2013 @@ -70,6 +70,14 @@ public class ManagedBacklogTracer implem backlogTracer.setBacklogSize(backlogSize); } + public void setTracePattern(String pattern) { + backlogTracer.setTracePattern(pattern); + } + + public String getTracePattern() { + return backlogTracer.getTracePattern(); + } + public long getTraceCounter() { return backlogTracer.getTraceCounter(); } Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogTracer.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogTracer.java?rev=1456490&r1=1456489&r2=1456490&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogTracer.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogTracer.java Thu Mar 14 15:46:20 2013 @@ -34,6 +34,7 @@ import org.apache.camel.model.RouteDefin import org.apache.camel.spi.InterceptStrategy; import org.apache.camel.spi.NodeIdFactory; import org.apache.camel.support.ServiceSupport; +import org.apache.camel.util.EndpointHelper; /** * A tracer used for message tracing, storing a copy of the message details in a backlog. @@ -50,6 +51,9 @@ public class BacklogTracer extends Servi private final Queue queue = new ArrayBlockingQueue(1000); // how many of the last messages per node to keep in the backlog private int backlogSize = 10; + // a pattern to filter tracing nodes + private String tracePattern; + private String[] patterns; // remember the processors we are tracing, which we need later private final Set> processors = new HashSet>(); @@ -103,7 +107,31 @@ public class BacklogTracer extends Servi * @return true to trace, false to skip tracing */ public boolean shouldTrace(ProcessorDefinition definition) { - return enabled; + if (!enabled) { + return false; + } + + if (patterns != null) { + for (String pattern : patterns) { + // match either route id, or node id + String id = definition.getId(); + // use matchPattern method from endpoint helper that has a good matcher we use in Camel + if (EndpointHelper.matchPattern(id, pattern)) { + return true; + } + RouteDefinition route = ProcessorDefinitionHelper.getRoute(definition); + if (route != null) { + id = route.getId(); + if (EndpointHelper.matchPattern(id, pattern)) { + return true; + } + } + } + // not matched the pattern + return false; + } + + return true; } public boolean isEnabled() { @@ -129,6 +157,20 @@ public class BacklogTracer extends Servi this.backlogSize = backlogSize; } + public String getTracePattern() { + return tracePattern; + } + + public void setTracePattern(String tracePattern) { + this.tracePattern = tracePattern; + if (tracePattern != null) { + // the pattern can have multiple nodes separated by comma + this.patterns = tracePattern.split(","); + } else { + this.patterns = null; + } + } + public long getTraceCounter() { return traceCounter.get(); } Added: camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternRouteTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternRouteTest.java?rev=1456490&view=auto ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternRouteTest.java (added) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternRouteTest.java Thu Mar 14 15:46:20 2013 @@ -0,0 +1,94 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.management; + +import java.util.List; +import javax.management.Attribute; +import javax.management.MBeanServer; +import javax.management.ObjectName; + +import org.apache.camel.api.management.mbean.BacklogTracerEventMessage; +import org.apache.camel.builder.RouteBuilder; + +public class BacklogTracerPatternRouteTest extends ManagementTestSupport { + + @SuppressWarnings("unchecked") + public void testBacklogTracerPattern() throws Exception { + MBeanServer mbeanServer = getMBeanServer(); + ObjectName on = new ObjectName("org.apache.camel:context=localhost/camel-1,type=tracer,name=BacklogTracer"); + assertNotNull(on); + mbeanServer.isRegistered(on); + + Boolean enabled = (Boolean) mbeanServer.getAttribute(on, "Enabled"); + assertEquals("Should not be enabled", Boolean.FALSE, enabled); + + Integer size = (Integer) mbeanServer.getAttribute(on, "BacklogSize"); + assertEquals("Should be 10", 10, size.intValue()); + + // set the pattern to match only coolRoute + mbeanServer.setAttribute(on, new Attribute("TracePattern", "coolRoute")); + + // enable it + mbeanServer.setAttribute(on, new Attribute("Enabled", Boolean.TRUE)); + + getMockEndpoint("mock:foo").expectedMessageCount(2); + getMockEndpoint("mock:bar").expectedMessageCount(2); + + template.sendBody("direct:start", "Hello World"); + template.sendBody("direct:start", "Bye World"); + + assertMockEndpointsSatisfied(); + + List events = (List) mbeanServer.invoke(on, "dumpTracedMessages", + new Object[]{"foo"}, new String[]{"java.lang.String"}); + + assertNotNull(events); + assertEquals(2, events.size()); + + // there should also be messages on bar + events = (List) mbeanServer.invoke(on, "dumpTracedMessages", + new Object[]{"bar"}, new String[]{"java.lang.String"}); + assertNotNull(events); + assertEquals(2, events.size()); + + // but not on beer + events = (List) mbeanServer.invoke(on, "dumpTracedMessages", + new Object[]{"beer"}, new String[]{"java.lang.String"}); + assertNotNull(events); + assertEquals(0, events.size()); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + context.setUseBreadcrumb(false); + + from("direct:start").routeId("coolRoute") + .to("direct:beer") + .to("mock:foo").id("foo") + .to("mock:bar").id("bar"); + + from("direct:beer").routeId("beerRoute") + .to("mock:beer").id("beer"); + + } + }; + } + +} Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternTest.java (from r1456471, camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerTest.java&r1=1456471&r2=1456490&rev=1456490&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/BacklogTracerPatternTest.java Thu Mar 14 15:46:20 2013 @@ -21,17 +21,14 @@ import javax.management.Attribute; import javax.management.MBeanServer; import javax.management.ObjectName; -import org.w3c.dom.Document; -import org.w3c.dom.NodeList; - import org.apache.camel.Exchange; import org.apache.camel.api.management.mbean.BacklogTracerEventMessage; import org.apache.camel.builder.RouteBuilder; -public class BacklogTracerTest extends ManagementTestSupport { +public class BacklogTracerPatternTest extends ManagementTestSupport { @SuppressWarnings("unchecked") - public void testBacklogTracerEventMessage() throws Exception { + public void testBacklogTracerPattern() throws Exception { MBeanServer mbeanServer = getMBeanServer(); ObjectName on = new ObjectName("org.apache.camel:context=localhost/camel-1,type=tracer,name=BacklogTracer"); assertNotNull(on); @@ -43,6 +40,9 @@ public class BacklogTracerTest extends M Integer size = (Integer) mbeanServer.getAttribute(on, "BacklogSize"); assertEquals("Should be 10", 10, size.intValue()); + // set the pattern to match only foo* + mbeanServer.setAttribute(on, new Attribute("TracePattern", "foo*")); + // enable it mbeanServer.setAttribute(on, new Attribute("Enabled", Boolean.TRUE)); @@ -73,150 +73,13 @@ public class BacklogTracerTest extends M assertEquals(" \n" + " Bye World\n" + " ", event2.getMessageAsXml()); - } - - @SuppressWarnings("unchecked") - public void testBacklogTracerEventMessageAsXml() throws Exception { - MBeanServer mbeanServer = getMBeanServer(); - ObjectName on = new ObjectName("org.apache.camel:context=localhost/camel-1,type=tracer,name=BacklogTracer"); - assertNotNull(on); - mbeanServer.isRegistered(on); - - Boolean enabled = (Boolean) mbeanServer.getAttribute(on, "Enabled"); - assertEquals("Should not be enabled", Boolean.FALSE, enabled); - - Integer size = (Integer) mbeanServer.getAttribute(on, "BacklogSize"); - assertEquals("Should be 10", 10, size.intValue()); - - // enable it - mbeanServer.setAttribute(on, new Attribute("Enabled", Boolean.TRUE)); - - getMockEndpoint("mock:foo").expectedMessageCount(2); - getMockEndpoint("mock:bar").expectedMessageCount(2); - - template.sendBody("direct:start", "Hello World"); - template.sendBody("direct:start", "Bye World"); - assertMockEndpointsSatisfied(); - - String events = (String) mbeanServer.invoke(on, "dumpTracedMessagesAsXml", - new Object[]{"foo"}, new String[]{"java.lang.String"}); + // there should be no messages on bar + events = (List) mbeanServer.invoke(on, "dumpTracedMessages", + new Object[]{"bar"}, new String[]{"java.lang.String"}); assertNotNull(events); - log.info(events); - - // should be valid XML - Document dom = context.getTypeConverter().convertTo(Document.class, events); - assertNotNull(dom); - - NodeList list = dom.getElementsByTagName("backlogTracerEventMessage"); - assertEquals(2, list.getLength()); - } - - @SuppressWarnings("unchecked") - public void testBacklogTracerEventMessageDumpAll() throws Exception { - MBeanServer mbeanServer = getMBeanServer(); - ObjectName on = new ObjectName("org.apache.camel:context=localhost/camel-1,type=tracer,name=BacklogTracer"); - assertNotNull(on); - mbeanServer.isRegistered(on); - - Boolean enabled = (Boolean) mbeanServer.getAttribute(on, "Enabled"); - assertEquals("Should not be enabled", Boolean.FALSE, enabled); - - // enable it - mbeanServer.setAttribute(on, new Attribute("Enabled", Boolean.TRUE)); - - getMockEndpoint("mock:foo").expectedMessageCount(2); - getMockEndpoint("mock:bar").expectedMessageCount(2); - - template.sendBody("direct:start", "Hello World"); - template.sendBody("direct:start", "Bye World"); - - assertMockEndpointsSatisfied(); - - List fooExchanges = getMockEndpoint("mock:foo").getReceivedExchanges(); - List barExchanges = getMockEndpoint("mock:bar").getReceivedExchanges(); - - List events = (List) mbeanServer.invoke(on, "dumpAllTracedMessages", null, null); - - assertNotNull(events); - assertEquals(6, events.size()); - - BacklogTracerEventMessage event0 = events.get(0); - assertEquals("route1", event0.getRouteId()); - assertEquals(null, event0.getToNode()); - assertEquals(" \n" - + " Hello World\n" - + " ", event0.getMessageAsXml()); - - BacklogTracerEventMessage event1 = events.get(1); - assertEquals("route1", event1.getRouteId()); - assertEquals("foo", event1.getToNode()); - assertEquals(" \n" - + " Hello World\n" - + " ", event1.getMessageAsXml()); - - BacklogTracerEventMessage event2 = events.get(2); - assertEquals("route1", event2.getRouteId()); - assertEquals("bar", event2.getToNode()); - assertEquals(" \n" - + " Hello World\n" - + " ", event2.getMessageAsXml()); - - BacklogTracerEventMessage event3 = events.get(3); - assertEquals("route1", event3.getRouteId()); - assertEquals(null, event3.getToNode()); - assertEquals(" \n" - + " Bye World\n" - + " ", event3.getMessageAsXml()); - - BacklogTracerEventMessage event4 = events.get(4); - assertEquals("route1", event4.getRouteId()); - assertEquals("foo", event4.getToNode()); - assertEquals(" \n" - + " Bye World\n" - + " ", event3.getMessageAsXml()); - - BacklogTracerEventMessage event5 = events.get(5); - assertEquals("route1", event5.getRouteId()); - assertEquals("bar", event5.getToNode()); - assertEquals(" \n" - + " Bye World\n" - + " ", event4.getMessageAsXml()); - } - - @SuppressWarnings("unchecked") - public void testBacklogTracerEventMessageDumpAllAsXml() throws Exception { - MBeanServer mbeanServer = getMBeanServer(); - ObjectName on = new ObjectName("org.apache.camel:context=localhost/camel-1,type=tracer,name=BacklogTracer"); - assertNotNull(on); - mbeanServer.isRegistered(on); - - Boolean enabled = (Boolean) mbeanServer.getAttribute(on, "Enabled"); - assertEquals("Should not be enabled", Boolean.FALSE, enabled); - - // enable it - mbeanServer.setAttribute(on, new Attribute("Enabled", Boolean.TRUE)); - - getMockEndpoint("mock:foo").expectedMessageCount(2); - getMockEndpoint("mock:bar").expectedMessageCount(2); - - template.sendBody("direct:start", "Hello World"); - template.sendBody("direct:start", "Bye World"); - - assertMockEndpointsSatisfied(); - - String events = (String) mbeanServer.invoke(on, "dumpAllTracedMessagesAsXml", null, null); - - assertNotNull(events); - log.info(events); - - // should be valid XML - Document dom = context.getTypeConverter().convertTo(Document.class, events); - assertNotNull(dom); - - NodeList list = dom.getElementsByTagName("backlogTracerEventMessage"); - assertEquals(6, list.getLength()); + assertEquals(0, events.size()); } @Override