概念
Instrumentation 表示对一种特定组件交互的跟踪封装,比如 MQ,HTTP,方法调用等
接口定义
1 2 3 4 5 6
| public class Instrumenter<REQUEST, RESPONSE> {
boolean shouldStart(Context parentContext, REQUEST request); Context start(Context parentContext, REQUEST request); void end( Context context, REQUEST request, @Nullable RESPONSE response, @Nullable Throwable error);
|
其定义了 start 和 end 方法来代替手动创建 Span 的过程
- request 表示输入端的参数
- response 表示输出结果,error 表示输出结果是否有异常
构造 Instrumenter
Instrumenter 的要素比较多,其构建时使用 InstrumenterBuilder 进行构造
1 2 3 4 5 6
| public class Instrumenter<REQUEST, RESPONSE> { public static <REQUEST, RESPONSE> InstrumenterBuilder<REQUEST, RESPONSE> builder( OpenTelemetry openTelemetry, String instrumentationName, SpanNameExtractor<? super REQUEST> spanNameExtractor); }
|
调用示例
1 2 3 4 5 6 7 8
| Instrumenter instrumenter = Instrumenter.builder(openTelemetry, INSTRUMENTATION_NAME, WithSpanAspect::spanName) .addAttributesExtractor( MethodSpanAttributesExtractor.newInstance( JoinPointRequest::method, parameterAttributeNamesExtractor, JoinPointRequest::args)) .newInstrumenter(WithSpanAspect::spanKind);
|
Instrumentation 接口中存在着非常多的 Extractor,其对对象的某一些属性进行抽取,可以理解为内容过滤器,如下定义
- SpanKeyExtractor
- SpanKindExtractor
- SpanLinksExtractor
- SpanNameExtractor
- SpanStatusExtractor
- AttributesExtractor
- TimeExtractor