把标题名整高大上一些,来掩盖需求的奇葩。
过去一段时间,接手了一个迭代了数年的"基于微服务架构"搭建的产品。
自介入开始,我就不断尝试给系统增加可观测性,包括但不限于:
以上方案在逐步推进过程中,我们发现落地效果不及预期,究其原因:
基于以上现状,我们决定再进一步,重新捡起过往曾经动过,但受限于"思路过于新奇"而主动选择回避的念头:“扩展skywalking,实现对于系统进行链路追踪功能的动态开启和关闭”。
之所以存在这么听上去很"神奇"的念头,当然是有着其现实原因:
所以,如何在这个现状面前,找到那个平衡? 而不是直接把锅砸了,起一口新的。
截止写下此文的当下,我们交出的答卷如标题所示:通过skywalking提供的扩展,来增加我们自己的自定义逻辑,主动控制Agent端向Server端推送监控数据的方式,最小化监控这一块的运维成本,进而增加监控在团队里的落地范围和深度,尽可能地让其能够被绝大部分人作为日常工作中的一部分。
让我们用专门的小节描述下需求细节,也算是目标达成之后的操作流程。
注意:
Server端启动时采用的存储是默认的h2数据库,这是为了减少在Server维护上的成本。也是因为使用h2数据库,注定了Server端不能常驻,或者说不能接收大量Agent端上报的数据,这就回到了本文出现的缘由。
我们过往在【CAT魔改】独立化cat-client的优势里所陈述的一系列诸如"站在巨人的肩膀上,更大的灵活性"等优势同样适合于这里。
除此之外,本次我们之所以接受这个魔改,根本目的是为了让团队尽早开始积累使用Skywalking的经验。一个产品想要长远发展,其所依赖的基础设施最好是稳固,经过千锤百炼的。毕竟你没有那么多的资源来将你的依赖项全部从零开发一遍;尽早确定一个稳定的基础依赖,不断对其精研,好过从零开始自己摸,也好过"看见这个觉得不错,看见那个好像更好"的狗熊掰棒子式地尝鲜式技术选型。
得益于Skywalking其所提供的强大扩展性,本次扩展功能实现过程异常地顺利。在没有系统阅读完Skywalking主体流程逻辑的前提下,只是通过借鉴Skywalking自身内置针对各个第三方组件的插件实现,编写个自定义Agent插件,就完成了本次需求。
不得不说Skywalking的扩展性确实好太多了。在以上实现自定义Agent插件过程中,笔者脑海里不时会回想起那句本以遗忘的经典教导 —— “对扩展开放,对修改关闭”。相较于笔者在过往迫不得已最终还是构建了分支版本的【CAT魔改】CAT-LOCAL项目的诞生,Skywalking真正做到了完全没有修改既有代码,真正采用扩展的方式实现。果然社区强大才是一切。
以下直接列出需要被扩展的类型,具体的实现细节可以参见底部给出的gitee仓库。
扩展点 | 说明 |
---|---|
TraceSegmentServiceClient | Skywalking在其中进行收集来的监控链路数据上报。 |
GRPCChannelManager | Skywalking在其中进行Server端的grpc验活。默认间隔30秒。 |
LogReportServiceClient | Skywalking在其中进行收集来的监控日志数据上报。 |
JVMService | Skywalking在其中实现定期地JVM状态数据上报。 |
EventReportServiceClient | Skywalking在其中实现Java应用的启停等事件的上报。 |
针对上面的扩展,我们还需要一些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
TraceCaptureSpecialSamplingService
。DynamicEnableRuntimeInstrumentation
是主要逻辑实现位置。(注意该项目不是必须,你完全可以将其中的实现迁移到Gitee - dynamic-enable-runtime项目中)过往我尝试总结了微服务的一些怪现象,也收集了不少相关的讨论(具体参见下面的链接)。
这里我想再表明一下个人看法,也算是对过往总结的一个补充:
“除非系统体量达到必须微服务,否则业务方绝对不会愿意在基础设施和运维上投入成本,只希望越少越好。即使是他将微服务的要求写在了招标文件里。你有一千条,一万条理由痛诉对方多么不专业,多么坑爹;但回到现实你依然还得解决这个问题;当然相较之下有个选择更简单:**客户,**公司,劳*不伺候了。”
下一篇:Golang错误处理