OpenTelemetry笔记(5)-Instrumentation

概念

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

Extractor

Instrumentation 接口中存在着非常多的 Extractor,其对对象的某一些属性进行抽取,可以理解为内容过滤器,如下定义

  • SpanKeyExtractor
  • SpanKindExtractor
  • SpanLinksExtractor
  • SpanNameExtractor
  • SpanStatusExtractor
  • AttributesExtractor
  • TimeExtractor

AttributesExtractor

  • MethodSpanAttributesExtractor
  • MethodExtractor
  • ParameterAttributeNamesExtractor
  • MethodArgumentsExtractor