1.skywalking Դ?源码????
2.分布式链路追踪 SkyWalking 源码分析 —— DataCarrier 异步处理库
3.Skywalking8.9.1源码解析<一>-Skywalking简介及系统架构解析
4.软件测试/测试开发丨精准化测试原理简介与实践探索
5.Apache SkyWalking实战系列教程(三)- SkyWalking部署与配置
skywalking Դ?????
线上服务频繁遭遇 OutOfMemoryError(OOM)问题,对业务造成了严重影响,分析一天内服务重启多达五次,源码导致整个系统几乎瘫痪。分析通过Skywalking追踪,源码发现链路调用大部分呈现红色,分析如何举报溯源码亟待解决。源码作为排查者,分析我接手了这个任务。源码
首先,分析我分析了OOM的源码常见原因,主要包括堆内存和元空间不足。分析在我们的源码案例中,Mybatis的分析问题浮出水面。源码分析显示,源码Mybatis在拼接SQL时,通过集合存储SQL和参数,当SQL参数过多导致SQL过长时,集合会变得庞大,回收不及时就会引发内存溢出。
由于环境限制,无法直接通过jstack、jmap工具定位问题,这增加了排查的难度。但在网络搜索中,我找到了一篇与DruidDataSource和Mybatis相关的问题,这让我找到了问题的91源码分享线索,即多线程并发操作可能导致内存占用过高,从而触发OOM。
进一步的源码分析揭示,DynamicContext类中的ContextMap(继承自HashMap)在存储SQL参数和占位符时,存在无法被GC回收的问题。当并发查询量增加时,这可能导致内存溢出。我通过线上复现情景,验证了这一理论,发现服务频繁进行Full GC,最终引发了OOM。
针对问题,我提出解决方案:优化SQL拼接,避免过长的SQL体积,强调代码和SQL编写的重要性。同时,为了应对未来可能的故障,我配置了docker中的OOM保留dump文件,以备不时之需。
分布式链路追踪 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 的组件服务实现类,实现远程发送服务、客户端选择器和远程客户端服务。结婚邀请源码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,实现模块间的高效通信和功能扩展。
在通信方面,Skywalking探针和服务器主要通过Grpc进行数据交换,考虑到性能和数据丢失风险,有人提议用Kafka替代,但官方仅支持Grpc和SSL。Skywalking UI与后端的交互采用GraphQL,尽管restful更为常见,但GraphQL提供了更灵活的数据获取方式。
存储方面,Skywalking支持模块化存储选择,官方推荐内存数据库Es,但在线上环境中可能需要特定数据库支持。本地开发环境通常使用Mysql,生产环境将根据需求进行选择。数据库表结构会在后续文章中详细讨论。
数据流方面,Skywalking的数据经过OAL处理后入库,OAL层的具体作用官方未明示,但可能是为了进一步处理和优化数据。本文从整体架构深入到细节,助力需求文档和开发文档的完善。
软件测试/测试开发丨精准化测试原理简介与实践探索
小时候大家玩过找不同游戏,两幅图对比找出差异,现在想象一面墙代表master分支代码,另一面墙是dev分支代码,dev修改了哪些、差异在哪里、影响的范围,我们需要测试的范围。全面测试覆盖是理想状态,但在实际中,全面覆盖很困难。随着测试技术发展,自动化成为测试者必备技能,但自动化测试并不总能覆盖所有被测代码。黑盒测试依赖于测试人员的经验,容易出现漏测,一旦发布后出现问题,团队不得不进行修复。
要达到精准测试,我们引入三个概念:差异化分析、调用链分析和覆盖率统计。
差异化分析涉及到抽象语法树(AST),这是一种源代码的抽象结构表示形式。通过AST,我们能够对比代码差异,同时需要处理噪声信息,如注释、空格等,确保对比准确。JavaParser工具可以生成和操作AST,帮助我们更方便地进行代码对比。
调用链分析关注字节码,了解Java字节码包含了类和方法的所有信息,适合使用访问者模式进行修改。ASM(字节码操纵框架)是实现调用链分析的核心技术栈,它允许我们读取和插入字节码,通过匹配和桥接,构建方法调用链。在实际应用中,我们需去除与业务分析无关的方法,聚焦核心业务逻辑。
覆盖率统计使用jacoco工具,它依赖字节码技术。插桩技术在代码中插入监控探头,记录每行代码的执行情况,导出覆盖率信息。通过执行代码,探针记录信息,最终生成覆盖率报告。jacoco支持增量覆盖率统计,满足日常测试需求,通过关联接口与用例,推荐必要的测试用例,提高测试精准度。对于改动点,我们可以通过调用链路找到影响的最上层接口,推荐关联用例。跨应用调用链分析可能涉及Skywalking等工具,通过插桩监控获取应用间调用关系。
对于测试覆盖率,我们不能仅依赖于覆盖率百分比。覆盖率高只是保障的一个维度,代码逻辑的正确性仍需测试人员自行验证。方法覆盖率是否需要达到%取决于其逻辑复杂度。我们设定一个最低阈值,并基于业务需求和历史覆盖率数据调整测试策略。通过记录和监控覆盖率趋势,确保质量可控,及时发现潜在问题。
精准化测试强调在全面理解代码和业务的基础上,通过差异化分析、调用链分析和覆盖率统计等技术手段,实现高效、精准的测试覆盖。测试人员需要根据业务特性合理设定覆盖率目标,并持续优化测试策略,确保产品质量,提升团队效能。
Apache SkyWalking实战系列教程(三)- SkyWalking部署与配置
选择免费服务器平台,如华为云,安装CentOS系统,以便后续能够顺畅运行Docker和Apache SkyWalking相关组件。
利用宝塔面板,作为服务器管理界面,简化Linux管理流程。通过宝塔面板安装过程,确保系统配置正确,如开放端口。
安装Docker于宝塔面板中,便于后续部署Apache SkyWalking所需应用。
为部署Apache SkyWalking,首先确保使用特定版本的镜像,如elasticsearch:7.5.1和apache/skywalking-oap-server:6.6.0-es7,避免兼容性问题。下载agent源码包,准备后续的安装流程。
借助docker环境,安装并配置Elasticsearch,进行持久化存储设置,确保数据安全稳定。在服务器上启动Elasticsearch并验证其正常运行。
通过Docker安装Apache SkyWalking OAP,并指定Elasticsearch用于数据存储,完成部署。
接着安装SkyWalking UI,并设置端口为,避免与系统其他服务冲突。确保在华为云中开放相应端口。
应用接入部署中,Java应用接入以SpringBootDemo为例,通过Maven构建并打包应用,使用skywalkingagent实现监控功能,指定agent服务名和服务地址,启动应用时自动集成SkyWalking监控。
对于非Java应用接入,暂未详细说明,后续将补充相关流程。
访问SkyWalking UI,展示应用监控数据,包括拓扑图、API调用详情等,实现全链路监控功能。
总结,通过Docker环境部署Apache SkyWalking,实现应用监控与优化,简化服务器管理,并提供直观的可视化界面,便于监控应用性能与问题定位。