这一讲我将带你横向回顾下模块一各个章节的关键知识点,并简单铺垫下之后的章节。

在前面的章节,我带你学习了 7 个 APM 开源产品的学习方案和落地实践。由于章节有限,很可能课程所讲述的 APM 产品没有命中你们的选型。但没有关系,APM 协议与存储模型,以及关键模块的设计都大同小异,我会在接下来的章节中继续与你分享。

今天这一课时,我会围绕以下四个问题展开,告诉你“熟悉 APM 产品的能力是每个开发人员的分内之事”这一道理。

需要部署全部 APM 产品吗?

部署前对 APM 如何选型?

APM 是如何体现工匠精神的?

如何高效学习 APM?

服务集群需要部署全部 APM 产品吗?

在学习任何一门新技术前,我们都会想要通过简短的“白话”,来了解这门技术是什么。所以在深度钻研 APM 前,让我们先回答“APM 到底是什么”这个问题。

你可以结合日常所接触的 APM 产品,以及前面章节对热门 APM 的学习进行几分钟思考,心中先有份自己的答案。

那我给出的答案是:APM 是应用性能管理(Application Performance Management)的缩写。从宏观角度上看,面向解决产品(对用户)体验不好的行为,都可以称为 APM,因此 APM 涉及的范畴非常广泛。大到前 7 个课时所讲述的 APM 各个领域的优秀开源产品,小到一线开发人员通过规范应用日志来提升定位问题的效率,这些都是在进行 APM 的建设。

APM 生态如此庞杂,为了让 APM 产品的功能建设更有目的性,也让问题定位时挑选 APM 产品更有针对性,所以 APM 细分了很多的领域。由于细分领域太多,下面我针对前面章节提及的APM 产品,来讲述这些产品都涉及哪些 APM 领域:

APM 产品

涉及的 APM 领域

Apache SkyWalking

指标监控

集群拓扑

链路追踪

性能剖析

日志监控

集中报警

点评 CAT

指标监控

链路追踪(不推荐使用)

BI 监控(不推荐使用)

集中报警

Alibaba Arthas

性能剖析

在线故障排查

JVM 监控

Alibaba Sentinel

集群可用性

流量可塑性

Java VisualVM

性能剖析

在线故障排查

JVM 监控

Kibana

应用日志可视化

Grafana

监控数据可视化

集中报警

可以看到,这些 APM 产品间涉及的领域都是有交集的,由于每个领域的生态都很大,所以每个 APM 产品对每个领域的实现是截然不同的,有足够的差异化。但具体到领域某个点的实现原理上却是大同小异,所以懂得原理可以让我们对 APM 的相应领域一通百通;并且熟悉差异化的产品实现可以让我们在定位问题时,能够挑选到合适的工具去剖析问题。

以性能剖析领域中的线程剖析为例,我们体会下上面这段话。

Apache SkyWalking

通过链路追踪页面获取慢链路的 Endpoint;

再通过性能剖析页面上的输入框,描述你要剖析的 Endpoint;

最后 SkyWalking 会通过抽样展示这个 Endpoint 关联的线程堆栈信息。

Endpoint(端点),SkyWalking 通过端点这个术语来定位要剖析的线程,你可以简单认为是请求,在“15 | 数据磐石:APM 收集端的存储模型”中我会再详细讲述。

Alibaba Arthas

通过日志上的数据面板(dashboard)命令或线程(thread)命令,获取想要 Dump 的线程 ID;

再通过线程命令,追加线程 ID 参数获取线程的堆栈信息;

最后通过各种在线故障排查命令,从而去诊断问题。

Java VisualVM

通过应用服务使用日志框架中打印的线程名称,或 VisualVM 可视化客户端的线程选项卡展示的应用名称,从而获取线程实时工作状态;

再通过线程名称,使用 Threads intspector 插件获取线程的堆栈信息;

最后使用各种插件进行问题诊断。

