Tracer has been edited by Claus Ibsen (Sep 29, 2008).

Change summary:

CAMEL-945

(View changes)

Content:

Tracer Interceptor

Camel supports a tracer interceptor that is used for logging the route executions at INFO level.

The Tracer is an InterceptStrategy which can be applied to a DefaultCamelContext or SpringCamelContext to ensure that there is a TracerInterceptor created for every node in the DSL.

You can enable or disable the Tracer's logging dynamically, by calling the tracer's setEnabled method.

Options

Trace has been improved in Camel 1.5 to be more configurable with these options:

Option Default Description
formatter   Sets the Trace Formatter to use. Will default use org.apache.camel.processor.interceptor.TraceFormatter.
enabled true Flag to enable or disable this tracer
level INFO The logging level to use: FATAL, ERROR, WARN, INFO, DEBUG, TRACE
logName   The log name to use. Will default use org.apache.camel.processor.interceptor.TraceInterceptor.
traceFilter null An exchange Predicate to filter the tracing.
traceInterceptors false Flag to enable or disable tracing of interceptors
traceExceptions true Flag to enable or disable tracing of thrown exception during processing of the exchange

Formatting

The tracer formats the execution of exchanges to log lines. They are logged at INFO level in the log category: org.apache.camel.processor.interceptor.TraceInterceptor.
The tracer uses by default TraceFormatter to format the log line.

TraceFormatter has the following options:

Option Default Description
showBreadCrumb true Outputs the unique unit of work for the exchange. To be used for correlation so you can identify the same exchange.
showNode true The destination node.
showExchangeId false To output the unique exchange id. Currently the breadcrumb is sufficient.
showProperties true Output the exchange properties
showHeaders true Output the in message headers
showBodyType true Output the in body Java type
showBody true Output the in body
showExchangePattern true Camel 1.5: Output the exchange pattern
showException true Camel 1.5: Output the exception if the exchange has failed

Example:

ID-claus-acer/4412-1222625653890/2-0 -> to(mock:a)                , Pattern:InOnly , Headers:{to=James} , BodyType:String , Body:Hello London

ID-claus-acer/3690-1214458315718/2-0 is the breadcrumb with the unique correlation id.
node3 is the id of the node in the route path. Is always shown.
To[mock:a] is the destination node.
InOnly is the exchange pattern. Is always shown.
Then the rest is properties, headers and the body.

Enabling

To enable tracer from the main run

java org.apache.camel.spring.Main -t

or

java org.apache.camel.spring.Main -trace

and the tracer will be active.

Enabling from Java DSL

The tracer can be enabled by adding it to the interceptor chain to the camel context. This is demonstrated in the unit test below.
Notice: We could have changed the properties on the Tracer object before adding it, if we e.g. don't like the default settings.

public void testSendingSomeMessages() throws Exception {
    template.sendBodyAndHeader("direct:start", "Hello London", "to", "James");
    template.sendBodyAndHeader("direct:start", "This is Copenhagen calling", "from", "Claus");
}

protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        public void configure() throws Exception {
            // add tracer as an interceptor so it will log the exchange executions at runtime
            // this can aid us to understand/see how the exchanges is routed etc.
            getContext().addInterceptStrategy(new Tracer());

            from("direct:start").
                    process(new Processor() {
                        public void process(Exchange exchange) throws Exception {
                            // do nothing
                        }

                        @Override
                        public String toString() {
                            return "MyProcessor";
                        }
                    }).
                    to("mock:a").
                    to("mock:b");
        }
    };
}

Running the test we get the trace information logged at INFO level:

