DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
Available as of Camel 2.18
The The camel-zipkin component is used for tracing and timing incoming and outgoing Camel messages using zipkin. Events (span) are captured for incoming and outgoing messages being sent to/from Camel. This means you need to configure which which Camel endpoints that maps to zipkin Zipkin service names.
The mapping can be configured using:
- route id ID - A Camel route id
- endpoint url URL - A Camel endpoint urlURL
For both kinds you can use wildcards and regular expressions to match, which is using the rules from Intercept. To match all Camel messages you can use use * in the pattern and configure that to the same service name. If no mapping has been configured then Camel will fallback and use endpoint uri's URIs as service names.
However its recommended to configure service mappings so you can use human logic names instead of Camel endpoint uris URIs in the names.
Camel will auto-configure a a ScribeSpanCollector if no no SpanCollector explicit has been configured, and if the hostname and port to the span collector has been configured as environment variables:
ZIPKIN_COLLECTOR_THRIFT_SERVICE_HOST- The hostnameZIPKIN_COLLECTOR_THRIFT_SERVICE_PORT- The port number
This makes it easy to use use camel-zipkin in container platforms where the platform can run your application in a linux Linux container where service configurations are provided as environment variables.
...
You can configure the following options on ZipkinEventNotifieron ZipkinEventNotifier:
| Option | Default | Description | rate | 1.0fConfigures a rate that decides how many events should be traced by zipkin. The rate is expressed as a percentage (1.0f = 100%, 0.5f is 50%, 0.1f is 10%). | |
|---|---|---|---|---|---|
| spanCollector | Mandatory: The collector to use for sending zipkin span events to the zipkin server. | ||||
| serviceName | To use a global service name that matches all Camel events | ||||
clientServiceMappings | Sets the client service mappings that matches Camel events to the given zipkin given Zipkin service name. | serverServiceMappings | Sets the server service mappings that matches Camel events to the given zipkin service name. | a | |
excludePatterns | Sets exclude pattern(s) that will disable tracing | with zipkin with Zipkin for Camel messages that matches the pattern. | a a | ||
includeMessageBody | false | Whether to include the Camel message body in | the zipkinthe Zipkin traces. This is not recommended for production usage, or when having big payloads. You can limit the size by configuring the max debug log size. | ||
includeMessageBodyStreams | false | Whether to include message bodies that are stream based in | the zipkin the Zipkin traces. | ||
rate | 1.0f | Configures a rate that decides how many events should be traced by Zipkin. The rate is expressed as a percentage ( 1.0f = 100%, 0.5f is 50%, 0.1f is 10%). | |||
serverServiceMappings | Sets the server service mappings that matches Camel events to the given Zipkin service name. The content is a Map<String, String> where the key is a pattern and the value is the service name.The pattern uses the rules from Intercept. | ||||
serviceName | To use a global service name that matches all Camel events | ||||
spanCollector | Mandatory: The collector to use for sending Zipkin span events to the Zipkin server. |
Example
To enable enable camel-zipkin you need to configure first
| Code Block | ||
|---|---|---|
| ||
ZipkinTracer zipkin = new ZipkinTracer(); // configureConfigure the scribe span collector with the hostname and port for the Zipkin Collector Server zipkin.setSpanCollector(new ScribeSpanCollector("192.168.90.100", 9410); // and ...then add zipkin to the CamelContext zipkin.init(camelContext); |
The configuration about will the trace all incoming and outgoing messages in Camel routes.
To use ZipinTracer use ZipkinTracer in XML all you need to do is to setup scribe an the zipkin Zipkin tracer as as <bean> and then they are automatic discovered and used by Camel.
...
You can configure a global service name that all events will fallback and use, such as:
| Code Block | ||
|---|---|---|
| ||
zipkin.setServiceName("invoices"); |
This will use the same service name for all incoming and outgoing zipkin Zipkin traces. So if your application uses different services, you need to map them more fine grained into client vs server mappings
Client and Server Service Mappings
ClientServiceMappingsServerServiceMappings
So if your application hosts a service that others can call, you can map the Camel route endpoint to a server service mapping. For example support your Camel application has the following route
| Code Block | ||
|---|---|---|
| ||
from("activemq:queue:inbox")
...
.to("http:someserver/somepath"); |
And you want to make that as a server service, you can add the following mapping
| Code Block | ||
|---|---|---|
| ||
zipkin.addServerServiceMapping("activemq:queue:inbox", "orders"); |
Then when a message is consumed from that inbox queue, it becomes a zipkin Zipkin server event with the service name orders.
Now suppose that the call to http:someserver/somepath is also a service, which you want to map to a client service name, which can be done as:
| Code Block | ||
|---|---|---|
| ||
zipkin.addClientServiceMapping("http:someserver/somepath", "audit"); |
...
- Is there an exclude pattern that matches the endpoint uri endpoint URI of the from endpoint? If yes then skip.
- Is there a match in the the
serviceServiceMappingthat matches the endpoint uri endpoint URI of the from endpoint? If yes the use the found service name - Is there a match in the the
serviceServiceMappingthat matches the route id of the current route? If yes the use the found service name - Is there a match in the the
serviceServiceMappingthat matches the original route id where the exchange started? If yes the use the found service name - No service name was found, the exchange is not traced by zipkinZipkin.
The service name mapping for client occurs using the following rules
- Is there an exclude pattern that matches the endpoint uri endpoint URI of the from endpoint? If yes then skip.
- Is there a match in the the
clientServiceMappingthat matches the endpoint uri URI of endpoint where the message is being sent to? If yes the use the found service name - Is there a match in the the
clientServiceMappingthat matches the route id of the current route? If yes the use the found service name - Is there a match in the the
clientServiceMappingthat matches the original route id where the exchange started? If yes the use the found service name - No service name was found, the exchange is not traced by zipkinZipkin.
No client or server mappings
If there has been no configuration of client or server service mappings, then then CamelZipkin runs in a fallback mode, where it uses the endpoint uris endpoint URIs as the service name.
So in the example above that would mean the service names would be, as if you add the following code yourself:
| Code Block | ||
|---|---|---|
| ||
zipkin.addServerServiceMapping("activemq:queue:inbox", "activemq:queue:inbox");
zipkin.addClientServiceMapping("http:someserver/somepath", "http:someserver/somepath"); |
This is not a recommended approach but gets you up and running quickly without doing any service name mappings. However when you have multiple systems across your infrastructure, then you should consider using human logic service names, that you map to instead of using the camel endpoint urisURIs.
camel-
...
zipkin-starter
If you are using Spring Boot then you can add the camel-zipkin-starter dependency, and turn on zipkin Zipkin by annotating the main class with @CamelZipkin. You can then configure configure camel-zipkin in the application.properties file where you can configure the hostname and port number for the Zipkin Server, and all the other options as listed in the options table above.
...