综上,产品呈现上的差异造就了不尽相同的使用场景,但原理上都是通过一定的手段(滑动窗口、线程名称、线程 ID)去找到线程,对线程进行 Dump,最终得到堆栈信息。通过对底层原理的组合封装,就可以构造出十八般兵器。

那我们的服务集群需要部署全部的 APM 产品吗?答案是否定的。

过多 APM 产品在运维上,会给 SRE 带来大量的维护工作量;在提效上,一线开发人员在日常需求开发之余,需要抽出更多时间去学习各种 APM 产品;从全局角度看,多数人基本会学一个忘一个,更别提学以致用了。

所以这时候更需要去精简 APM,在部署前注重选型,在落地后注重本地化建设。 本地化建设我会在之后的章节详细与你讨论,这里我主要讲述下部署前的选型。

部署前对 APM 如何选型?

选型我也建议使用竞品分析法,但竞品分析需要建立在了解自身的需求和一定程度的掌握 APM产品的基础上。

了解自身需求,你可以根据调查问卷收集和故障积累,来分析出内部诉求那些 APM 领域的产品;

之后通过本专栏的学习以及网上博客的竞品分析,你就可以开展选型方案了。

以下有一些我总结的实践,方便你避坑。

1.不正确的选型思路

囫囵吞枣式选型 ×忽略自己的需求和忽略 APM 产品涉及的领域进行竞品分析,网上的博客也不胜枚举。比如将点评 CAT 与 Apache SkyWalking 进行对比就不合适。两个产品虽然涉及领域存在部分交集,但在部署方式、关键技术栈、核心领域的实现上却大相径庭。随便选出一个差异点就开始进行选型对比,这是一种错误行为,这种情况并不适合做竞品分析。

所以反过来,使用 Apache SkyWalking 和 Pinpoint 进行竞品分析就很有代表性,从 Agent 的接入方式、轻量级内核、插件化生态的对比,到链路跟踪模型、仪表盘指标都有相似的地方。这种情况就比较适合开展竞品分析,并最终确定适合自身的选型。

性能主导式选型 ×选型追求极致的性能,这种选型思路也是不可取的。就国内现状,所有的应用服务几乎都是运行在中水位线以下;随着现阶段的服务上云化,应用服务的部署会获得更多弹性。所以现阶段 APM 选型应更注重产品能力而非性能指标。

而且目前活跃的 APM 产品几乎都有 Apache、Alibaba 等顶级社区的背书,其质量我也不需要过多赘述。所以我们选型时的关注点要适合当下,并着眼未来的进行。

完全自建型 ×每个产品都不是完美无缺的,正因为这样我们才可以动手参与社区共建。也正是这样,才会有更多人和我一样,从中得到成长成为 Apache 和 Alibaba Committer,这个成长路径也是本专栏我要和你分享的内容之一。说回来,我也看过很多自建型的 APM,即使有专业性的团队,也绕不开首次落地实践过长、被质疑闭门造车这两个问题。

2.比较好的选型思路

量化历史包袱 √

比如好多月都没有上线老项目、老架构了,这些老项目表象上看依然在为企业带来收益。但由于长期不迭代,就会出现维护人员薄弱的情况。这时便没人能评估应用服务接入 APM 后会不会出现问题,以及接入 APM 带来的收益。

这些具备历史包袱的项目是影响 APM 选型的重要指标之一,因为应用集群接入 APM 覆盖度越高、数据完整度就越高,报警定位就会更准确。

为了解决这些老项目的接入难题,我通过量化老项目各个指标的手段,来确定选型 APM 的正确性。

如果你负责的集群也存在同样的历史包袱问题,你可以参考我的实践。

通过发布平台或脚本,计算出应用最后的发布时间。时间越久远,接入 APM 的收益就越小。你可以抽取采样几个时间节点来绘制出历史项目的分布。

通过编译,分析出是否支持编译发布和依赖框架的明细。对不支持编译发布的老服务选型,我推荐 Agent 类型的 APM 产品;依赖框架的明细,方便我们确定是否还要做二次框架适配。

