管理spans注释

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

合理

这个功能的主要论据是

  • api-agnostic意味着与跨度进行合作

    • 使用注释允许用户添加到跨度api没有库依赖的跨度。这允许Sleuth将其核心api的影响改变为对用户代码的影响较小。
  • 减少基础跨度作业的表面积。

    • 没有这个功能,必须使用span api,它具有不正确使用的生命周期命令。通过仅显示范围,标签和日志功能,用户可以协作,而不会意外中断跨度生命周期。
  • 与运行时生成的代码协作

    • 使用诸如Spring Data / Feign的库,在运行时生成接口的实现,从而跨越对象的包装是乏味的。现在,您可以通过这些接口的接口和参数提供注释

创建新的spans

如果您真的不想手动创建本地spans,您可以从@NewSpan注释中获利。此外,我们还提供@SpanTag注释,以自动方式添加标签。

我们来看一些使用的例子。

@NewSpan
void testMethod();

注释没有任何参数的方法将导致创建名称将等于注释方法名称的新跨度。

@NewSpan("customNameOnTestMethod4")
void testMethod4();

如果您在注释中提供值(直接或通过name参数),则创建的范围将具有提供的值的名称。

// method declaration
@NewSpan(name = "customNameOnTestMethod5")
void testMethod5(@SpanTag("testTag") String param);
// and method execution
this.testBean.testMethod5("test");

您可以组合名称和标签。我们来关注后者。在这种情况下,无论注释方法的参数运行时值的值如何 - 这将是标记的值。在我们的示例中,标签密钥将为testTag,标签值为test

@NewSpan(name = "customNameOnTestMethod3")
@Override
public void testMethod3() {
}

您可以将@NewSpan注释放在类和接口上。如果覆盖接口的方法并提供不同的@NewSpan注释值,则最具体的一个获胜(在这种情况下customNameOnTestMethod3将被设置)。

继续spans

如果您只想添加标签和注释到现有的跨度,就可以使用如下所示的@ContinueSpan注释。请注意,与@NewSpan注释相反,您还可以通过log参数添加日志:

// method declaration
@ContinueSpan(log = "testMethod11")
void testMethod11(@SpanTag("testTag11") String param);
// method execution
this.testBean.testMethod11("test");

这样,跨越将继续下去:

  • 将创建名称为testMethod11.beforetestMethod11.after的日志
  • 如果抛出异常,也将创建一个日志testMethod11.afterFailure
  • 将创建密钥testTag11和值test的标签

更高级的标签设置

有三种不同的方法可以将标签添加到跨度。所有这些都由SpanTag注释控制。优先级是:

  • 尝试使用TagValueResolver类型的bean,并提供名称
  • 如果没有提供bean名称,请尝试评估一个表达式。我们正在搜索一个TagValueExpressionResolver bean。默认实现使用SPEL表达式解析。
  • 如果没有提供任何表达式来评估只返回参数的toString()

自定义提取器

以下方法的标签值将由TagValueResolver接口的实现来计算。其类名必须作为resolver属性的值传递。

有这样一个注释的方法:

@NewSpan
public void getAnnotationForTagValueResolver(@SpanTag(key = "test", resolver = TagValueResolver.class) String test) {
}

和这样一个TagValueResolver bean实现

@Bean(name = "myCustomTagValueResolver")
public TagValueResolver tagValueResolver() {
	return parameter -> "Value from myCustomTagValueResolver";
}

将导致标签值的设置等于Value from myCustomTagValueResolver

解决表达式的价值

有这样一个注释的方法:

@NewSpan
public void getAnnotationForTagValueExpression(@SpanTag(key = "test", expression = "length() + ' characters'") String test) {
}

并且没有自定义的TagValueExpressionResolver实现将导致对SPEL表达式的评估,并且将在span上设置值为4 characters的标签。如果要使用其他表达式解析机制,您可以创建自己的bean实现。

使用toString方法

有这样一个注释的方法:

@NewSpan
public void getAnnotationForArgumentToString(@SpanTag("test") Long param) {
}

如果使用值为15执行,则将导致设置String值为"15"的标记。