1. Sharding-Opentracing简介

Sharding-Opentracing是Sharding-Sphere为大家提供的基于Opentracing规范的APM工具包。它采用发布 - 订阅式的组件通信机制实现了对核心链路方法的跟踪记录,包括sql解析路由方法、sql执行方法和结果归并方法。

Opentracing(https://github.com/opentracing)规范的产生,目的是为了解决不同的分布式追踪系统API不兼容的问题。它是一个轻量级的标准化层,位于应用程序/类库和追踪或日志分析程序之间。

Sharding-Sphere使用Opentracing进行方法的追踪,使得系统开发人员可以方便的添加或替换追踪系统的实现。使用ShardingJDBCTracer类可以方便的完成Tracer的注入。

public final class ShardingJDBCTracer {/*** 通过读取系统属性进行注册* -Dshardingjdbc.opentracing.tracer.class=******/public static void init() {...}/*** 通过方法参数进行注册*/public static void init(final Tracer tracer) {...}}

然后通过事件监听器订阅核心方法事件,完成方法拦截实现方法追踪。目前实现的事件监听器如下:

  • SqlRoutingEventListener

    Sql路由事件追踪

  • ExecuteEventListener

    Sql执行事件追踪

  • MergeEventListener

    Sql执行结果合并事件追踪

2. 基于Opentracing规范的性能追踪——SkyWalking实践

SkyWalking(https://github.com/apache/incubator-skywalking)是由国人大神吴晟创建的一款开源的针对分布式系统的APM系统,它提供了Opentracing标准的支持。下面我们通过SkyWalking来看看如何在你的应用中使用Sharding-Opentracing工具包。

在应用系统中引入相关依赖包

<dependency><groupId>io.shardingsphere</groupId><artifactId>sharding-opentracing</artifactId><version>3.0.0.M2-SNAPSHOT</version>
</dependency>
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-opentracing</artifactId><version>5.0.0-beta</version>
</dependency>

SkyWalking的apm-toolkit-opentracing包中的SkyWalkingTracer实现了Tracer接口,在应用系统启动时完成Tracer的注入。

ShardingJDBCTracer.init(new SkywalkingTracer());

通过简单的两步就完成了SkyWalking的接入。通过SkyWalking的Trace视图可以查看业务请求的调用链信息,包括Sharding-JDBC在sql路由,sql执行和结果归并的执行信息。其中sql执行是采用多条sql并行执行的策略,这里也可以看到每个线程的执行情况。

通过SkyWalking的Span Info视图可以看到每个追踪Span的相关参数信息。包括路由库信息、sql解析语句与执行入参等。

3. 基于字节码增强的性能追踪——Pinpoint实践

上面我们了解了如何使用实现了Opentracing规范的APM框架进行Sharding-JDBC的性能监控,那么对于没有实现Opentracing规范,采用字节码增强技术的APM框架,我们又该如何入手了?针对这种采用字节码增强技术的APM框架,我们的策略是编写对应的插件,实现对Sharding-Sphere核心方法的增强。接下来我们看看如何在Pinpoint框架中实现一个针对Sharding-Sphere组件的插件。

实现Interceptor接口,完成组件方法拦截器。在组件方法执行前开启追踪,在组件方法执行后结束追踪,这里展示结果归并方法追踪的实现。

public class ResultSetMergeInterceptor implements AroundInterceptor1 {private final TraceContext traceContext;private final MethodDescriptor descriptor;private final PLogger logger = PLoggerFactory.getLogger(getClass());public ResultSetMergeInterceptor(TraceContext traceContext, MethodDescriptor descriptor) {this.traceContext = traceContext;this.descriptor = descriptor;}@Overridepublic void before(Object target, Object arg0) {if (logger.isDebugEnabled()) {logger.beforeInterceptor(target, new Object[]{arg0});}final Trace trace = traceContext.currentTraceObject();if (trace == null) {return;}trace.traceBlockBegin();}@Overridepublic void after(Object target, Object arg0, Object result, Throwable throwable) {if (logger.isDebugEnabled()) {logger.afterInterceptor(target, new Object[]{arg0}, result, throwable);}final Trace trace = traceContext.currentTraceObject();if (trace == null) {return;}try {SpanEventRecorder recorder = trace.currentSpanEventRecorder();recorder.recordServiceType(ShardingSphereConstants.SHARDING_SPHERE_MERGE);recorder.recordApi(descriptor);recorder.recordException(throwable);} finally {trace.traceBlockEnd();}}
}

实现ProfilerPlugin和TransformTemplateAware接口,完成插件标识和转换模版注册。其中需要通过TransformTemplate的transform方法来完成追踪方法和方法拦截器的绑定关系。例如ShardingPreparedStatement类的merge方法与上面实现的ResultSetMergeInterceptor进行绑定。

public class ShardingSpherePlugin implements ProfilerPlugin, TransformTemplateAware {private final PLogger logger = PLoggerFactory.getLogger(this.getClass());private static final String SHARDINGSPHERE_SCOPE = "SHARDINGSPHERE_SCOPE";private TransformTemplate transformTemplate;@Overridepublic void setup(ProfilerPluginSetupContext context) {ShardingSphereConfig config = new ShardingSphereConfig(context.getConfig());logger.debug("[ShardingSphere] pluginEnable={}", config.isPluginEnable());if (config.isPluginEnable()) {addSqlRouteTransformer();addSqlExecutorTransformer();addResultMergeTransformer();}}@Overridepublic void setTransformTemplate(TransformTemplate transformTemplate) {this.transformTemplate = transformTemplate;}private void addResultMergeTransformer() {TransformCallback transformCallback = new TransformCallback() {@Overridepublic byte[] doInTransform(Instrumentor instrumentor, ClassLoader classLoader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException {InstrumentClass target = instrumentor.getInstrumentClass(classLoader, className, classfileBuffer);InstrumentMethod method = target.getDeclaredMethod("merge", "io.shardingsphere.core.merger.MergeEngine");method.addScopedInterceptor("com.navercorp.pinpoint.plugin.shardingsphere.interceptor.ResultSetMergeInterceptor", SHARDINGSPHERE_SCOPE);return target.toBytecode();}};transformTemplate.transform("io.shardingsphere.core.jdbc.core.statement.ShardingPreparedStatement", transformCallback);transformTemplate.transform("io.shardingsphere.core.jdbc.core.statement.ShardingStatement", transformCallback);}}

完整插件代码请参考:

https://github.com/beckhampu/pinpoint/tree/sharding-sphere-1.7.2/plugins

通过Pinpoint的CallTree效果图,我们可以清楚的看到一次业务过程中Sharding-JDBC核心方法的调用效果。

至此,关于Sharding-Sphere与APM的相关实践就介绍到这里。希望自己的一得之见可以让大家有所收获。如果大家有什么想法、意见和建议,欢迎留言与我交流。在这里也呼吁大家一起贡献自己的力量,让Sharding-Sphere发展的更好。

Sharding-Sphere 的应用性能监控实践相关推荐

  1. Sharding-Sphere的应用性能监控实践

    Sharding-Sphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它为分布式数据存储提供了多种形式的解决方案.其中的Sharding-JDBC产品在甜橙金融的技术架构中得到了广泛应用, ...

  2. 【全观测系列】Elasticsearch应用性能监控实践

    简介:本文介绍了应用性能监控的应用价值以及解决方案等. 1.什么是全观测? 要了解全观测,我们先看看传统运维存在哪些问题. 数据孤岛,分散在不同部门,分析排查故障困难: 多个厂商的多种工具,无法自动化 ...

  3. android 监控app 读写,Android端 APP性能监控实践

    如今大部分的APP测试工作关注点主要集中在功能的逻辑与交互上,由于各种原因(比如测试时间不够,测试手段有限等等),对APP客户端的性能数据往往比较忽视,然而经过移动互联网爆发式发展后,许多App功能差 ...

  4. 360移动端性能监控实践QDAS-APM(iOS篇)

    一.背景 360是一家注重用户体验的公司,公司的口号是用户至上.在这么一个注重用户体验的氛围里,app的性能问题无疑是被重点关注的,同样也是造成用户流失的罪魁祸首之一.性能问题主要包含:崩溃.网络请求 ...

  5. 云原生分布式应用性能监控实践-天眼全流程调用链

    一.概述 天眼是中国联通IT生产运营支撑平台,对生产运营领域提供端到端.云化架构全层级的运维工具支撑,融合人工智能与大数据技术,实现传统运维向自动化生产.智慧化运营的转变,保障4亿级用户规模系统稳定运 ...

  6. 深入字节版atop: 线上系统的性能监控实践

    背景 atop 是一款开源的单机性能监测工具,支持实时观测的同时.也支持读取历史文件排查问题.另外一个优点是除提供 CPU.MEM.DISK 等全局指标外,还提供进程.线程级别的各项指标监控数据.鉴于 ...

  7. ArchSummit深圳APM专场总结:性能监控与调优实践干货分享

    随着应用性能管理(APM)越来越被开发和运维人员所熟知,7月17日在深圳召开的ArchSummit 2015全球架构师峰会特开设应用性能管理专场,来自听云.腾讯和OPPO的讲师分享了他们在性能监控.管 ...

  8. 同程艺龙小程序性能监控系统的探索与实践

    导语 |近日,云+社区开发者大会(苏州站)圆满落幕.本次开发者邀请了腾讯内部及业内行业大咖就物联网.小程序.微服务等当前互联网领域的热点技术的落地实践问题进行了深度探讨.本文是同程艺龙资深架构师牛提罚 ...

  9. 【技术分享】Go 工程化-前端性能监控接入层 Layout 设计实践

    作者:黎志航&张翔,腾讯监控高级工程师 前言 本文主要介绍 腾讯云前端性能监控(RUM)在全新接入层上的 Go 工程化实践,介绍 Go 项目布局(下文称 Project Layout)的设计理 ...

最新文章

  1. SpringBoot (三) :SpringBoot使用Freemarker模板引擎渲染web视图
  2. 15个超实用的php正则表达式
  3. java 阻塞 socket_java socket非阻塞I/O
  4. python类与对象 封装继承与多态 0308
  5. sklearn保存svm分类模型_机器学习100天-Day1601线性支持向量机分类
  6. [题解]Shorten IPv6 Address-模拟(2019牛客多校第六场B题)
  7. Opera Android将支持HTML5和Flash功能
  8. SQL Server 2005 express下载地址
  9. 自然语言处理NLP知识结构
  10. Java中兴通讯最新笔试题_java实现中兴通讯笔试程序题,排列组合所有可能的密码...
  11. html在线客服,网页在线客服代码_jQuery QQ客服
  12. vue+mintUI-------mintUI中indicator报错
  13. 开关电源初级和次级变压器之间的Y电容作用
  14. 计算机考试照片是一寸,怎么用电脑拍照片_怎么用电脑将照片修成一寸大小
  15. rtx3080ti和3090差距 rtx3080ti和3090哪个性价比高
  16. web前端开发需要学习什么?需要哪些开发工具?
  17. 【最短路算法例题-升降梯上】-C++
  18. 不允许声明无类型的***
  19. Python3爬取OpenStreetMap平台的城市道路交通网数据
  20. 一个技术总监的内心独白(3)

热门文章

  1. deep learning for the earth sciences 读书笔记
  2. 杂谈:中华英才裁员事件
  3. 数据库的“读写分离”
  4. Python_求解长方体体积和表面积
  5. SpaceX完成世界首次海上回收火箭(图)
  6. 听说你立志要做数据分析,不如先听听老司机的建议?
  7. 电脑突然死机怎么办?正确做法在这!
  8. java xca,keytool 错误: java.lang.Exception: 所输入的不是 X.509 证书
  9. 计算机图画大赛作品六年级,小学六年级优秀绘画作品图片精选
  10. java基础语言+面向对象_经典案例——65个