聊聊skywalking的sharding-sphere-plugin

本文主要研究一下skywalking的sharding-sphere-plugin


聊聊skywalking的sharding-sphere-plugin


skywalking-plugin.def

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/sharding-sphere-4.x-plugin/src/main/resources/skywalking-plugin.def

<code>sharding-sphere-4.x=org.apache.skywalking.apm.plugin.shardingsphere.v4.define.ProxyRootInvokeInstrumentation
sharding-sphere-4.x=org.apache.skywalking.apm.plugin.shardingsphere.v4.define.JDBCRootInvokeInstrumentation
sharding-sphere-4.x=org.apache.skywalking.apm.plugin.shardingsphere.v4.define.ParseInstrumentation
sharding-sphere-4.x=org.apache.skywalking.apm.plugin.shardingsphere.v4.define.ExecuteInstrumentation/<code>
  • skywalking的sharding-sphere-plugin提供了ProxyRootInvokeInstrumentation、JDBCRootInvokeInstrumentation、ParseInstrumentation、ExecuteInstrumentation這幾個增強

ProxyRootInvokeInstrumentation

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/sharding-sphere-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/shardingsphere/v4/define/ProxyRootInvokeInstrumentation.java

<code>public class ProxyRootInvokeInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
   
  private static final String ENHANCE_CLASS = "org.apache.shardingsphere.shardingproxy.frontend.command.CommandExecutorTask";
   
  private static final String PROXY_ROOT_INVOKE_INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.shardingsphere.v4.ProxyRootInvokeInterceptor";
   
  @Override
  public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
      return new InstanceMethodsInterceptPoint[]{
          new InstanceMethodsInterceptPoint() {
              @Override
              public ElementMatcher<methoddescription> getMethodsMatcher() {
                  return named("run");
              }
               
              @Override
              public String getMethodsInterceptor() {
                  return PROXY_ROOT_INVOKE_INTERCEPTOR_CLASS;
              }
               
              @Override
              public boolean isOverrideArgs() {
                  return false;
              }
          }
      };
  }

   
  @Override
  public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
      return new ConstructorInterceptPoint[0];
  }
   
  @Override
  protected ClassMatch enhanceClass() {
      return NameMatch.byName(ENHANCE_CLASS);
  }
}/<methoddescription>/<code>
  • ProxyRootInvokeInstrumentation繼承了ClassInstanceMethodsEnhancePluginDefine,它使用org.apache.skywalking.apm.plugin.shardingsphere.v4.ProxyRootInvokeInterceptor增強org.apache.shardingsphere.shardingproxy.frontend.command.CommandExecutorTask的run方法

ProxyRootInvokeInterceptor

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/sharding-sphere-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/shardingsphere/v4/ProxyRootInvokeInterceptor.java

<code>public class ProxyRootInvokeInterceptor implements InstanceMethodsAroundInterceptor {
   
  @Override
  public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class>[] argumentsTypes, MethodInterceptResult result) {
      ContextManager.createLocalSpan("/ShardingSphere/ProxyRootInvoke/").setComponent(ComponentsDefine.SHARDING_SPHERE);
      ShardingExecuteDataMap.getDataMap().put(Constant.CONTEXT_SNAPSHOT, ContextManager.capture());
  }
   
  @Override
  public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class>[] argumentsTypes, Object ret) {
      ContextManager.stopSpan();
      return ret;
  }
   
  @Override
  public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class>[] argumentsTypes, Throwable t) {
      ContextManager.activeSpan().errorOccurred().log(t);
  }
}/<code>
  • ProxyRootInvokeInterceptor實現了InstanceMethodsAroundInterceptor接口,其beforeMethod方法執行ContextManager.createLocalSpan,並將ContextManager.capture()放入到ShardingExecuteDataMap.getDataMap()中;其afterMethod執行ContextManager.stopSpan();其handleMethodException方法執行ContextManager.activeSpan().errorOccurred().log(t)

JDBCRootInvokeInstrumentation

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/sharding-sphere-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/shardingsphere/v4/define/JDBCRootInvokeInstrumentation.java

