skywalking扩展实现 —— 监控数据的动态上报
创始人
2024-06-01 18:08:35
0

把标题名整高大上一些,来掩盖需求的奇葩。

0. 目录

      • 1. 需求背景
      • 2. 需求描述
      • 3. 优势
      • 4. 实现
        • 4.1 扩展点
        • 4.2 配置项
      • 5. 优化
      • 6. 提醒
      • 7. 补充 - 关于微服务
      • 8. 参考

1. 需求背景

过去一段时间,接手了一个迭代了数年的"基于微服务架构"搭建的产品。

自介入开始,我就不断尝试给系统增加可观测性,包括但不限于:

  1. 为原有的日志框架输出增加traceId,以实现最基础的"人肉链路追踪"功能。
  2. 基于SpringBoot的Actuator特性来对外提供符合我们内部规范的日志级别切换接口。
  3. 基于linux命令awk, sed等实现的日志精确查询功能。
  4. 为以上功能提供前端操作页面,最大化避免需要登录服务器进行问题排查这一耗时耗神的上世纪操作习惯。

以上方案在逐步推进过程中,我们发现落地效果不及预期,究其原因:

  1. 在宣传和推广上投入的时间和精力不足。
  2. 相关人员的旧有习惯作祟。(不过这也说明上面方式带来的好处,在当事人看到还没有达到让其主动脱离舒适区的程度)

基于以上现状,我们决定再进一步,重新捡起过往曾经动过,但受限于"思路过于新奇"而主动选择回避的念头:“扩展skywalking,实现对于系统进行链路追踪功能的动态开启和关闭”。

之所以存在这么听上去很"神奇"的念头,当然是有着其现实原因:

  1. 该产品的大部分业务场景,其体量远远未达到需要上微服务架构的情况。
  2. 但现有的系统架构已经是微服务的模式。
  3. 于是矛盾就出现了:业务体量不是必须得微服务,那么用户势必不愿意在日常运维上投入太多的成本;但微服务架构经过多年的争论,终于用残酷的现实教育了所有将它当作马良神笔的从业者——别以为复杂度消失了。微服务只是将复杂度转移到基础设施上。CI/CD你没有,遭罪的是你自己,打碎牙你能自己咽;但链路追踪你要是没有,客户报告问题一般都是火急火燎赶deadline的时候,你猜他会不会和颜悦色跟你这演练"和人交流要讲礼貌"。

所以,如何在这个现状面前,找到那个平衡? 而不是直接把锅砸了,起一口新的。

截止写下此文的当下,我们交出的答卷如标题所示:通过skywalking提供的扩展,来增加我们自己的自定义逻辑,主动控制Agent端向Server端推送监控数据的方式,最小化监控这一块的运维成本,进而增加监控在团队里的落地范围和深度,尽可能地让其能够被绝大部分人作为日常工作中的一部分。

2. 需求描述

让我们用专门的小节描述下需求细节,也算是目标达成之后的操作流程。

  1. 默认情况下,Server端不启动,Agent端正常开启。不过Agent端基于我们的扩展配置,默认会直接丢弃所收集来的监控数据,不进行上报(毕竟你上报也没地方接收)。
  2. 发现问题时,开启Server端和开启agent端自定义配置,进入正常的链路追踪排错流程。
  3. 解决问题之后,关闭Server和Agent端自定义配置。(这一步为了确保执行,可在第二步的准备阶段,启动一个一次性定时任务)。

注意:
Server端启动时采用的存储是默认的h2数据库,这是为了减少在Server维护上的成本。也是因为使用h2数据库,注定了Server端不能常驻,或者说不能接收大量Agent端上报的数据,这就回到了本文出现的缘由。

3. 优势

我们过往在【CAT魔改】独立化cat-client的优势里所陈述的一系列诸如"站在巨人的肩膀上,更大的灵活性"等优势同样适合于这里。

除此之外,本次我们之所以接受这个魔改,根本目的是为了让团队尽早开始积累使用Skywalking的经验。一个产品想要长远发展,其所依赖的基础设施最好是稳固,经过千锤百炼的。毕竟你没有那么多的资源来将你的依赖项全部从零开发一遍;尽早确定一个稳定的基础依赖,不断对其精研,好过从零开始自己摸,也好过"看见这个觉得不错,看见那个好像更好"的狗熊掰棒子式地尝鲜式技术选型。

4. 实现