分析社区文化 √

各个产品的社区地位对其产品的选型应用广度,发挥着越来越重要的作用。在 2018 年时,虽然 SkyWalking 的影响力和产品用户案例相较于 Pinpoint 有些差距。

但由于 SkyWalking 发源于国内,并非常注重国内社区活跃度的建设,无论是社区群、开发者大会、路演等都远超 Pinpoint。所以当时贝壳找房选型 SkyWalking,其社区文化起到了很重要的作用。

APM:工程师的工匠精神

通过对 APM 产品的学习,以及本地化的选型实践,相信你对 APM 的理解又加深了。这时让我们再思考一个问题:APM 重要吗?重要程度有多少?

我认为 APM 非常重要,参与工程建设的每个人都被期望有工匠精神。在开发过程中,每次迭代优化的 APM 指标都是追求卓越的体现;在出现问题时,能使用 APM 产品剥丝抽茧地解决线上问题也都是专业能力的体现。

随着职级和责任的变大,我们更需要学会利用 APM 避免线上故障带来的损失,从而孵化出更加优化的服务。

如何高效学习 APM?

既然 APM 对于一线开发人员如此重要,那我们如何高效学习 APM 呢?一条很好的建议是:无论何时,都不要“无目的”地学习源码。

这种错误的学习认知,其背后逻辑是认为指读了(或是调试了)源码的每一行就能成为专家,而实则不是。

可能你对 APM 产品的源码接触较少,不清楚 APM 的复杂度,那我举个深有体会的例子。作为后端开发工程师,SSM 框架中的 Spring 框架你再熟悉不过了。虽然熟悉 APM 的用户量相较熟悉 Spring 框架的用户量有一定差距,但是 APM 与 Spring 生态的复杂度绝对是一个量级的。

以 SkyWalking 为例,SkyWalking 具有十几个子项目,每个项目有几十个模块,每个模块又有着上万行的代码。作为顶级开源社区出品,并师出名门,代码质量肯定不需要赘述。

那你应该如何学习这些海量代码呢?你可以在运维应用服务过程中,有意识地去学习 APM。无论是使用 APM 定位线上问题,还是修复 APM 产品的 Bug,以及增加 APM 产品特性来开发源码,这些都是非常好的学习源码的机会。

我就是通过这种方式学习的,经过近三年的积累,我向社区提交了上百次的代码,也让更多社区伙伴加入了我的源码设计思想讨论。

如果你也按照这个方法进行源码学习,你也是在对社区做贡献。同时,你的代码也会得到更多优化机会,最终在兼容性方面会得到更高维度的考量、提升。

小结与思考

今天的课程,我带你整体复盘了“模块一 APM 产品落地实战”中的 APM 产品。让你直接认识到“对原理的组合封装,便能产生功能各异的 APM 产品形态”这一本质。

但线上部署过多 APM 产品不仅会增加企业负担,还会让一线开发人员定位问题的效率下降。所以我们需要根据自身诉求进行竞品分析,最终选型出适合自身的 APM 系统。

APM 是日常避免线上故障的“兵器”,更是一线开发人员必备的技能,那我们需要如何学习 APM 呢?

一个非常好的方式,就是在日常迭代过程中沉淀遇到的线上问题,将问题暴露出的 APM 的不足之处,通过代码的形式提交到社区。让社区或版本方能结合你的实际场景精进源码。这样经过长时间的积累,你慢慢也就具备了举一反三的能力,能更好地掌握 APM 的设计思路了。

请问你有过 APM 的竞品分析经历吗?如果有,欢迎你将你的竞品分析案例,以及对最终选型的思考,在下方留言区与我们分享,期待与你讨论~

-– ### 精选评论 ##### *远: > 怎么不提pinpoint? ######     讲师回复: >     pinpoint目前在国内用户案例越来越少,都迁移SkyWalking了