<code>public class JDBCRootInvokeInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
   
  private static final String ENHANCE_CLASS = "org.apache.shardingsphere.shardingjdbc.executor.AbstractStatementExecutor";
   
  private static final String JDBC_ROOT_INVOKE_INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.shardingsphere.v4.JDBCRootInvokeInterceptor";
   
  @Override
  public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
      return new InstanceMethodsInterceptPoint[]{
          new InstanceMethodsInterceptPoint() {
              @Override
              public ElementMatcher<methoddescription> getMethodsMatcher() {
                  return named("executeCallback");
              }
               
              @Override
              public String getMethodsInterceptor() {
                  return JDBC_ROOT_INVOKE_INTERCEPTOR_CLASS;
              }
               
              @Override
              public boolean isOverrideArgs() {
                  return false;
              }
          }
      };
  }
   
  @Override
  public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
      return new ConstructorInterceptPoint[0];
  }
   
  @Override
  protected ClassMatch enhanceClass() {
      return NameMatch.byName(ENHANCE_CLASS);
  }
}/<methoddescription>/<code>
  • JDBCRootInvokeInstrumentation繼承了ClassInstanceMethodsEnhancePluginDefine,它使用org.apache.skywalking.apm.plugin.shardingsphere.v4.JDBCRootInvokeInterceptor增強了org.apache.shardingsphere.shardingjdbc.executor.AbstractStatementExecutor的executeCallback方法

JDBCRootInvokeInterceptor

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/sharding-sphere-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/shardingsphere/v4/JDBCRootInvokeInterceptor.java

<code>public class JDBCRootInvokeInterceptor implements InstanceMethodsAroundInterceptor {
   
  @Override
  public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class>[] argumentsTypes, MethodInterceptResult result) {
      ContextManager.createLocalSpan("/ShardingSphere/JDBCRootInvoke/").setComponent(ComponentsDefine.SHARDING_SPHERE);
      ShardingExecuteDataMap.getDataMap().put(Constant.CONTEXT_SNAPSHOT, ContextManager.capture());
  }
   
  @Override
  public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class>[] argumentsTypes, Object ret) {
      ContextManager.stopSpan();
      return ret;
  }
   
  @Override
  public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class>[] argumentsTypes, Throwable t) {
      ContextManager.activeSpan().errorOccurred().log(t);
  }
}/<code>
  • JDBCRootInvokeInterceptor實現了InstanceMethodsAroundInterceptor接口,其beforeMethod方法執行ContextManager.createLocalSpan,並將ContextManager.capture()放入到ShardingExecuteDataMap.getDataMap()中;其afterMethod執行ContextManager.stopSpan();其handleMethodException方法執行ContextManager.activeSpan().errorOccurred().log(t)

ParseInstrumentation

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/sharding-sphere-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/shardingsphere/v4/define/ParseInstrumentation.java

<code>public class ParseInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
   
  private static final String ENHANCE_CLASS = "org.apache.shardingsphere.core.route.router.sharding.ParsingSQLRouter";
   
  private static final String EXECUTE_INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.shardingsphere.v4.ParseInterceptor";
   
  @Override
  public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
      return new InstanceMethodsInterceptPoint[]{
          new InstanceMethodsInterceptPoint() {
              @Override
              public ElementMatcher<methoddescription> getMethodsMatcher() {
                  return named("parse");
              }
               
              @Override
              public String getMethodsInterceptor() {
                  return EXECUTE_INTERCEPTOR_CLASS;
              }
               

              @Override
              public boolean isOverrideArgs() {
                  return false;
              }
          }
      };
  }
   
  @Override
  public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
      return new ConstructorInterceptPoint[0];
  }
   
  @Override
  protected ClassMatch enhanceClass() {
      return NameMatch.byName(ENHANCE_CLASS);
  }
}/<methoddescription>/<code>
  • ParseInstrumentation繼承了ClassInstanceMethodsEnhancePluginDefine,它使用org.apache.skywalking.apm.plugin.shardingsphere.v4.ParseInterceptor增強了org.apache.shardingsphere.core.route.router.sharding.ParsingSQLRouter的parse方法

ParseInterceptor

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/sharding-sphere-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/shardingsphere/v4/ParseInterceptor.java

