57. 命名 spans

选择 span name 并不是一项简单的任务。 span name 应该描述一个操作 name。 name 应该是低基数,因此它不应包含标识符。

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

  • 当控制器收到方法 name 为controllerMethodName时收到controller-method-name

  • async用于使用包装的CallableRunnable接口完成的异步操作。

  • @Scheduled return 注释 class 的简单 name 的方法。

幸运的是,对于异步处理,您可以提供显式命名。

57.1 @SpanName Annotation

您可以使用@SpanName annotation 明确 name span,如下面的 example 所示:

@SpanName("calculateTax")
class TaxCountingRunnable implements Runnable {

	@Override public void run() {
		// perform logic
	}
}

在这种情况下,当按以下方式处理时,span 名为calculateTax

Runnable runnable = new TraceRunnable(tracing, spanNamer,
		new TaxCountingRunnable());
Future<?> future = executorService.submit(runnable);
// ... some additional logic ...
future.get();

57.2 toString()方法

RunnableCallable创建单独的 classes 非常罕见。通常,一个人创建那些 classes 的匿名实例。你不能注释这样的 classes。要克服该限制,如果不存在@SpanName annotation,我们检查 class 是否具有toString()方法的自定义 implementation。

Running 这样的 code 导致 creating 一个名为calculateTax的 span,如下面的 example 所示:

Runnable runnable = new TraceRunnable(tracing, 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();