1.分布式链路追踪 SkyWalking 源码分析 —— DataCarrier 异步处理库
2.Skywalking8.9.1源码解析<一>-Skywalking简介及系统架构解析
3.Skywalking源码探针启动
4.从分析 SkyAPM-dotnet 源码学习现代 APM 探针设计理念(一)
5.线上环境OOM频发,源码MyBatis有坑...
6.软件测试/测试开发丨精准化测试原理简介与实践探索
分布式链路追踪 SkyWalking 源码分析 —— DataCarrier 异步处理库
本文基于 SkyWalking 3.2.6 正式版,解析主要分享 SkyWalking Collector Remote 远程通信服务,源码用于 Collector 集群内部通信。解析Remote Module 应用于 SkyWalking 架构中,源码实现跨节点的解析微擎 论坛模块源码流式处理。
本文从接口到实现顺序解析 SkyWalking Collector Remote 的源码项目结构和组件,包括 RemoteModule、解析RemoteSenderService、源码RemoteClientService、解析RemoteClient、源码CommonRemoteDataRegisterService、解析RemoteDataRegisterService、源码RemoteDataIDGetter、解析RemoteDataInstanceCreatorGetter、源码RemoteSerializeService、RemoteDeserializeService。RemoteModule 实现 Module 抽象类,定义服务如 RemoteSenderService、RemoteDataRegisterService,创建 RemoteClient 实现远程通信。CommonRemoteDataRegisterService 用于注册数据类型对应的远程数据创建器和获取数据协议编号。
接着,本文深入探讨基于 Google gRPC 的远程通信实现,包括 RemoteModuleGRPCProvider、GRPCRemoteSenderService、GRPCRemoteClientService、GRPCRemoteClient、RemoteCommonServiceHandler、GRPCRemoteSerializeService、GRPCRemoteDeserializeService。RemoteModuleGRPCProvider 提供基于 gRPC 的组件服务实现类,实现远程发送服务、redis 架构源码分析客户端选择器和远程客户端服务。GRPCRemoteClient 实现基于 gRPC 的远程客户端,支持异步发送消息。
最后,本文提及 SkyWalking Collector Remote 也支持基于 Kafka 的远程通信实现,但目前暂未完成。为了进一步学习 SkyWalking 的分布式链路追踪和远程通信机制,读者可以关注公众号芋道源码,获取 Java 源码解析、原理讲解、面试题、学习指南,回复「书籍」领取 Java 从入门到架构的 本书籍,加入技术群讨论 Java、后端、架构相关技术。
Skywalking8.9.1源码解析<一>-Skywalking简介及系统架构解析
Skywalking 8.9.1源码解析系列旨在深入探讨该版本的Skywalking-OAP及其探针Skywalking-java8.9.0。本文基于官方文档、博客和个人理解,对Skywalking进行简介和系统架构解析。
Skywalking是一款强大的分布式追踪系统,提供详尽的UI界面,可通过OpenTrace官方文档了解其Trace概念。核心功能包括性能监控和分布式追踪,以帮助开发者理解和优化应用程序的性能。
Skywalking的代码模块构建在微内核架构上,这种架构允许通过插件形式扩展核心功能,如IDEA和Eclipse的插件模式。SkyWalking Agent和OAP都采用微内核架构,利用ModuleManager管理组件和ModuleProvider,实现模块间的高效通信和功能扩展。
在通信方面,java源码怎么加载Skywalking探针和服务器主要通过Grpc进行数据交换,考虑到性能和数据丢失风险,有人提议用Kafka替代,但官方仅支持Grpc和SSL。Skywalking UI与后端的交互采用GraphQL,尽管restful更为常见,但GraphQL提供了更灵活的数据获取方式。
存储方面,Skywalking支持模块化存储选择,官方推荐内存数据库Es,但在线上环境中可能需要特定数据库支持。本地开发环境通常使用Mysql,生产环境将根据需求进行选择。数据库表结构会在后续文章中详细讨论。
数据流方面,Skywalking的数据经过OAL处理后入库,OAL层的具体作用官方未明示,但可能是为了进一步处理和优化数据。本文从整体架构深入到细节,助力需求文档和开发文档的完善。
Skywalking源码探针启动
深入SkyWalking
SkyWalking探针是集成到目标系统中的代理或SDK库,负责收集遥测数据,包括链路追踪和性能指标。探针的实现方式基于目标系统的技术栈,尽管方式各异,但核心功能一致:收集并格式化数据,然后发送到后端。
Skywalking Java Agent采用Java premain作为其技术方案。该方案在启动时挂载,相比以agentmain挂载的方式更为灵活,但受限于不能修改父类、接口和字段等。图片 采集 网站 源码Skywalking Agent整体结构采用微内核设计,核心代码为apm-agent-core,负责启动、加载配置、加载插件、修改字节码、记录调用数据并发送至后端。apm-sdk-plugin模块则是特定中间件的插件,遵循Skywalking插件规范,Maven模块化集成即可。
Skywalking的启动流程基于java-agent,核心启动方法为premain。主要步骤包括初始化配置、加载所有配置、加载插件、查找并转化插件定义为增强类、创建ByteBuddy实例、进行字节码增强、创建边缘类集合、处理跨模块类访问问题、保存修改后的字节码以及启动服务并注册关闭钩子。
总体而言,SkyWalking探针的启动流程通过预定义的代码结构和机制,实现了高效的远程监控和性能分析,为开发人员提供了强大的工具来优化和管理复杂应用系统。
从分析 SkyAPM-dotnet 源码学习现代 APM 探针设计理念(一)
在后端软件行业的快速变迁中,从SOA到微服务、从业务一体化到中台战略、从虚拟化到云原生,技术更新速度日新月异。这种变革背后的核心动力在于硬件发展的瓶颈,促使行业转向追求软件的最新的mobanbox源码规模化效益。现代后端软件工程师面临的挑战之一是如何对服务性能有全面的理解,而APM(Application Performance Monitoring)工具成为了解决这一问题的关键。
APM的基本构成包括指标性统计、分布式追踪和日志记录。指标性统计,如服务的吞吐量、成功率、流量等,是对单个指标或数据库的分析。分布式追踪则关注一次请求的全过程,从客户端发起到服务完成,甚至涉及业务流程,如商品订购流程,追踪请求的流转轨迹。日志记录则是程序运行过程中产生的信息收集,提供实时的事件记录。
随着技术的发展,性能监控工具的使用变得越来越普遍。早期,开发人员可能需要自己构建监控系统,但这既耗时又费力。SkyWalking等APM系统应运而生,旨在简化性能监控的实现,减少重复工作。
在SkyWalking中,dotnet探针的设计遵循核心规范。dotnet探针主要基于DiagnosticSource实现,这提供了一种消息的生产者消费者模型,使得事件可以在任意地方被接收。微软官方库中,如HttpContext、HttpClient、SqlClient等,都预留了性能打点,以捕获关键事件。第三方库如gRPC、CAP、SmartSql也提供了同样的功能。
开发人员可以通过适配SkyWalking,为自己的库添加性能打点,即向DiagnosticSource发送事件信息。这涉及到创建自定义采集器,监听特定事件,并将数据发送到数据中心。
探针的核心代码在于监听消息,其关键在于DiagnosticListener,它实现了消息的监听与数据的上报。监听的事件由特定的Processor负责处理,这些Processor实现了ITracingDiagnosticProcessor接口,具体负责数据的收集与转换。
两个有代表性的Processor示例展示了如何实现这一过程。一个针对AspNetCore请求管线,监听并收集请求相关的事件;另一个是针对System.Net下的通用httpclient,同样监听特定事件,以构建完整的请求上下文,并生成标准的tracing信息。
通过安装SkyWalking并加入探针,后端服务的性能数据将被收集并上传至OAP平台进行分析,最终提供直观的APM信息。这一过程不仅简化了性能监控的实施,还极大地提高了数据分析的效率与准确性。建议读者亲自尝试安装SkyWalking,体验探针在实际服务中的应用。
线上环境OOM频发,MyBatis有坑...
线上服务频繁遭遇 OutOfMemoryError(OOM)问题,对业务造成了严重影响,一天内服务重启多达五次,导致整个系统几乎瘫痪。通过Skywalking追踪,发现链路调用大部分呈现红色,亟待解决。作为排查者,我接手了这个任务。
首先,我分析了OOM的常见原因,主要包括堆内存和元空间不足。在我们的案例中,Mybatis的问题浮出水面。源码分析显示,Mybatis在拼接SQL时,通过集合存储SQL和参数,当SQL参数过多导致SQL过长时,集合会变得庞大,回收不及时就会引发内存溢出。
由于环境限制,无法直接通过jstack、jmap工具定位问题,这增加了排查的难度。但在网络搜索中,我找到了一篇与DruidDataSource和Mybatis相关的问题,这让我找到了问题的线索,即多线程并发操作可能导致内存占用过高,从而触发OOM。
进一步的源码分析揭示,DynamicContext类中的ContextMap(继承自HashMap)在存储SQL参数和占位符时,存在无法被GC回收的问题。当并发查询量增加时,这可能导致内存溢出。我通过线上复现情景,验证了这一理论,发现服务频繁进行Full GC,最终引发了OOM。
针对问题,我提出解决方案:优化SQL拼接,避免过长的SQL体积,强调代码和SQL编写的重要性。同时,为了应对未来可能的故障,我配置了docker中的OOM保留dump文件,以备不时之需。
软件测试/测试开发丨精准化测试原理简介与实践探索
小时候大家玩过找不同游戏,两幅图对比找出差异,现在想象一面墙代表master分支代码,另一面墙是dev分支代码,dev修改了哪些、差异在哪里、影响的范围,我们需要测试的范围。全面测试覆盖是理想状态,但在实际中,全面覆盖很困难。随着测试技术发展,自动化成为测试者必备技能,但自动化测试并不总能覆盖所有被测代码。黑盒测试依赖于测试人员的经验,容易出现漏测,一旦发布后出现问题,团队不得不进行修复。
要达到精准测试,我们引入三个概念:差异化分析、调用链分析和覆盖率统计。
差异化分析涉及到抽象语法树(AST),这是一种源代码的抽象结构表示形式。通过AST,我们能够对比代码差异,同时需要处理噪声信息,如注释、空格等,确保对比准确。JavaParser工具可以生成和操作AST,帮助我们更方便地进行代码对比。
调用链分析关注字节码,了解Java字节码包含了类和方法的所有信息,适合使用访问者模式进行修改。ASM(字节码操纵框架)是实现调用链分析的核心技术栈,它允许我们读取和插入字节码,通过匹配和桥接,构建方法调用链。在实际应用中,我们需去除与业务分析无关的方法,聚焦核心业务逻辑。
覆盖率统计使用jacoco工具,它依赖字节码技术。插桩技术在代码中插入监控探头,记录每行代码的执行情况,导出覆盖率信息。通过执行代码,探针记录信息,最终生成覆盖率报告。jacoco支持增量覆盖率统计,满足日常测试需求,通过关联接口与用例,推荐必要的测试用例,提高测试精准度。对于改动点,我们可以通过调用链路找到影响的最上层接口,推荐关联用例。跨应用调用链分析可能涉及Skywalking等工具,通过插桩监控获取应用间调用关系。
对于测试覆盖率,我们不能仅依赖于覆盖率百分比。覆盖率高只是保障的一个维度,代码逻辑的正确性仍需测试人员自行验证。方法覆盖率是否需要达到%取决于其逻辑复杂度。我们设定一个最低阈值,并基于业务需求和历史覆盖率数据调整测试策略。通过记录和监控覆盖率趋势,确保质量可控,及时发现潜在问题。
精准化测试强调在全面理解代码和业务的基础上,通过差异化分析、调用链分析和覆盖率统计等技术手段,实现高效、精准的测试覆盖。测试人员需要根据业务特性合理设定覆盖率目标,并持续优化测试策略,确保产品质量,提升团队效能。