得益于Skywalking其所提供的强大扩展性,本次扩展功能实现过程异常地顺利。在没有系统阅读完Skywalking主体流程逻辑的前提下,只是通过借鉴Skywalking自身内置针对各个第三方组件的插件实现,编写个自定义Agent插件,就完成了本次需求。

不得不说Skywalking的扩展性确实好太多了。在以上实现自定义Agent插件过程中,笔者脑海里不时会回想起那句本以遗忘的经典教导 —— “对扩展开放,对修改关闭”。相较于笔者在过往迫不得已最终还是构建了分支版本的【CAT魔改】CAT-LOCAL项目的诞生,Skywalking真正做到了完全没有修改既有代码,真正采用扩展的方式实现。果然社区强大才是一切。

4.1 扩展点

以下直接列出需要被扩展的类型,具体的实现细节可以参见底部给出的gitee仓库。

扩展点说明
TraceSegmentServiceClientSkywalking在其中进行收集来的监控链路数据上报。
GRPCChannelManagerSkywalking在其中进行Server端的grpc验活。默认间隔30秒。
LogReportServiceClientSkywalking在其中进行收集来的监控日志数据上报。
JVMServiceSkywalking在其中实现定期地JVM状态数据上报。
EventReportServiceClientSkywalking在其中实现Java应用的启停等事件的上报。

4.2 配置项

针对上面的扩展,我们还需要一些skywalking提供的配置项进行支持。

# 确保我们开启Server和Agent端之后, Agent端可以将监控数据正确推送到Server端
-Dskywalking.collector.backend_service={SW_IP}:11800 \
# 同上。不过推送的是日志数据。
-Dskywalking.plugin.toolkit.log.grpc.reporter.server_host={SW_IP} \
# 本次扩展的目的是最大化减轻Server端的存储压力, 所以我们需要排除诸如健康状态检查等接口.
-Dskywalking.trace.ignore_path=**/acutator/**,**/swCustomPlugin/** \
# 兼容过往无服务端时的日志链路查询. 同时该配置项对于本次扩展也提供支持, 毕竟对于本文的需求场景而言, Server端大部分时候也是不存在的.
-Dskywalking.agent.keep_tracing=true

5. 优化

  1. 只限制特定的链路进行上报。这一步在底部的gitee项目里也给出了相应的示例类:TraceCaptureSpecialSamplingService
  2. 提供组件的可观测性。 这一步可以参见本人的另外一个项目Gitee - dynamic-debug-runtime,其中的DynamicEnableRuntimeInstrumentation是主要逻辑实现位置。(注意该项目不是必须,你完全可以将其中的实现迁移到Gitee - dynamic-enable-runtime项目中)

6. 提醒

  1. 本文这种方式下,对于Skywalking的使用就只限于可观测性三支柱的Tracing和Logging,就别奢望剩下的那条支柱的Metrics也生效了。
  2. 本文需求出现的前提条件是业务特点决定的。毕竟"所有的技术上的决策实际都是政治上的决策",我们必须面对这个现实。
  3. 我们对"系统有监控"的理解:是平时自己人排错的时候,会不会用到这些?毕竟按照产品设计的基本理念之"吃自己的狗粮",如果你自己都不用自己构建的监控体系,那这个叫做"系统有监控"吗
  4. 现实的矛盾就是"最小化运维和基础设施成本,与系统微服务架构之间的矛盾"。不要说什么这个玩意搭建起来花不了多少时间。运维这个职业存在多年,区分出不同的等级,要求还越来越高,是因为把这些玩意搭建起来很难吗?

7. 补充 - 关于微服务

过往我尝试总结了微服务的一些怪现象,也收集了不少相关的讨论(具体参见下面的链接)。

这里我想再表明一下个人看法,也算是对过往总结的一个补充:

“除非系统体量达到必须微服务,否则业务方绝对不会愿意在基础设施和运维上投入成本,只希望越少越好。即使是他将微服务的要求写在了招标文件里。你有一千条,一万条理由痛诉对方多么不专业,多么坑爹;但回到现实你依然还得解决这个问题;当然相较之下有个选择更简单:**客户,**公司,劳*不伺候了。”

8. 参考

  1. skywalking官网
  2. 吴晟 - 《SkyWalking的发展之路;从无名小卒到拥抱全球》
  3. 专访吴晟:开源没有黑魔法,两年后泡沫将会破灭
  4. 【CAT魔改】CAT-LOCAL项目的诞生
  5. 微服务了个寂寞
  6. 如何做好既有产品技术架构的升级改造
  7. Gitee - dynamic-enable-runtime

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...