<code>public class ParseInterceptor implements InstanceMethodsAroundInterceptor {
   
  @Override
  public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class>[] argumentsTypes, MethodInterceptResult result) {
      AbstractSpan span = ContextManager.createLocalSpan("/ShardingSphere/parseSQL/").setComponent(ComponentsDefine.SHARDING_SPHERE);
      Tags.DB_STATEMENT.set(span, (String) allArguments[0]);
  }
   
  @Override
  public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class>[] argumentsTypes, Object ret) {
      ContextManager.stopSpan();
      return ret;
  }
   
  @Override
  public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class>[] argumentsTypes, Throwable t) {
      ContextManager.activeSpan().errorOccurred().log(t);
  }
}/<code>
  • ParseInterceptor實現了InstanceMethodsAroundInterceptor接口,其beforeMethod方法執行ContextManager.createLocalSpan並設置DB_STATEMENT;其afterMethod方法執行ContextManager.stopSpan();其handleMethodException方法執行ContextManager.activeSpan().errorOccurred().log(t)

ExecuteInstrumentation

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/sharding-sphere-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/shardingsphere/v4/define/ExecuteInstrumentation.java

<code>public class ExecuteInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
   
  private static final String ENHANCE_CLASS = "org.apache.shardingsphere.core.execute.sql.execute.SQLExecuteCallback";
   
  private static final String EXECUTE_INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.shardingsphere.v4.ExecuteInterceptor";
   
  @Override
  public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
      return new InstanceMethodsInterceptPoint[]{
          new InstanceMethodsInterceptPoint() {
              @Override
              public ElementMatcher<methoddescription> getMethodsMatcher() {
                  return named("execute0");
              }
               
              @Override
              public String getMethodsInterceptor() {
                  return EXECUTE_INTERCEPTOR_CLASS;
              }
               
              @Override
              public boolean isOverrideArgs() {
                  return false;
              }
          }
      };
  }
   
  @Override
  public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
      return new ConstructorInterceptPoint[0];
  }
   
  @Override
  protected ClassMatch enhanceClass() {
      return NameMatch.byName(ENHANCE_CLASS);
  }
}/<methoddescription>/<code>
  • ExecuteInstrumentation繼承了ClassInstanceMethodsEnhancePluginDefine,它使用org.apache.skywalking.apm.plugin.shardingsphere.v4.ExecuteInterceptor增強了org.apache.shardingsphere.core.execute.sql.execute.SQLExecuteCallback的execute0方法

ExecuteInterceptor

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/sharding-sphere-4.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/shardingsphere/v4/ExecuteInterceptor.java

<code>public class ExecuteInterceptor implements InstanceMethodsAroundInterceptor {
   
  @Override
  public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class>[] argumentsTypes, MethodInterceptResult result) {
      ContextManager.createLocalSpan("/ShardingSphere/executeSQL/").setComponent(ComponentsDefine.SHARDING_SPHERE);
      ContextSnapshot contextSnapshot = (ContextSnapshot) ShardingExecuteDataMap.getDataMap().get(Constant.CONTEXT_SNAPSHOT);
      if (null == contextSnapshot) {
          contextSnapshot = (ContextSnapshot) ((Map) allArguments[2]).get(Constant.CONTEXT_SNAPSHOT);
      }
      if (null != contextSnapshot) {
          ContextManager.continued(contextSnapshot);
      }
  }
   
  @Override
  public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class>[] argumentsTypes, Object ret) {
      ContextManager.stopSpan();
      return ret;
  }
   
  @Override
  public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class>[] argumentsTypes, Throwable t) {
      ContextManager.activeSpan().errorOccurred().log(t);
  }
}/<code>
  • ExecuteInterceptor實現了InstanceMethodsAroundInterceptor接口,其beforeMethod執行ContextManager.createLocalSpan並通過ShardingExecuteDataMap.getDataMap().get(Constant.CONTEXT_SNAPSHOT)獲取contextSnapshot,然後執行ContextManager.continued(contextSnapshot);其afterMethod方法執行ContextManager.stopSpan();其handleMethodException方法執行ContextManager.activeSpan().errorOccurred().log(t)

小結

skywalking的sharding-sphere-plugin提供了ProxyRootInvokeInstrumentation、JDBCRootInvokeInstrumentation、ParseInstrumentation、ExecuteInstrumentation這幾個增強

doc

  • ProxyRootInvokeInstrumentation
  • JDBCRootInvokeInstrumentation
  • ParseInstrumentation
  • ExecuteInstrumentation


分享到:


相關文章: