03.06 聊聊skywalking的spring-annotation-plugin

本文主要研究一下skywalking的spring-annotation-plugin


聊聊skywalking的spring-annotation-plugin


AbstractSpringBeanInstrumentation

skywalking-6.6.0/apm-sniffer/optional-plugins/optional-spring-plugins/spring-annotation-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/annotations/AbstractSpringBeanInstrumentation.java

<code>public abstract class AbstractSpringBeanInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
  private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.annotations.SpringAnnotationInterceptor";
  public static final String INTERCEPT_GET_SKYWALKING_DYNAMIC_FIELD_METHOD = "getSkyWalkingDynamicField";
  public static final String INTERCEPT_SET_SKYWALKING_DYNAMIC_FIELD_METHOD = "setSkyWalkingDynamicField";

  @Override public final ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
      return new ConstructorInterceptPoint[0];
  }

  @Override public final InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
      return new InstanceMethodsInterceptPoint[] {
          new DeclaredInstanceMethodsInterceptPoint() {
              @Override public ElementMatcher<methoddescription> getMethodsMatcher() {
                  return isPublic().and(not(isDeclaredBy(Object.class)).and(not(named(INTERCEPT_GET_SKYWALKING_DYNAMIC_FIELD_METHOD))).and(not(named(INTERCEPT_SET_SKYWALKING_DYNAMIC_FIELD_METHOD))));
              }

              @Override public String getMethodsInterceptor() {
                  return INTERCEPTOR_CLASS;
              }

              @Override public boolean isOverrideArgs() {
                  return false;
              }
          }
      };
  }
}/<methoddescription>/<code>
  • AbstractSpringBeanInstrumentation繼承了ClassInstanceMethodsEnhancePluginDefine,它使用org.apache.skywalking.apm.plugin.spring.annotations.SpringAnnotationInterceptor攔截非getSkyWalkingDynamicField及非setSkyWalkingDynamicField的public方法,至於攔截哪些類,其enhanceClass方法由子類實現

SpringBeanInstrumentation

skywalking-6.6.0/apm-sniffer/optional-plugins/optional-spring-plugins/spring-annotation-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/annotations/bean/SpringBeanInstrumentation.java

<code>public class SpringBeanInstrumentation extends AbstractSpringBeanInstrumentation {

  public static final String ENHANCE_ANNOTATION = "org.springframework.context.annotation.Bean";

  @Override protected ClassMatch enhanceClass() {
      return byClassAnnotationMatch(new String[] {ENHANCE_ANNOTATION});
  }
}/<code>
  • SpringBeanInstrumentation繼承了AbstractSpringBeanInstrumentation,其enhanceClass攔截的是org.springframework.context.annotation.Bean註解的類

SpringServicesInstrumentation

skywalking-6.6.0/apm-sniffer/optional-plugins/optional-spring-plugins/spring-annotation-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/annotations/services/SpringServicesInstrumentation.java

<code>public class SpringServicesInstrumentation extends AbstractSpringBeanInstrumentation {

  public static final String ENHANCE_ANNOTATION = "org.springframework.stereotype.Service";

  @Override protected ClassMatch enhanceClass() {
      return byClassAnnotationMatch(new String[] {ENHANCE_ANNOTATION});
  }
}/<code>
  • SpringServicesInstrumentation繼承了AbstractSpringBeanInstrumentation,其enhanceClass攔截的是org.springframework.stereotype.Service註解的類

SpringComponentInstrumentation

skywalking-6.6.0/apm-sniffer/optional-plugins/optional-spring-plugins/spring-annotation-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/annotations/component/SpringComponentInstrumentation.java

<code>public class SpringComponentInstrumentation extends AbstractSpringBeanInstrumentation {

  public static final String ENHANCE_ANNOTATION = "org.springframework.stereotype.Component";

  @Override protected ClassMatch enhanceClass() {
      return byClassAnnotationMatch(new String[] {ENHANCE_ANNOTATION});
  }
}/<code>
  • SpringComponentInstrumentation繼承了AbstractSpringBeanInstrumentation,其enhanceClass攔截的是org.springframework.stereotype.Component註解的類

SpringRepositoryInstrumentation

skywalking-6.6.0/apm-sniffer/optional-plugins/optional-spring-plugins/spring-annotation-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/annotations/repository/SpringRepositoryInstrumentation.java

<code>public class SpringRepositoryInstrumentation extends AbstractSpringBeanInstrumentation {

  public static final String ENHANCE_ANNOTATION = "org.springframework.stereotype.Repository";

  @Override protected ClassMatch enhanceClass() {
      return byClassAnnotationMatch(new String[] {ENHANCE_ANNOTATION});
  }
}/<code>
  • SpringRepositoryInstrumentation繼承了AbstractSpringBeanInstrumentation,其enhanceClass攔截的是org.springframework.stereotype.Repository註解的類

SpringAnnotationInterceptor

skywalking-6.6.0/apm-sniffer/optional-plugins/optional-spring-plugins/spring-annotation-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/annotations/SpringAnnotationInterceptor.java

<code>public class SpringAnnotationInterceptor implements InstanceMethodsAroundInterceptor {
  @Override
  public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class>[] argumentsTypes,
      MethodInterceptResult result) throws Throwable {
      String operationName = objInst.getClass().getName() + "." + method.getName();
      ContextManager.createLocalSpan(operationName);
  }

  @Override
  public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class>[] argumentsTypes,
      Object ret) throws Throwable {
      ContextManager.stopSpan();
      return ret;
  }

  @Override public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments,
      Class>[] argumentsTypes, Throwable t) {
      ContextManager.activeSpan().errorOccurred().log(t);
  }
}/<code>
  • SpringAnnotationInterceptor實現了InstanceMethodsAroundInterceptor接口,其beforeMethod方法主要是執行ContextManager.createLocalSpan(operationName);其afterMethod方法執行ContextManager.stopSpan();其handleMethodException執行ContextManager.activeSpan().errorOccurred().log(t)

小結

AbstractSpringBeanInstrumentation繼承了ClassInstanceMethodsEnhancePluginDefine,它使用org.apache.skywalking.apm.plugin.spring.annotations.SpringAnnotationInterceptor攔截非getSkyWalkingDynamicField及非setSkyWalkingDynamicField的public方法,至於攔截哪些類,其enhanceClass方法由子類實現

doc

  • AbstractSpringBeanInstrumentation
  • SpringAnnotationInterceptor


分享到:


相關文章: