首页 > 其他分享 >ShardingSphere与链路追踪

ShardingSphere与链路追踪

时间:2022-10-20 16:33:55浏览次数:60  
标签:span ShardingSphere void public init 链路 class 追踪

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. 欢迎关注我❤️,点赞

    标签:span,ShardingSphere,void,public,init,链路,class,追踪
    From: https://blog.51cto.com/u_15460453/5780270

相关文章

  • 全链路压测资料汇总——业内大厂解决方案
    技术链接滴滴全链路压测解决之道阿里巴巴的全链路压测阿里怎么做双11全链路压测?美团全链路压测自动化实践全链路压测平台在美团中的实践饿了么全链路压测的探索与实......
  • 全链路压测第一次实践
    转自:https://www.cnblogs.com/imyalost/p/11811142.html每年双十一,对买家来说是一场买买买的剁手之旅,但对于电商公司的技术人员来说,却是一次严峻的技术期末考。如何保证系......
  • 基于LDPC编译码的长距离SC-OFDM通信链路matlab仿真
    目录一、理论基础二、MATLAB仿真程序三、仿真结果一、理论基础VPI光通信系统模拟软件支持灵活的多速率传输系统,通过这个软件,用户可以从基本的光子元素向上层建立模型,......
  • ShardingSphere的路由引擎类型
    ShardingSphere的路由引擎类型本篇文章源码基于4.0.1版本上篇文章我们了解到了ShardingSphere在路由流程过程中,根据不同类型的SQL会现在不同的路由引擎,而ShardingSphere......
  • ShardingSphere的分片策略
    ShardingSphere的分片策略本篇文章源码基于4.0.1版本上篇文章我们说到ShardingSphere通过路由引擎根据路由规则获取数据节点,然后生成路由结果,具体路由策略在ShardingStr......
  • 你“被”全链路了么
    要说当下研发领域最热门的几个词,全链路压试肯定跑不了。最近的几次大会上,也有不少关于全链路的议题。之前有朋友在面试过程中也有被问到了什么是全链路压测,如何有效的开展......
  • 原来ShardingSphere也用雪花算法
    原来ShardingSphere也用雪花算法分布式主键的生成有很多实现方式,比如百度开源的UidGenerator、美团的Leaf、以及众所周知的雪花算法,而在分库分表的场景下,id要保证唯一性,分......
  • SPI机制在ShardingSphere中的应用
    SPI机制在ShardingSphere中的应用之前我们讲过一篇SPI机制在Skywalking中的应用,这篇我们说一说ShardingSphere又是如何使用SPI机制的Sql解析器Sql解析器的功能就是用来解......
  • .NET6接入Skywalking链路追踪
    .NET6接入Skywalking链路追踪完整流程 一、Skywalking介绍Skywalking是一款分布式链路追踪组件,什么是链路追踪?随着微服务架构的流行,服务按照不同的维度进行拆分,一次......
  • ShardingSphere的强制路由
    ShardingSphere的强制路由随着项目的越来越庞大,用户量越来越多,分库分表的操作在工作中是不可避免的,而市场上分库分表的解决方案有很多,ShardingSphere就是经常使用到的一种......