Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions components/camel-opentracing/src/main/docs/opentracing.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -104,3 +104,32 @@ You can find an example demonstrating the three ways to configure OpenTracing he
https://github.com/apache/camel-spring-boot-examples/tree/master/camel-example-spring-boot-opentracing[camel-example-spring-boot-opentracing]

include::camel-spring-boot::page$opentracing-starter.adoc[]

== Span Operations Processors

The OpenTracing Component exposes the Java API span operations as a set of Processors: `TagProcessor`, `SetBaggageProcessor`, and `GetBaggageProcessor`.

=== Example

[source,java]
---------------------------------------------------------------------------------------------------------
from("seda:a").routeId("a")
.process(new SetBaggageProcessor("a-baggage", simple("${header.request-header}")))
.to("seda:b")
.to("seda:c");

from("seda:b").routeId("b")
.process(new TagProcessor("b-tag", simple("${header.request-header}")));

from("seda:c").routeId("c")
.process(new GetBaggageProcessor("a-baggage", "baggage-header"));
---------------------------------------------------------------------------------------------------------

Where the value of header "request-header" is "foo", the resulting trace from executing route "seda:a" would include:

* Span "a" with a baggage item named "a-baggage" of value "foo"
* Span "b" with a tag named "b-tag" of value "foo"

and the resulting message would contain:

* Header "baggage-header" of value "foo"
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
/*
* 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.opentracing;

import io.opentracing.Span;
import org.apache.camel.AsyncCallback;
import org.apache.camel.Exchange;
import org.apache.camel.Expression;
import org.apache.camel.Traceable;
import org.apache.camel.spi.IdAware;
import org.apache.camel.spi.RouteIdAware;
import org.apache.camel.support.AsyncProcessorSupport;
import org.apache.camel.util.ObjectHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* A processor which gets a baggage item from the active {@link Span} and sets it as a Header
*/
public class GetBaggageProcessor extends AsyncProcessorSupport implements Traceable, IdAware, RouteIdAware {

private static final Logger LOG = LoggerFactory.getLogger(GetBaggageProcessor.class);

private String id;
private String routeId;
private final String headerName;
private final String baggageName;

public GetBaggageProcessor(String baggageName, String headerName) {
this.baggageName = baggageName;
this.headerName = headerName;
ObjectHelper.notNull(baggageName, "baggageName");
ObjectHelper.notNull(headerName, "headerName");
}

@Override
public boolean process(Exchange exchange, AsyncCallback callback) {
try {
Span span = ActiveSpanManager.getSpan(exchange);
if (span != null) {
String item = span.getBaggageItem(baggageName);
exchange.getMessage().setHeader(headerName, item);
} else {
LOG.warn("OpenTracing: could not find managed span for exchange={}", exchange);
}
} catch (Exception e) {
exchange.setException(e);
} finally {
// callback must be invoked
callback.done(true);
}

return true;
}

@Override
public String toString() {
return id;
}

@Override
public String getTraceLabel() {
return "getBaggage[" + baggageName + ", " + headerName + "]";
}

@Override
public String getId() {
return id;
}

@Override
public void setId(String id) {
this.id = id;
}

@Override
public String getRouteId() {
return routeId;
}

@Override
public void setRouteId(String routeId) {
this.routeId = routeId;
}

public String getBaggageName() {
return baggageName;
}

public String getHeaderName() {
return headerName;
}

@Override
protected void doStart() throws Exception {
// noop
}

@Override
protected void doStop() throws Exception {
// noop
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
/*
* 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.opentracing;

import io.opentracing.Span;
import org.apache.camel.AsyncCallback;
import org.apache.camel.Exchange;
import org.apache.camel.Expression;
import org.apache.camel.Traceable;
import org.apache.camel.spi.IdAware;
import org.apache.camel.spi.RouteIdAware;
import org.apache.camel.support.AsyncProcessorSupport;
import org.apache.camel.util.ObjectHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* A processor which adds a baggage item on the active {@link Span} with an {@link Expression}
*/
public class SetBaggageProcessor extends AsyncProcessorSupport implements Traceable, IdAware, RouteIdAware {

private static final Logger LOG = LoggerFactory.getLogger(SetBaggageProcessor.class);

private String id;
private String routeId;
private final String baggageName;
private final Expression expression;

public SetBaggageProcessor(String baggageName, Expression expression) {
this.baggageName = baggageName;
this.expression = expression;
ObjectHelper.notNull(baggageName, "baggageName");
ObjectHelper.notNull(expression, "expression");
}

@Override
public boolean process(Exchange exchange, AsyncCallback callback) {
try {
Span span = ActiveSpanManager.getSpan(exchange);
if (span != null) {
String item = expression.evaluate(exchange, String.class);
span.setBaggageItem(baggageName, item);
} else {
LOG.warn("OpenTracing: could not find managed span for exchange={}", exchange);
}
} catch (Exception e) {
exchange.setException(e);
} finally {
// callback must be invoked
callback.done(true);
}

return true;
}

@Override
public String toString() {
return id;
}

@Override
public String getTraceLabel() {
return "setBaggage[" + baggageName + ", " + expression + "]";
}

@Override
public String getId() {
return id;
}

@Override
public void setId(String id) {
this.id = id;
}

@Override
public String getRouteId() {
return routeId;
}

@Override
public void setRouteId(String routeId) {
this.routeId = routeId;
}

public String getBaggageName() {
return baggageName.toString();
}

public Expression getExpression() {
return expression;
}

@Override
protected void doStart() throws Exception {
// noop
}

@Override
protected void doStop() throws Exception {
// noop
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
/*
* 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.opentracing;
Comment thread
jam01 marked this conversation as resolved.

import io.opentracing.Span;
import org.apache.camel.AsyncCallback;
import org.apache.camel.Exchange;
import org.apache.camel.Expression;
import org.apache.camel.Traceable;
import org.apache.camel.spi.IdAware;
import org.apache.camel.spi.RouteIdAware;
import org.apache.camel.support.AsyncProcessorSupport;
import org.apache.camel.util.ObjectHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* A processor which adds a tag on the active {@link io.opentracing.Span} with an {@link org.apache.camel.Expression}
*/
public class TagProcessor extends AsyncProcessorSupport implements Traceable, IdAware, RouteIdAware {

private static final Logger LOG = LoggerFactory.getLogger(TagProcessor.class);

private String id;
private String routeId;
private final String tagName;
private final Expression expression;

public TagProcessor(String tagName, Expression expression) {
this.tagName = tagName;
this.expression = expression;
ObjectHelper.notNull(tagName, "tagName");
ObjectHelper.notNull(expression, "expression");
}

@Override
public boolean process(Exchange exchange, AsyncCallback callback) {
try {
Span span = ActiveSpanManager.getSpan(exchange);
if (span != null) {
String tag = expression.evaluate(exchange, String.class);
Comment thread
jam01 marked this conversation as resolved.
span.setTag(tagName, tag);
} else {
LOG.warn("OpenTracing: could not find managed span for exchange={}", exchange);
}
} catch (Exception e) {
exchange.setException(e);
} finally {
// callback must be invoked
callback.done(true);
}

return true;
}

@Override
public String toString() {
return id;
}

@Override
public String getTraceLabel() {
return "tag[" + tagName + ", " + expression + "]";
}

@Override
public String getId() {
return id;
}

@Override
public void setId(String id) {
this.id = id;
}

@Override
public String getRouteId() {
return routeId;
}

@Override
public void setRouteId(String routeId) {
this.routeId = routeId;
}

public String getTagName() {
return tagName;
}

public Expression getExpression() {
return expression;
}

@Override
protected void doStart() throws Exception {
// noop
}

@Override
protected void doStop() throws Exception {
// noop
}
}
Loading