命名spans

优质
小牛编辑
131浏览
2023-12-01

选择一个跨度名称不是一件小事。Span名称应该描述一个操作名称。名称应该是低基数(例如不包括标识符)。

由于有很多仪器仪表在一些跨度名称将是人为的:

  • controller-method-name当控制器以方法名conrollerMethodName接收时
  • async通过包装CallableRunnable完成异步操作。
  • @Scheduled注释方法将返回类的简单名称。

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

@SpanName注释

您可以通过@SpanName注释显式指定该跨度。

@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();

该范围将被命名为calculateTax

toString()方法

RunnableCallable创建单独的课程很少见。通常,创建这些类的匿名实例。如果没有@SpanName注释,我们将检查该类是否具有toString()方法的自定义实现。

所以执行这样的代码:

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();

将导致创建一个名为calculateTax的跨度。