微服务应用性能分析实战08 工匠精神:熟悉 APM 产品的能力是 RD 的分内之事

news/2024/5/15 6:16:10/文章来源:https://blog.csdn.net/fegus/article/details/127007197

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

在前面的章节,我带你学习了 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 的相应领域一通百通;并且熟悉差异化的产品实现可以让我们在定位问题时,能够挑选到合适的工具去剖析问题。

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

  1. Apache SkyWalking

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

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

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

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

  2. Alibaba Arthas

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

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

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

  3. 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 的正确性

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

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

  2. 通过编译,分析出是否支持编译发布和依赖框架的明细。对不支持编译发布的老服务选型,我推荐 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了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_13036.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最新 Hi3861开发环境搭建

Hi3861开发环境 最好参考官方文档: Hi3861开发环境 这里做下记录 (1)安装编译依赖基础软件(仅Ubuntu 20需要) 执行以下命令进行安装: sudo apt-get install build-essential gcc g make zlib* libffi-de…

最大子数组和-前缀和/动态规划/分治/暴力-Java/c++

一、题目描述 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 二、思路解析 1.前缀和 2.动态规划思想 题目只是要求一个结果&#xff…

非零基础自学Java (老师:韩顺平) 第21章 网络编程 21.1 网络的相关概念

非零基础自学Java (老师:韩顺平) ✈【【零基础 快速学Java】韩顺平 零基础30天学会Java】 第21章 网络编程 文章目录非零基础自学Java (老师:韩顺平)第21章 网络编程21.1 网络的相关概念21.1.1 网络通信21.1.2 网络21.1.3 ip 地址21.1.4 ipv4 地址分类…

C++ STL新特性:not1 not2 mem_fun mem_fun_ref mem_fn等函数(详解+示例代码)

文章目录谓词not1函数指定类型***继承标准库not2函数指定类型***继承标准库mem_fun函数mem_fun_ref函数mem_fn函数函数绑定示例建议先补充基础知识,否则生啃本节可能会有一定难度: CSTL:仿函数 CSTL: bind函数绑定 谓词 首先来解…

C++类和对象详解(上篇)

文章目录1.1:类的定义方式1.1.1:声明和定义放在类中1.1.2:声明定义分离1.1.3:成员变量命名规则1.1.4:访问限定符1.2:类的作用域1.3:类的实例化1.4:类对象模型1.4.1:如何计…

修改openLDAP管理员密码(docker-compose非容器方式/容器化方式/docker-compose)

文章目录1. 非容器化方式1.1 查看管理员信息1.2 获取密码的加密字串1.3 生成密码修改文件1.4 修改密码1.5 问题2. 容器化方式1. 非容器化方式 非容器化ldap更改管理员密码 1.1 查看管理员信息 命令 ldapsearch -H ldapi:// -LLL -Q -Y EXTERNAL -b "cnconfig" &quo…

Flink 容错机制 Checkpoint 生成与恢复流程

传送门:Flink 系统性学习笔记 Flink 是一个分布式数据处理系统,因此必须有一套机制处理各种故障,例如进程被强制杀掉、机器故障和网络连接中断。任务都是在本地维护状态,所以 Flink 要确保状态不丢以及不错。 在本节中,我们将介绍 Flink 的检查点是如何恢复和生成的,看它…

AutoAugment 学习

非官方项目地址:Github项目 官方文章:文章连接 关于图片地深度学习有时会需要大量的图片,因此,为了获得更多的图片,对已经获取的图片进行扩展就是一个必要地手段,简单来说,针对图片地数据增强就…

边缘检测算子之间的优劣

图像边缘 图像边缘是图像最基本的特征,边缘即图像局部不连续性(突变处),例如灰度级的突变、颜色的突变、纹理结构的突变等。边缘检测的方法绝大部分可以分为两类: 基于查找一类:通过寻找图像一阶导数中的…

用户登录权限验证详解-网关登录校验-token解析-全局异常处理

用户登录权限验证一, 登录Controller层ServiceImpl层二,搭建微服务网关三,统一Token处理四,网关登录校验五,在网关模块添加全局过滤器六,统一token解析1.编写拦截器1.配置拦截器七,ThreadLocal工…

2020 MIT6.s081 Lab mmap

文章目录Lec16-17: Why Logging学习笔记实验链接实验Lab: mmap结果提交结果查看结果参考链接GithubLec16-17: Why Logging学习笔记 阅读论文《journal-design》,如何在ext2中增加journal,从而得到ext3文件系统。阅读论文《appel-li》,了解虚…

Java各种摘要算法的工具类

Java各种摘要算法的工具类前言各算法的工具类(Java)DigestHelperMD5UtilsSHAUtilsSM3UtilsHMacUtilsTestForAbstract结果简单总结前言 在上一篇文章 – Java了解消息摘要算法 里我们提到了什么是消息摘要算法,主流的摘要算法介绍以及部分摘要…

java毕业设计软件源代码SSM家庭理财|个人理财管理系统|记账系统[包运行成功]

🍅文末获取联系🍅 一、项目介绍 计算机毕业设计java毕设之SSM家庭理财个人理财系统-IT实战营_哔哩哔哩_bilibili计算机毕业设计java毕设之SSM家庭理财个人理财系统-IT实战营共计3条视频,包括:计算机毕业设计java毕设-SSM家庭理财…

安装Nginx教程

目录 一、打开Xshell 1、创建新的连接到Linux 2、到Nginx官网下载安装包 二、开始安装Nginx 1、安装pcre依赖 (1)下载pcre压缩文件依赖 (2)切换到root用户 (3)切换到src目录 (4&#xf…

模糊PID控制的规则表一点理解

目录前言参考过程前言 最近在学习模糊PID控制,对于模糊PID控制的规则表有一点疑惑,然后上网查了一下资料,记录一下。 参考 怎么理解模糊pid控制表?人间苦旅 过程 模糊PID控制器的输入值是偏差e和偏差变化率ec,经过…

单步调试找到 cy.visit 的实现源代码(一) - 找到了 BlueBird

这里的 stack_utils__WEBPACK_IMPORTED_MODULE_5_, 这些 imported module 可以在文件头看到: harmony import: cypress_runner.js 源码里这个 harmony import 的含义: https://stackoverflow.com/questions/52871611/what-is-har…

I/O多路复用系统调用poll、epoll

文章题目pollpoll接口认识poll的优点poll的缺点poll示例epoll内核事件表epoll接口认识epoll_createepoll_ctlepoll_waitepoll的优点epoll的工作方式poll poll接口认识 函数原型 #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout);//pollfd结…

计算机毕业设计 SSM在线药品购物商城系统(源码+论文)

文章目录1 前言2 实现效果3 设计方案4 最后1 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的java web缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的java web管理系统达不到…

GrapeCity Documents for Word (GcWord)

GrapeCity Documents for Word &#xff08;简称&#xff1a;GcWord&#xff09;是一款服务端 Word 组件&#xff0c;支持 .NET 和 .NET Core&#xff0c;无需 Office 组件&#xff0c;即可超快批量生成、加载、编辑和保存 Word 文档。借助 GcWord 组件&#xff0c;开发者得以迅…

OSG跨平台编译:编译环境

目录 一、操作系统 二、编译器 三、辅助工具 在osg、osgEarth编译专栏中,综合考虑第三方库、OSG、osgEarth的跨平台编译,拟在Windows、Linux、MacOS等三个操作系统中,开展编译实践。 一、操作系统