管理spans注释
合理
这个功能的主要论据是
- 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.before
和testMethod11.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"
的标记。