0
点赞
收藏
分享

微信扫一扫

ShardingSphere与链路追踪

ShardingSphere与链路追踪

本篇文章源码基于4.0.1版本

ShardingSphere的功能非常强大,它不仅与注册中心、配置中心相结合的很好,它还支持链路追踪,了解过链路追踪技术的肯定对TraceId、Span这些概念有所了解,TraceId可以看做一个全局的id,用来定位一条请求的来和去,途经的服务有哪些,而span可以看做是这个链路中调用这个服务的开始和结束的这个阶段。

sharding-opentracing模块是ShardingSphere与链路追踪整合的部分,模块中给出了一些测试示例,在使用的时候首先调用ShardingTracer的init()方法进行初始化操作

我们不妨看一下这一部分,

初始化跟踪器

ShardingTracer的init()方法:

    public static void init() {
        String tracerClassName = System.getProperty(OPENTRACING_TRACER_CLASS_NAME);
        Preconditions.checkNotNull(tracerClassName, "Can not find opentracing tracer implementation class via system property `%s`", OPENTRACING_TRACER_CLASS_NAME);
        try {
            init((Tracer) Class.forName(tracerClassName).newInstance());
        } catch (final ReflectiveOperationException ex) {
            throw new ShardingException("Initialize opentracing tracer class failure.", ex);
        }
    }
  1. 从系统的环境变量中获取跟踪器的类名,常量的值是org.apache.shardingsphere.opentracing.tracer.class,如果设置Skywalking的话就设置这个key的值为org.apache.skywalking.apm.toolkit.opentracing.SkywalkingTracer,也就是类的全限定名
  2. 检测类名是否为空
  3. 调用init()方法,这里传入的参数是根据类名通过反射创建的实例,这个init()方法就是调用GlobalTracer的register()方法注册跟踪器。GlobalTracer类的成员变量就是Tracer,注册的实质就是设置Tracer的值,GlobalTracer这个类使用了单例模式

Span的操作

sharding-opentracing模块中一个hook的包,这个包中有三个类OpenTracingParsingHook、OpenTracingRootInvokeHook和OpenTracingSQLExecutionHook

解析Hook

OpenTracingParsingHook用于生成sql解析过程中链路数据span,接口是ParsingHook,start()方法中构建span,设置tag标签,finishSuccess()方法是成功了结束span方法,finishFailure()方法是解析失败设置错误信息给span,span完成的方法

使用示例:

private final ParsingHook parsingHook = new SPIParsingHook();
    
    @BeforeClass
    public static void registerSPI() {
        NewInstanceServiceLoader.register(ParsingHook.class);
    }
    
    @Test
    public void assertExecuteSuccess() {
        parsingHook.start("SELECT * FROM XXX;");
        parsingHook.finishSuccess(mock(SQLStatement.class));
        MockSpan actual = getActualSpan();
        assertThat(actual.operationName(), is("/ShardingSphere/parseSQL/"));
    }

路由Hook

OpenTracingRootInvokeHook用于生成sql路由过程中链路数据span

使用示例:

    private final RootInvokeHook rootInvokeHook = new SPIRootInvokeHook();
    
    @BeforeClass
    public static void registerSPI() {
        NewInstanceServiceLoader.register(RootInvokeHook.class);
    }
    @Test
    public void assertRootInvoke() {
        rootInvokeHook.start();
        assertTrue(ShardingExecuteDataMap.getDataMap().containsKey(OpenTracingRootInvokeHook.ACTIVE_SPAN_CONTINUATION));
        rootInvokeHook.finish(1);
    }

Sql执行Hook

OpenTracingSQLExecutionHook用于生成SQL执行过程中的数据链路span

    private final SQLExecutionHook sqlExecutionHook = new SPISQLExecutionHook();
    
    @BeforeClass
    public static void registerSPI() {
        NewInstanceServiceLoader.register(SQLExecutionHook.class);
    }
    @Test
    public void assertExecuteSuccessForTrunkThread() {
        DataSourceMetaData dataSourceMetaData = mock(DataSourceMetaData.class);
        sqlExecutionHook.start("success_ds", "SELECT * FROM success_tbl;", Arrays.<Object>asList("1", 2), dataSourceMetaData, true, null);
        sqlExecutionHook.finishSuccess();
    }

这里所有的Hook实例的加载都是用来JDK的SPI机制,三个Hook方法都有响应的开始span和结束span的方法实现,使用的时候也大致相同

总结

这篇文章我们将了ShardingSphere与链路追踪技术的相结合,主要是怎么进行初始化配置的Tracer跟踪器和在SQL解析路由和执行过程中的span的操作、链路跟踪。

❤️ 感谢大家

如果你觉得这篇内容对你挺有有帮助的话:

  1. 欢迎关注我❤️,点赞👍🏻,评论🤤,转发🙏
  2. 关注盼盼小课堂,定期为你推送好文,还有群聊不定期抽奖活动,可以畅所欲言,与大神们一起交流,一起学习。
  3. 有不当之处欢迎批评指正。
举报

相关推荐

0 条评论