Make BaseTracer fields private (#2492)

* Make BaseTracer fields private

By making `tracer` private we're forcing all tracer implementation to use the `spanBuilder()` utility method and pass the parent context manually.
This commit is contained in:
Mateusz Rzeszutek 2021-03-05 19:54:00 +01:00 committed by GitHub
parent 7111cb793e
commit 72ffb3b7c5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
39 changed files with 127 additions and 174 deletions

View File

@ -49,8 +49,8 @@ public abstract class BaseTracer {
private static final SupportabilityMetrics supportability =
new SupportabilityMetrics(Config.get()).start();
protected final Tracer tracer;
protected final ContextPropagators propagators;
private final Tracer tracer;
private final ContextPropagators propagators;
public BaseTracer() {
this(GlobalOpenTelemetry.get());
@ -153,12 +153,13 @@ public abstract class BaseTracer {
* name {@code spanName} and kind {@code kind}.
*/
public Context startSpan(Context parentContext, String spanName, SpanKind kind) {
Span span = spanBuilder(spanName, kind).setParent(parentContext).startSpan();
Span span = spanBuilder(parentContext, spanName, kind).startSpan();
return parentContext.with(span);
}
protected SpanBuilder spanBuilder(String spanName, SpanKind kind) {
return tracer.spanBuilder(spanName).setSpanKind(kind);
/** Returns a {@link SpanBuilder} to create and start a new {@link Span}. */
protected final SpanBuilder spanBuilder(Context parentContext, String spanName, SpanKind kind) {
return tracer.spanBuilder(spanName).setSpanKind(kind).setParent(parentContext);
}
/**
@ -217,7 +218,7 @@ public abstract class BaseTracer {
if (clazz.getPackage() != null) {
String pkgName = clazz.getPackage().getName();
if (!pkgName.isEmpty()) {
className = clazz.getName().replace(pkgName, "").substring(1);
className = className.substring(pkgName.length() + 1);
}
}
return className;

View File

@ -40,10 +40,7 @@ public abstract class DatabaseClientTracer<CONNECTION, STATEMENT, SANITIZEDSTATE
SANITIZEDSTATEMENT sanitizedStatement = sanitizeStatement(statement);
SpanBuilder span =
tracer
.spanBuilder(spanName(connection, statement, sanitizedStatement))
.setParent(parentContext)
.setSpanKind(CLIENT)
spanBuilder(parentContext, spanName(connection, statement, sanitizedStatement), CLIENT)
.setAttribute(SemanticAttributes.DB_SYSTEM, dbSystem(connection));
if (connection != null) {

View File

@ -139,7 +139,7 @@ public abstract class HttpClientTracer<REQUEST, CARRIER, RESPONSE> extends BaseT
private Span internalStartSpan(
SpanKind kind, Context parentContext, REQUEST request, String name, long startTimeNanos) {
SpanBuilder spanBuilder = tracer.spanBuilder(name).setSpanKind(kind).setParent(parentContext);
SpanBuilder spanBuilder = spanBuilder(parentContext, name, kind);
if (startTimeNanos > 0) {
spanBuilder.setStartTimestamp(startTimeNanos, TimeUnit.NANOSECONDS);
}

View File

@ -82,7 +82,7 @@ public abstract class HttpServerTracer<REQUEST, RESPONSE, CONNECTION, STORAGE> e
// whether to call end() or not on the Span in the returned Context
Context parentContext = extract(request, getGetter());
SpanBuilder builder = tracer.spanBuilder(spanName).setSpanKind(SERVER).setParent(parentContext);
SpanBuilder builder = spanBuilder(parentContext, spanName, SERVER);
if (startTimestamp >= 0) {
builder.setStartTimestamp(startTimestamp, TimeUnit.NANOSECONDS);

View File

@ -24,7 +24,6 @@
package io.opentelemetry.javaagent.instrumentation.apachecamel;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanBuilder;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.context.Context;
import org.apache.camel.Exchange;
@ -38,23 +37,20 @@ final class CamelRoutePolicy extends RoutePolicySupport {
private static final Logger LOG = LoggerFactory.getLogger(CamelRoutePolicy.class);
private Span spanOnExchangeBegin(
Route route, Exchange exchange, SpanDecorator sd, SpanKind spanKind) {
Span activeSpan = Span.current();
String name = sd.getOperationName(exchange, route.getEndpoint(), CamelDirection.INBOUND);
SpanBuilder builder = CamelTracer.TRACER.spanBuilder(name);
builder.setSpanKind(spanKind);
Route route, Exchange exchange, SpanDecorator sd, Context parentContext, SpanKind spanKind) {
Span activeSpan = Span.fromContext(parentContext);
if (!activeSpan.getSpanContext().isValid()) {
Context parentContext =
parentContext =
CamelPropagationUtil.extractParent(exchange.getIn().getHeaders(), route.getEndpoint());
if (parentContext != null) {
builder.setParent(parentContext);
}
}
return builder.startSpan();
String name = sd.getOperationName(exchange, route.getEndpoint(), CamelDirection.INBOUND);
Context context = CamelTracer.TRACER.startSpan(parentContext, name, spanKind);
return Span.fromContext(context);
}
private SpanKind spanKind(SpanDecorator sd) {
Span activeSpan = Span.current();
private SpanKind spanKind(Context context, SpanDecorator sd) {
Span activeSpan = Span.fromContext(context);
// if there's an active span, this is not a root span which we always mark as INTERNAL
return (activeSpan.getSpanContext().isValid() ? SpanKind.INTERNAL : sd.getReceiverSpanKind());
}
@ -67,8 +63,9 @@ final class CamelRoutePolicy extends RoutePolicySupport {
public void onExchangeBegin(Route route, Exchange exchange) {
try {
SpanDecorator sd = CamelTracer.TRACER.getSpanDecorator(route.getEndpoint());
SpanKind spanKind = spanKind(sd);
Span span = spanOnExchangeBegin(route, exchange, sd, spanKind);
Context parentContext = Context.current();
SpanKind spanKind = spanKind(parentContext, sd);
Span span = spanOnExchangeBegin(route, exchange, sd, parentContext, spanKind);
sd.pre(span, exchange, route.getEndpoint(), CamelDirection.INBOUND);
ActiveSpanManager.activate(exchange, span, spanKind);
LOG.debug("[Route start] Receiver span started {}", span);

View File

@ -24,7 +24,6 @@
package io.opentelemetry.javaagent.instrumentation.apachecamel;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanBuilder;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
import io.opentelemetry.instrumentation.api.tracer.BaseTracer;
@ -43,10 +42,6 @@ class CamelTracer extends BaseTracer {
return "io.opentelemetry.javaagent.apache-camel-2.20";
}
public SpanBuilder spanBuilder(String name) {
return tracer.spanBuilder(name);
}
public Scope startClientScope(Span span) {
Context current = super.withClientSpan(Context.current(), span);
return current.makeCurrent();

View File

@ -25,11 +25,9 @@ class DubboTracer extends RpcServerTracer<RpcInvocation> {
public Context startServerSpan(
String interfaceName, String methodName, RpcInvocation rpcInvocation) {
Context parentContext = extract(rpcInvocation, getGetter());
SpanBuilder spanBuilder =
tracer
.spanBuilder(DubboHelper.getSpanName(interfaceName, methodName))
.setSpanKind(SERVER)
.setParent(extract(rpcInvocation, getGetter()))
spanBuilder(parentContext, DubboHelper.getSpanName(interfaceName, methodName), SERVER)
.setAttribute(SemanticAttributes.RPC_SYSTEM, "dubbo");
DubboHelper.prepareSpan(spanBuilder, interfaceName, methodName);
NetPeerUtils.INSTANCE.setNetPeer(spanBuilder, RpcContext.getContext().getRemoteAddress());
@ -37,14 +35,13 @@ class DubboTracer extends RpcServerTracer<RpcInvocation> {
}
public Context startClientSpan(String interfaceName, String methodName) {
Context parentContext = Context.current();
SpanBuilder spanBuilder =
tracer
.spanBuilder(DubboHelper.getSpanName(interfaceName, methodName))
.setSpanKind(CLIENT)
spanBuilder(parentContext, DubboHelper.getSpanName(interfaceName, methodName), CLIENT)
.setAttribute(SemanticAttributes.RPC_SYSTEM, "dubbo");
DubboHelper.prepareSpan(spanBuilder, interfaceName, methodName);
NetPeerUtils.INSTANCE.setNetPeer(spanBuilder, RpcContext.getContext().getRemoteAddress());
return withClientSpan(Context.current(), spanBuilder.startSpan());
return withClientSpan(parentContext, spanBuilder.startSpan());
}
public void end(Context context, Result result) {

View File

@ -33,12 +33,7 @@ public class ApacheHttpAsyncClientTracer
}
public Context startSpan(Context parentContext) {
Span span =
tracer
.spanBuilder(DEFAULT_SPAN_NAME)
.setSpanKind(CLIENT)
.setParent(parentContext)
.startSpan();
Span span = spanBuilder(parentContext, DEFAULT_SPAN_NAME, CLIENT).startSpan();
return withClientSpan(parentContext, span);
}

View File

@ -63,7 +63,7 @@ public class AwsLambdaRequestHandlerInstrumentation implements TypeInstrumentati
functionContext = functionTracer().startSpan(context, SpanKind.SERVER, arg);
functionScope = functionContext.makeCurrent();
if (arg instanceof SQSEvent) {
messageContext = messageTracer().startSpan((SQSEvent) arg);
messageContext = messageTracer().startSpan(functionContext, (SQSEvent) arg);
messageScope = messageContext.makeCurrent();
}
}

View File

@ -5,13 +5,14 @@
package io.opentelemetry.instrumentation.awslambda.v1_0;
import static io.opentelemetry.api.trace.SpanKind.CONSUMER;
import com.amazonaws.services.lambda.runtime.events.SQSEvent;
import com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanBuilder;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.context.Context;
import io.opentelemetry.instrumentation.api.tracer.BaseTracer;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
@ -24,7 +25,7 @@ public class AwsLambdaMessageTracer extends BaseTracer {
super(openTelemetry);
}
public Context startSpan(SQSEvent event) {
public Context startSpan(Context parentContext, SQSEvent event) {
// Use event source in name if all messages have the same source, otherwise use placeholder.
String source = "multiple_sources";
if (!event.getRecords().isEmpty()) {
@ -41,7 +42,7 @@ public class AwsLambdaMessageTracer extends BaseTracer {
}
}
SpanBuilder span = tracer.spanBuilder(source + " process").setSpanKind(SpanKind.CONSUMER);
SpanBuilder span = spanBuilder(parentContext, source + " process", CONSUMER);
span.setAttribute(SemanticAttributes.MESSAGING_SYSTEM, "AmazonSQS");
span.setAttribute(SemanticAttributes.MESSAGING_OPERATION, "process");
@ -50,12 +51,11 @@ public class AwsLambdaMessageTracer extends BaseTracer {
addLinkToMessageParent(message, span);
}
return Context.current().with(span.startSpan());
return parentContext.with(span.startSpan());
}
public Context startSpan(SQSMessage message) {
SpanBuilder span =
tracer.spanBuilder(message.getEventSource() + " process").setSpanKind(SpanKind.CONSUMER);
public Context startSpan(Context parentContext, SQSMessage message) {
SpanBuilder span = spanBuilder(parentContext, message.getEventSource() + " process", CONSUMER);
span.setAttribute(SemanticAttributes.MESSAGING_SYSTEM, "AmazonSQS");
span.setAttribute(SemanticAttributes.MESSAGING_OPERATION, "process");
@ -64,7 +64,7 @@ public class AwsLambdaMessageTracer extends BaseTracer {
addLinkToMessageParent(message, span);
return Context.current().with(span.startSpan());
return parentContext.with(span.startSpan());
}
private void addLinkToMessageParent(SQSMessage message, SpanBuilder span) {

View File

@ -118,11 +118,10 @@ public class AwsLambdaTracer extends BaseTracer {
Context awsContext, SpanKind kind, Object input, Map<String, String> headers) {
io.opentelemetry.context.Context parentContext = ParentContextExtractor.extract(headers, this);
SpanBuilder spanBuilder = tracer.spanBuilder(spanName(awsContext, input));
SpanBuilder spanBuilder = spanBuilder(parentContext, spanName(awsContext, input), kind);
setAttributes(spanBuilder, awsContext, input);
Span span = spanBuilder.setParent(parentContext).setSpanKind(kind).startSpan();
return withServerSpan(parentContext, span);
return withServerSpan(parentContext, spanBuilder.startSpan());
}
public void onOutput(io.opentelemetry.context.Context context, Object output) {

View File

@ -45,7 +45,8 @@ public abstract class TracingSqsEventHandler extends TracingRequestHandler<SQSEv
@Override
public Void doHandleRequest(SQSEvent event, Context context) {
io.opentelemetry.context.Context otelContext = tracer.startSpan(event);
io.opentelemetry.context.Context parentContext = io.opentelemetry.context.Context.current();
io.opentelemetry.context.Context otelContext = tracer.startSpan(parentContext, event);
Throwable error = null;
try (Scope ignored = otelContext.makeCurrent()) {
handleEvent(event, context);

View File

@ -43,8 +43,9 @@ public abstract class TracingSqsMessageHandler extends TracingSqsEventHandler {
@Override
protected final void handleEvent(SQSEvent event, Context context) {
io.opentelemetry.context.Context parentContext = io.opentelemetry.context.Context.current();
for (SQSMessage message : event.getRecords()) {
io.opentelemetry.context.Context otelContext = getTracer().startSpan(message);
io.opentelemetry.context.Context otelContext = getTracer().startSpan(parentContext, message);
Throwable error = null;
try (Scope ignored = otelContext.makeCurrent()) {
handleMessage(message, context);

View File

@ -29,8 +29,7 @@ final class AwsSdkHttpClientTracer
public Context startSpan(Context parentContext, ExecutionAttributes attributes) {
String spanName = spanName(attributes);
Span span =
tracer.spanBuilder(spanName).setSpanKind(CLIENT).setParent(parentContext).startSpan();
Span span = spanBuilder(parentContext, spanName, CLIENT).startSpan();
return withClientSpan(parentContext, span);
}

View File

@ -24,12 +24,11 @@ public class GeodeTracer extends DatabaseClientTracer<Region<?, ?>, String, SqlS
}
public Context startSpan(String operation, Region<?, ?> connection, String query) {
Context parentContext = Context.current();
SqlStatementInfo sanitizedStatement = sanitizeStatement(query);
SpanBuilder span =
tracer
.spanBuilder(operation)
.setSpanKind(CLIENT)
spanBuilder(parentContext, operation, CLIENT)
.setAttribute(SemanticAttributes.DB_SYSTEM, dbSystem(connection))
.setAttribute(SemanticAttributes.DB_OPERATION, operation);
@ -37,7 +36,7 @@ public class GeodeTracer extends DatabaseClientTracer<Region<?, ?>, String, SqlS
setNetSemanticConvention(span, connection);
onStatement(span, connection, query, sanitizedStatement);
return Context.current().with(span.startSpan());
return parentContext.with(span.startSpan());
}
@Override

View File

@ -26,11 +26,13 @@ final class GrpcClientTracer extends RpcClientTracer {
}
public Context startSpan(String name) {
Context parentContext = Context.current();
Span span =
spanBuilder(name, CLIENT)
spanBuilder(parentContext, name, CLIENT)
.setAttribute(SemanticAttributes.RPC_SYSTEM, getRpcSystem())
.startSpan();
return Context.current().with(span);
// TODO: withClientSpan()
return parentContext.with(span);
}
public void end(Context context, Status status) {

View File

@ -24,10 +24,11 @@ final class GrpcServerTracer extends RpcServerTracer<Metadata> {
}
public Context startSpan(String name, Metadata headers) {
SpanBuilder spanBuilder =
tracer.spanBuilder(name).setSpanKind(SERVER).setParent(extract(headers, getGetter()));
Context parentContext = extract(headers, getGetter());
SpanBuilder spanBuilder = spanBuilder(parentContext, name, SERVER);
spanBuilder.setAttribute(SemanticAttributes.RPC_SYSTEM, "grpc");
return Context.current().with(spanBuilder.startSpan());
// TODO: withServerSpan()
return parentContext.with(spanBuilder.startSpan());
}
public void setStatus(Context context, Status status) {

View File

@ -5,6 +5,8 @@
package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0;
import static io.opentelemetry.api.trace.SpanKind.INTERNAL;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.context.Context;
import io.opentelemetry.instrumentation.api.servlet.ServletContextPath;
@ -46,7 +48,7 @@ public class JaxRsAnnotationsTracer extends BaseTracer {
// We create span and immediately update its name
// We do that in order to reuse logic inside updateSpanNames method, which is used externally as
// well.
Span span = tracer.spanBuilder("jax-rs.request").setParent(parentContext).startSpan();
Span span = spanBuilder(parentContext, "jax-rs.request", INTERNAL).startSpan();
updateSpanNames(
parentContext, span, ServerSpan.fromContextOrNull(parentContext), target, method);
return parentContext.with(span);
@ -59,7 +61,7 @@ public class JaxRsAnnotationsTracer extends BaseTracer {
updateSpanName(span, pathBasedSpanName);
} else {
updateSpanName(serverSpan, pathBasedSpanName);
updateSpanName(span, tracer().spanNameForMethod(target, method));
updateSpanName(span, spanNameForMethod(target, method));
}
}

View File

@ -5,6 +5,8 @@
package io.opentelemetry.javaagent.instrumentation.jaxws.common;
import static io.opentelemetry.api.trace.SpanKind.INTERNAL;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.context.Context;
import io.opentelemetry.instrumentation.api.tracer.BaseTracer;
@ -34,12 +36,11 @@ public class JaxWsTracer extends BaseTracer {
serverSpan.updateName(spanName);
}
return parentContext.with(
tracer
.spanBuilder(spanName)
.setParent(parentContext)
Span span =
spanBuilder(parentContext, spanName, INTERNAL)
.setAttribute(SemanticAttributes.CODE_NAMESPACE, method.getDeclaringClass().getName())
.setAttribute(SemanticAttributes.CODE_FUNCTION, method.getName())
.startSpan());
.startSpan();
return parentContext.with(span);
}
}

View File

@ -41,13 +41,6 @@ public class JmsTracer extends BaseTracer {
public Context startConsumerSpan(
MessageDestination destination, String operation, Message message, long startTime) {
SpanBuilder spanBuilder =
tracer
.spanBuilder(spanName(destination, operation))
.setSpanKind(CONSUMER)
.setStartTimestamp(startTime, TimeUnit.MILLISECONDS)
.setAttribute(SemanticAttributes.MESSAGING_OPERATION, operation);
Context parentContext = Context.root();
if (message != null && "process".equals(operation)) {
// TODO use BaseTracer.extract() which has context leak detection
@ -57,16 +50,21 @@ public class JmsTracer extends BaseTracer {
.getTextMapPropagator()
.extract(Context.root(), message, GETTER);
}
spanBuilder.setParent(parentContext);
SpanBuilder spanBuilder =
spanBuilder(parentContext, spanName(destination, operation), CONSUMER)
.setStartTimestamp(startTime, TimeUnit.MILLISECONDS)
.setAttribute(SemanticAttributes.MESSAGING_OPERATION, operation);
afterStart(spanBuilder, destination, message);
return parentContext.with(spanBuilder.startSpan());
}
public Context startProducerSpan(MessageDestination destination, Message message) {
SpanBuilder span = tracer.spanBuilder(spanName(destination, "send")).setSpanKind(PRODUCER);
Context parentContext = Context.current();
SpanBuilder span = spanBuilder(parentContext, spanName(destination, "send"), PRODUCER);
afterStart(span, destination, message);
return Context.current().with(span.startSpan());
return parentContext.with(span.startSpan());
}
public Scope startProducerScope(Context context, Message message) {

View File

@ -28,10 +28,7 @@ public class KafkaConsumerTracer extends BaseTracer {
Context parentContext = extractParent(record);
Span span =
tracer
.spanBuilder(spanNameOnConsume(record))
.setSpanKind(CONSUMER)
.setParent(parentContext)
spanBuilder(parentContext, spanNameOnConsume(record), CONSUMER)
.setStartTimestamp(now, TimeUnit.MILLISECONDS)
.setAttribute(SemanticAttributes.MESSAGING_SYSTEM, "kafka")
.setAttribute(SemanticAttributes.MESSAGING_DESTINATION, record.topic())

View File

@ -23,7 +23,7 @@ public class KafkaProducerTracer extends BaseTracer {
}
public Context startProducerSpan(Context parentContext, ProducerRecord<?, ?> record) {
SpanBuilder span = spanBuilder(spanNameOnProduce(record), PRODUCER).setParent(parentContext);
SpanBuilder span = spanBuilder(parentContext, spanNameOnProduce(record), PRODUCER);
onProduce(span, record);
return parentContext.with(span.startSpan());
}

View File

@ -5,10 +5,10 @@
package io.opentelemetry.javaagent.instrumentation.kafkastreams;
import static io.opentelemetry.api.trace.SpanKind.CONSUMER;
import static io.opentelemetry.javaagent.instrumentation.kafkastreams.TextMapExtractAdapter.GETTER;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.context.Context;
import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.api.tracer.BaseTracer;
@ -29,10 +29,7 @@ public class KafkaStreamsTracer extends BaseTracer {
public Context startSpan(StampedRecord record) {
Context parentContext = extract(record.value.headers(), GETTER);
Span span =
tracer
.spanBuilder(spanNameForConsume(record))
.setSpanKind(SpanKind.CONSUMER)
.setParent(parentContext)
spanBuilder(parentContext, spanNameForConsume(record), CONSUMER)
.setAttribute(SemanticAttributes.MESSAGING_SYSTEM, "kafka")
.setAttribute(SemanticAttributes.MESSAGING_DESTINATION, record.topic())
.setAttribute(SemanticAttributes.MESSAGING_DESTINATION_KIND, "topic")

View File

@ -32,12 +32,7 @@ public class NettyHttpClientTracer
}
public Context startSpan(Context parentContext, ChannelHandlerContext ctx, HttpRequest request) {
Span span =
tracer
.spanBuilder(spanNameForRequest(request))
.setSpanKind(CLIENT)
.setParent(parentContext)
.startSpan();
Span span = spanBuilder(parentContext, spanNameForRequest(request), CLIENT).startSpan();
onRequest(span, request);
NetPeerUtils.INSTANCE.setNetPeer(span, (InetSocketAddress) ctx.getChannel().getRemoteAddress());

View File

@ -32,12 +32,7 @@ public class NettyHttpClientTracer
}
public Context startSpan(Context parentContext, ChannelHandlerContext ctx, HttpRequest request) {
Span span =
tracer
.spanBuilder(spanNameForRequest(request))
.setSpanKind(CLIENT)
.setParent(parentContext)
.startSpan();
Span span = spanBuilder(parentContext, spanNameForRequest(request), CLIENT).startSpan();
onRequest(span, request);
NetPeerUtils.INSTANCE.setNetPeer(span, (InetSocketAddress) ctx.channel().remoteAddress());

View File

@ -32,12 +32,7 @@ public class NettyHttpClientTracer
}
public Context startSpan(Context parentContext, ChannelHandlerContext ctx, HttpRequest request) {
Span span =
tracer
.spanBuilder(spanNameForRequest(request))
.setSpanKind(CLIENT)
.setParent(parentContext)
.startSpan();
Span span = spanBuilder(parentContext, spanNameForRequest(request), CLIENT).startSpan();
onRequest(span, request);
NetPeerUtils.INSTANCE.setNetPeer(span, (InetSocketAddress) ctx.channel().remoteAddress());

View File

@ -24,18 +24,18 @@ public class WithSpanTracer extends BaseTracer {
private static final Logger log = LoggerFactory.getLogger(WithSpanTracer.class);
public Context startSpan(
Context context, WithSpan applicationAnnotation, Method method, SpanKind kind) {
Context parentContext, WithSpan applicationAnnotation, Method method, SpanKind kind) {
Span span =
spanBuilder(spanNameForMethodWithAnnotation(applicationAnnotation, method), kind)
.setParent(context)
spanBuilder(
parentContext, spanNameForMethodWithAnnotation(applicationAnnotation, method), kind)
.startSpan();
if (kind == SpanKind.SERVER) {
return withServerSpan(context, span);
return withServerSpan(parentContext, span);
}
if (kind == SpanKind.CLIENT) {
return withClientSpan(context, span);
return withClientSpan(parentContext, span);
}
return context.with(span);
return parentContext.with(span);
}
/**

View File

@ -40,23 +40,23 @@ public class RabbitTracer extends BaseTracer {
}
public Context startSpan(String method, Connection connection) {
Context parentContext = Context.current();
SpanKind kind = method.equals("Channel.basicPublish") ? PRODUCER : CLIENT;
SpanBuilder span =
spanBuilder(method, kind)
spanBuilder(parentContext, method, kind)
.setAttribute(SemanticAttributes.MESSAGING_SYSTEM, "rabbitmq")
.setAttribute(SemanticAttributes.MESSAGING_DESTINATION_KIND, "queue");
NetPeerUtils.INSTANCE.setNetPeer(span, connection.getAddress(), connection.getPort());
return Context.current().with(span.startSpan());
return parentContext.with(span.startSpan());
}
public Context startGetSpan(
String queue, long startTime, GetResponse response, Connection connection) {
Context parentContext = Context.current();
SpanBuilder spanBuilder =
tracer
.spanBuilder(spanNameOnGet(queue))
.setSpanKind(CLIENT)
spanBuilder(parentContext, spanNameOnGet(queue), CLIENT)
.setAttribute(SemanticAttributes.MESSAGING_SYSTEM, "rabbitmq")
.setAttribute(SemanticAttributes.MESSAGING_DESTINATION_KIND, "queue")
.setAttribute(SemanticAttributes.MESSAGING_OPERATION, "receive")
@ -76,7 +76,8 @@ public class RabbitTracer extends BaseTracer {
NetPeerUtils.INSTANCE.setNetPeer(spanBuilder, connection.getAddress(), connection.getPort());
onGet(spanBuilder, queue);
return Context.current().with(spanBuilder.startSpan());
// TODO: withClientSpan()?
return parentContext.with(spanBuilder.startSpan());
}
public Context startDeliverySpan(
@ -86,10 +87,7 @@ public class RabbitTracer extends BaseTracer {
long startTimeMillis = System.currentTimeMillis();
Span span =
tracer
.spanBuilder(spanNameOnDeliver(queue))
.setSpanKind(CONSUMER)
.setParent(parentContext)
spanBuilder(parentContext, spanNameOnDeliver(queue), CONSUMER)
.setStartTimestamp(startTimeMillis, TimeUnit.MILLISECONDS)
.setAttribute(SemanticAttributes.MESSAGING_SYSTEM, "rabbitmq")
.setAttribute(SemanticAttributes.MESSAGING_DESTINATION_KIND, "queue")

View File

@ -21,17 +21,18 @@ public class RmiClientTracer extends RpcClientTracer {
}
public Context startSpan(Method method) {
Context parentContext = Context.current();
String serviceName = method.getDeclaringClass().getName();
String methodName = method.getName();
Span span =
spanBuilder(serviceName + "/" + methodName, CLIENT)
spanBuilder(parentContext, serviceName + "/" + methodName, CLIENT)
.setAttribute(SemanticAttributes.RPC_SYSTEM, getRpcSystem())
.setAttribute(SemanticAttributes.RPC_SERVICE, serviceName)
.setAttribute(SemanticAttributes.RPC_METHOD, methodName)
.startSpan();
return Context.current().with(span);
return parentContext.with(span);
}
@Override

View File

@ -26,10 +26,7 @@ public class RmiServerTracer extends RpcServerTracer {
String methodName = method.getName();
SpanBuilder spanBuilder =
tracer
.spanBuilder(serviceName + "/" + methodName)
.setSpanKind(SERVER)
.setParent(parentContext)
spanBuilder(parentContext, serviceName + "/" + methodName, SERVER)
.setAttribute(SemanticAttributes.RPC_SYSTEM, "java_rmi")
.setAttribute(SemanticAttributes.RPC_SERVICE, serviceName)
.setAttribute(SemanticAttributes.RPC_METHOD, methodName);

View File

@ -23,21 +23,24 @@ public class ChunkExecutionTracer extends BaseTracer {
}
public Context startSpan(ChunkContext chunkContext) {
String jobName = chunkContext.getStepContext().getJobName();
String stepName = chunkContext.getStepContext().getStepName();
SpanBuilder spanBuilder =
tracer.spanBuilder("BatchJob " + jobName + "." + stepName + ".Chunk").setSpanKind(INTERNAL);
Context parentContext = Context.current();
SpanBuilder spanBuilder = spanBuilder(parentContext, spanName(chunkContext), INTERNAL);
if (shouldCreateRootSpanForChunk()) {
linkParentSpan(spanBuilder);
linkParentSpan(spanBuilder, parentContext);
}
Span span = spanBuilder.startSpan();
return Context.current().with(span);
return parentContext.with(spanBuilder.startSpan());
}
private void linkParentSpan(SpanBuilder spanBuilder) {
private String spanName(ChunkContext chunkContext) {
String jobName = chunkContext.getStepContext().getJobName();
String stepName = chunkContext.getStepContext().getStepName();
return "BatchJob " + jobName + "." + stepName + ".Chunk";
}
private void linkParentSpan(SpanBuilder spanBuilder, Context parentContext) {
spanBuilder.setNoParent();
SpanContext parentSpanContext = Span.current().getSpanContext();
SpanContext parentSpanContext = Span.fromContext(parentContext).getSpanContext();
if (parentSpanContext.isValid()) {
spanBuilder.addLink(parentSpanContext);
}

View File

@ -5,8 +5,6 @@
package io.opentelemetry.javaagent.instrumentation.spring.batch.job;
import static io.opentelemetry.api.trace.SpanKind.INTERNAL;
import io.opentelemetry.context.Context;
import io.opentelemetry.instrumentation.api.tracer.BaseTracer;
import org.springframework.batch.core.JobExecution;
@ -20,7 +18,7 @@ public class JobExecutionTracer extends BaseTracer {
public Context startSpan(JobExecution jobExecution) {
String jobName = jobExecution.getJobInstance().getJobName();
return startSpan("BatchJob " + jobName, INTERNAL);
return startSpan("BatchJob " + jobName);
}
@Override

View File

@ -5,8 +5,6 @@
package io.opentelemetry.javaagent.instrumentation.spring.batch.step;
import static io.opentelemetry.api.trace.SpanKind.INTERNAL;
import io.opentelemetry.context.Context;
import io.opentelemetry.instrumentation.api.tracer.BaseTracer;
import org.springframework.batch.core.StepExecution;
@ -21,7 +19,7 @@ public class StepExecutionTracer extends BaseTracer {
public Context startSpan(StepExecution stepExecution) {
String jobName = stepExecution.getJobExecution().getJobInstance().getJobName();
String stepName = stepExecution.getStepName();
return startSpan("BatchJob " + jobName + "." + stepName, INTERNAL);
return startSpan("BatchJob " + jobName + "." + stepName);
}
@Override

View File

@ -24,9 +24,7 @@ class WithSpanAspectTracer extends BaseTracer {
Context startSpan(Context parentContext, WithSpan annotation, Method method) {
Span span =
spanBuilder(spanName(annotation, method), annotation.kind())
.setParent(parentContext)
.startSpan();
spanBuilder(parentContext, spanName(annotation, method), annotation.kind()).startSpan();
switch (annotation.kind()) {
case SERVER:
return withServerSpan(parentContext, span);

View File

@ -8,7 +8,6 @@ package io.opentelemetry.instrumentation.spring.webflux.client;
import static io.opentelemetry.instrumentation.spring.webflux.client.HttpHeadersInjectAdapter.SETTER;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.propagation.TextMapSetter;
import io.opentelemetry.instrumentation.api.config.Config;
@ -85,10 +84,6 @@ public class SpringWebfluxHttpClientTracer
return "io.opentelemetry.javaagent.spring-webflux-5.0";
}
public Tracer getTracer() {
return tracer;
}
// rawStatusCode() method was introduced in webflux 5.1
// prior to this method, the best we can get is HttpStatus enum, which only covers standard status
// codes (see usage above)

View File

@ -5,9 +5,10 @@
package io.opentelemetry.javaagent.instrumentation.springwebmvc;
import static io.opentelemetry.api.trace.SpanKind.INTERNAL;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanBuilder;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.context.Context;
import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.api.servlet.ServletContextPath;
@ -36,13 +37,14 @@ public class SpringWebMvcTracer extends BaseTracer {
}
public Context startHandlerSpan(Context parentContext, Object handler) {
return startSpan(parentContext, spanNameOnHandle(handler), SpanKind.INTERNAL);
return startSpan(parentContext, spanNameOnHandle(handler), INTERNAL);
}
public Context startSpan(ModelAndView mv) {
SpanBuilder span = tracer.spanBuilder(spanNameOnRender(mv));
Context parentContext = Context.current();
SpanBuilder span = spanBuilder(parentContext, spanNameOnRender(mv), INTERNAL);
onRender(span, mv);
return Context.current().with(span.startSpan());
return parentContext.with(span.startSpan());
}
public void onRequest(Context context, Span span, HttpServletRequest request) {

View File

@ -21,12 +21,13 @@ public class SpringWsTracer extends BaseTracer {
}
public Context startSpan(Method method) {
Context parentContext = Context.current();
Span span =
spanBuilder(spanNameForMethod(method), SpanKind.INTERNAL)
spanBuilder(parentContext, spanNameForMethod(method), SpanKind.INTERNAL)
.setAttribute(SemanticAttributes.CODE_NAMESPACE, method.getDeclaringClass().getName())
.setAttribute(SemanticAttributes.CODE_FUNCTION, method.getName())
.startSpan();
return Context.current().with(span);
return parentContext.with(span);
}
@Override

View File

@ -5,6 +5,8 @@
package io.opentelemetry.javaagent.instrumentation.struts2;
import static io.opentelemetry.api.trace.SpanKind.INTERNAL;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionProxy;
import io.opentelemetry.api.trace.Span;
@ -31,7 +33,7 @@ public class Struts2Tracer extends BaseTracer {
String method = actionInvocation.getProxy().getMethod();
String spanName = spanNameForMethod(actionClass, method);
SpanBuilder strutsSpan = tracer.spanBuilder(spanName).setParent(parentContext);
SpanBuilder strutsSpan = spanBuilder(parentContext, spanName, INTERNAL);
strutsSpan.setAttribute(SemanticAttributes.CODE_NAMESPACE, actionClass.getName());
if (method != null) {

View File

@ -38,12 +38,8 @@ public class TwilioTracer extends BaseTracer {
}
public Context startSpan(Context parentContext, Object serviceExecutor, String methodName) {
Span span =
tracer
.spanBuilder(spanNameOnServiceExecution(serviceExecutor, methodName))
.setSpanKind(CLIENT)
.setParent(parentContext)
.startSpan();
String spanName = spanNameOnServiceExecution(serviceExecutor, methodName);
Span span = spanBuilder(parentContext, spanName, CLIENT).startSpan();
return withClientSpan(parentContext, span);
}