52. Naming spans
Picking a span name is not a trivial task. Span name should depict an operation name. The name should be low cardinality (e.g. not include identifiers).
Since there is a lot of instrumentation going on some of the span names will be artificial like:
-
controller-method-name
when received by a Controller with a method nameconrollerMethodName
-
async
for asynchronous operations done via wrappedCallable
andRunnable
. -
@Scheduled
annotated methods will return the simple name of the class.
Fortunately, for the asynchronous processing you can provide explicit naming.
52.1 @SpanName annotation
You can name the span explicitly via the @SpanName
annotation.
@SpanName("calculateTax")
class TaxCountingRunnable implements Runnable {
@Override public void run() {
// perform logic
}
}
In this case, when processed in the following manner:
Runnable runnable = new TraceRunnable(tracer, spanNamer, new TaxCountingRunnable());
Future<?> future = executorService.submit(runnable);
// ... some additional logic ...
future.get();
The span will be named calculateTax
.
52.2 toString() method
It’s pretty rare to create separate classes for Runnable
or Callable
. Typically one creates an anonymous instance of those classes. You can’t annotate such classes thus to override that, if there is no @SpanName
annotation present, we’re checking if the class has a custom implementation of the toString()
method.
So executing such code:
Runnable runnable = new TraceRunnable(tracer, spanNamer, new Runnable() {
@Override public void run() {
// perform logic
}
@Override public String toString() {
return "calculateTax";
}
});
Future<?> future = executorService.submit(runnable);
// ... some additional logic ...
future.get();
will lead in creating a span named calculateTax
.