52. 命名 spans
选择 span name 并不是一项简单的任务。 Span name 应该描述一个操作 name。 name 应该是低基数(e.g. 不包括标识符)。
由于有很多仪器正在进行,一些 span 名称将是人为的:
-
控制器使用方法 name
conrollerMethodName
收到controller-method-name
-
async
用于通过包装Callable
和Runnable
完成的异步操作。 -
@Scheduled
带注释的方法将 return class 的简单 name。
幸运的是,对于异步处理,您可以提供显式命名。
52.1 @SpanName annotation
您可以通过@SpanName
annotation 明确 name span。
@SpanName("calculateTax")
class TaxCountingRunnable implements Runnable {
@Override public void run() {
// perform logic
}
}
在这种情况下,按以下方式处理时:
Runnable runnable = new TraceRunnable(tracer, spanNamer, new TaxCountingRunnable());
Future<?> future = executorService.submit(runnable);
// ... some additional logic ...
future.get();
span 将命名为calculateTax
。
52.2 toString()方法
为Runnable
或Callable
创建单独的 classes 非常罕见。通常,一个人创建那些 classes 的匿名实例。你不能注释这样的 classes 来覆盖它,如果没有@SpanName
annotation 存在,我们正在检查 class 是否有toString()
方法的自定义 implementation。
所以执行这样的 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();
将导致 creating 名为calculateTax
的 span。