52. 命名 spans

选择 span name 并不是一项简单的任务。 Span name 应该描述一个操作 name。 name 应该是低基数(e.g. 不包括标识符)。

由于有很多仪器正在进行,一些 span 名称将是人为的:

  • 控制器使用方法 name conrollerMethodName收到controller-method-name

  • async用于通过包装CallableRunnable完成的异步操作。

  • @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()方法

RunnableCallable创建单独的 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。