INFO  TraceInterceptor     - ID-claus-acer/4412-1222625653890/2-0 -> process(MyProcessor)      , Pattern:InOnly , Headers:{to=James} , BodyType:String , Body:Hello London 
INFO  TraceInterceptor     - ID-claus-acer/4412-1222625653890/2-0 -> to(mock:a)                , Pattern:InOnly , Headers:{to=James} , BodyType:String , Body:Hello London 
INFO  TraceInterceptor     - ID-claus-acer/4412-1222625653890/2-0 -> to(mock:b)                , Pattern:InOnly , Headers:{to=James} , BodyType:String , Body:Hello London 
INFO  TraceInterceptor     - ID-claus-acer/4412-1222625653890/2-1 -> process(MyProcessor)      , Pattern:InOnly , Headers:{from=Claus} , BodyType:String , Body:This is Copenhagen calling 
INFO  TraceInterceptor     - ID-claus-acer/4412-1222625653890/2-1 -> to(mock:a)                , Pattern:InOnly , Headers:{from=Claus} , BodyType:String , Body:This is Copenhagen calling 
INFO  TraceInterceptor     - ID-claus-acer/4412-1222625653890/2-1 -> to(mock:b)                , Pattern:InOnly , Headers:{from=Claus} , BodyType:String , Body:This is Copenhagen calling

Configuring from Java DSL

The tracer options can be configured from the Java DSL like this:

public void configure() throws Exception {
        // add tracer as an interceptor so it will log the exchange executions at runtime
        // this can aid us to understand/see how the exchanges is routed etc.
        Tracer tracer = new Tracer();
        tracer.getFormatter().setShowBreadCrumb(false);
        tracer.getFormatter().setShowNode(false);
        ...
        getContext().addInterceptStrategy(tracer);

Using predicates to filter exchanges

Available as of Camel 1.5
In the code below we want the tracer only to trace if the body contains the text London. As this is just an example can of course set any Predicate that matches your criteria:

Tracer tracer = new Tracer();
    // set the level to FATAL so we can easily spot it
    tracer.setLevel(LoggingLevel.FATAL);
    // and only trace if the body contains London as text
    tracer.setTraceFilter(body().contains(constant("London")));
    // do not show exchange pattern
    tracer.getFormatter().setShowExchangePattern(false);

Enabling from Spring XML

There is now a trace attribute you can specify on the *<camelContext/> for example

<camelContext trace="true" xmlns="http://activemq.apache.org/camel/schema/spring">
    ...
  </camelContext>

You can see this in action with the SpringTraceTest and its spring.xml file

Another option is to just include a spring XML which defines the Tracer bean such as the one that is automatically included if you run the Main with -t above.

Configuration from Spring

In Camel 1.5 you can configure the tracer as a Spring bean. Just add a bean with the bean class org.apache.camel.processor.interceptor.Tracer and Camel will use it as the Tracer.

<!-- we can configure the tracer by defining the tracer bean and set the properties as we like -->
<!-- the id name can be anything its the class that must be org.apache.camel.processor.interceptor.Tracer -->
<bean id="camelTracer" class="org.apache.camel.processor.interceptor.Tracer">
    <property name="traceExceptions" value="false"/>
    <property name="traceInterceptors" value="true"/>
    <property name="level" value="FATAL"/>
</bean>

<camelContext id="camel" trace="true" xmlns="http://activemq.apache.org/camel/schema/spring">
    <route>
        <from uri="direct:start"/>
        <to uri="mock:result"/>
    </route>
</camelContext>

Formatting from Spring

In Camel 1.5 you can configure the formatting of tracer as a Spring bean. Just add a bean with the id traceFormatter and Camel will lookup this id and use the formatter, as the example below illustrates:

<bean id="traceFormatter" class="org.apache.camel.processor.interceptor.TraceFormatter">
    <property name="showBody" value="true"/>
    <property name="showBodyType" value="false"/>
    <property name="showBreadCrumb" value="false"/>
</bean>

<camelContext id="camel" trace="true" xmlns="http://activemq.apache.org/camel/schema/spring">
    <route>
        <from uri="direct:start"/>
        <to uri="mock:result"/>
    </route>
</camelContext>

See Also

Reply via email to