导读:为了让大家更好的 APM 系统的设计实现,我将在公众号编写《云原生之可观测性》系列文章,深入讲解 APM 系统的产品设计、架构设计和基础技术。APM是一个庞杂的技术体系,涉及到很多开源技术,欢迎大家留言讨论。
本文主要从以下几个维度来阐述APM:
1、APM是什么?
2、APM的目的是什么?
3、APM开源框架
一. APM是什么?
APM 是Application Performance Managment的缩写,即:“应用性能管理”。现代的APM体系,基本都是参考Google的《Dapper,大规模分布式系统的跟踪系统》(公众号回复: APM,领取高清版本文档)的体系来实践的。
APM属于IT运维管理(AIOps)范畴。主要是针对企业关键业务的IT应用性能和用户体验的监测、优化,提高企业IT应用的可靠性和质量,保证用户得到良好的服务,降低IT总体拥有成本(Total cost of ownership - TCO)。
后来由Gartner归纳抽象出来一套概念框架,如下图:
Gartner的APM Conceptual Framework(概念框架)是经过大量调研与分析后的归纳与抽象,这些切实需求由来已久,IT从业者们对它的理解与实践也几乎是从IT诞生至今就已开始,这并不是一次发明。
1、终端用户体验:End User Experience
2、运行时应用架构:Runtime application architecture
3、业务事务分析:Business Transactions
4、深度组件监控:Deep Dive Component Monitoring
5、分析报告:Analytics / Reporting
关于APM概念框架,之后将结合案例讲解。
二、APM的目的是什么?
随着中台、微服务、云原生架构的流行,应用系统本身正变得越来越难以管理,终端用户的一次请求往往需要涉及到多个服务,因此服务性能监控和问题排查就变得异常的复杂。不同的服务可能由不同国家,不同团队,和不同编程语言来实现。服务可能部署在成千上万台服务器,跨越不同机房,不同数据中心。
如上图,一次请求经过多个应用,实际情况可能比上图还要复杂,那么我们如何去发现问题和排查问题,以及它们的性能如何?如果性能不好,我们该如何去优化呢?是去优化应用C还是去优化应用D呢?
因此,就需要一个可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题,这就是APM系统。
APM最早是谷歌公开的论文提到的 Google Dapper。Dapper是Google生产环境下的分布式跟踪系统,自从Dapper发展成为一流的监控系统之后,给google的开发者和运维团队帮了大忙,所以谷歌公开论文分享了Dapper。
三、APM开源套件
APM是一种理念,一种方法论,主要指对企业关键业务应用进行观测、分析、优化。从而提高企业应用的可靠性和稳定性。
从用户的角度来说:可以保证为用户提供高质量的服务。
从企业的角度来说:可以为企业降低IT的总成本。
Metrics、Tracing和Logging是APM中三个主要的概念,如上图,Metrics、Tracing和Logging是有交叠的地方。从左边线条的箭头方向看成本会越来越高。Metrics、Tracing和Logging三者之间的成本关系(以存储成本计算):
- Metrics 更节省存储资源,因为数据会被聚合后存储。
- Logging 需要的存储空间最大,成本最高。
- Tracing 也是存储大户,由于它的业务特点可以采样,所以总体存储成本则介于两者之间。
了解了Metrics、Tracing和Logging之后,我们在看看市面上有哪些开源产品是支持的这三个概念的,下面介绍到的开源框架,大部分都是笔者在做监控系统工作中调研过的,如果想深入了解,欢迎留言讨论。
3.1 主流框架
1. Skywalking
官方地址:https://skywalking.apache.org/
主要语言:Java
项目描述:必须排第一,国货之光。Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品,它同时吸收了Zipkin/Pinpoint/CAT的设计思路,支持非侵入式埋点。是一款基于分布式跟踪的应用程序性能监控系统。
总结:Skywalking已经是一个比较完整的APM解决方案了,如果公司体量不是很大,建议使用。
2. ELK stack
官方地址:https://www.elastic.co/cn/
主要语言:GO和Java
项目描述:ELK Stack是一个流行的工具套件,功能涵盖监控、日志和数据可视化。它由 ElasticSearch, Logstash, and Kibana 三部分组成。其中,Elasticsearch 负责搜索和分析,Logstash 是日志聚积器,而 Kibana则提供华丽的可视化仪表盘。
总结:国内大数据互联网公司都采用ELK做日志采集。
3. prometheus
官方地址:https://prometheus.io/
主要语言:Go
项目描述:Prometheus 是一套开源的系统监控报警框架。它受启发于 Google 的 Brogmon 监控系统,由工作在 SoundCloud 的前 google 员工在 2012 年创建,作为社区开源项目进行开发,并于 2015 年正式发布。
2016 年,Prometheus 正式加入 Cloud Native Computing Foundation(CNCF)基金会的项目,成为受欢迎度仅次于 Kubernetes 的项目。2017 年底发布了基于全新存储层的 2.0 版本,能更好地与容器平台、云平台配合。
Prometheus 作为新一代的云原生监控系统,目前已经有超过 650+位贡献者参与到 Prometheus 的研发工作上,并且超过 120+项的第三方集成。
总结:容器化必备监控软件
4. open-falcon
官方地址:http://open-falcon.org/
主要语言:Go、Python
项目描述:小米开源的企业级监控工具,用 Go 语言开发而成,包括小米、滴滴、美团等在内的互联网公司都在使用它,是一款灵活、可扩展并且高性能的监控方案,Open-Falcon从互联网公司的一些需求出发,从各位SRE、SA、DEVS的使用经验和反馈出发,结合业界的一些大的互联网公司做监控,用监控的一些思考出发,设计开发了open-falcon。
总结:用于做服务器端监控是一个不错的选择
5. Sensu
官方地址:http://sensu.io/
主要语言:Ruby
项目描述:Sensu 是由 Sonian 公司开发的一种监控框架,主要用于拥有大规模节点的云计算平台的检查与监控。它可以监控服务器、相关服务和应用程序健康状况,并通过第三方集成发送警报和通知。目前发行的版本有企业版和开源版两种,收费的企业版本较之免费的开源版本拥有更多的功能。
6. pinpoint
官方地址:https://github.com/pinpoint-apm/pinpoint
主要语言:Java
项目描述:pinpoint是开源在github上的一款APM监控工具,它是用Java编写的,用于大规模分布式系统监控。它对性能的影响最小(只增加约3%资源利用率),安装agent是无侵入式的。
总结:UI不错,但是不支持多语言,探针也不丰富,个人不建议使用。
7. zipkin
官方地址:https://zipkin.io/
主要语言:Java
项目描述:这个是twitter开源出来的,也是参考Dapper的体系来做的。Zipkin 是一个开放源代码分布式的跟踪系统,每个服务向zipkin报告计时数据,zipkin会根据调用关系通过Zipkin UI生成依赖关系图。Zipkin提供了可插拔数据存储方式:In-Memory、MySql、Cassandra以及Elasticsearch。为了方便在开发环境我直接采用了In-Memory方式进行存储,生产数据量大的情况则推荐使用Elasticsearch。
总结:具有侵入性,报表也比较单一。
8. Jaeger
官方地址:https://www.jaegertracing.io/
主要语言:Go
项目描述:Jaeger由Uber创建,它除了Zipkin的功能集外,Jaeger还提供了动态采样,REST API,基于ReactJS的UI界面,以及对Cassandra和Elasticsearch内存数据存储的支持。为了实现这些功能,Jaeger相比Zipkin采取了一种不同的,更分散的方法。
总结:Jaeger的采样算法是非常值得推荐的。如果在Jaeger和Zipkin选择,建议Jaeger
9. Cat
官方地址:https://github.com/dianping/cat
主要语言:Java
项目描述:CAT(Central Application Tracking)是由吴其敏(前大众点评首席架构师,现携程架构负责人)主导设计基于Java开发打造的实时应用监控平台,为大众点评网提供了全面的监控服务和决策支持。AT作为大众点评网基础监控组件,它已经在中间件框架(MVC框架,RPC框架,数据库框架,缓存框架等)中得到广泛应用,为点评各业务线提供系统的性能指标、健康状况、基础告警等。
总结:15年左右做监控系统的时候,调用链用了Cat,不过由于具备侵入性,后面大面积的改造,改成无侵入型,总体来说是不错的开源框架。
3.2 传统监控
1.zabbix
官方地址:http://zabbix.com/
主要语言:C和PHP
项目描述:Zabbix是业界领先的开源网络监控工具,它具有可扩展的网络监控能力,Zabbix在网络、服务器、云、应用程序和服务监控方面做得非常好。
你可以通过Zabbix可以跟踪网络信息,如网络带宽使用、网络健康状况和配置更改,并排除需要解决的问题。与其他开源监控工具相比,Zabbix提供了很高的便利性。诸如它可以自动检测连接到网络的设备。
目前还有很多公司都在用zabbix。
2. Nagios
官方地址:http://www.nagios.org
主要语言:C
项目描述:Nagios是一款开源的免费网络监视工具,能有效监控Windows、Linux和Unix的主机状态,交换机路由器等网络设备,打印机等。在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员,在状态恢复后发出正常的邮件或短信通知。
3. cacti
官方网站:http://www.cacti.net
开发语言:php
项目描述:Cacti是一个开源的,基于web网络监控和图形化工具,它被设计作为开源,工业化标准数据日志工具RRDtool的后端应用程序。它通常用来显示数据时序图、CPU加载和网络宽带应用程序。最普通的用处就是通过轮询网络交换机或者通过简单网络管理协议来路由接口(SNMP, Simple Network Management Protocol)
总结:以上三种传统监控系统,俗称:监控三剑客。
3.3 前端监控
1. sentry
github地址:https://sentry.io/welcome/
项目描述:Sentry 是一个开源的实时错误追踪系统,可以帮助开发者实时监控并修复异常问题。它主要专注于持续集成、提高效率并且提升用户体验。Sentry 分为服务端和客户端 SDK,前者可以直接使用它家提供的在线服务,也可以本地自行搭建;后者提供了对多种主流语言和框架的支持,包括 React、Angular、Node、Django、RoR、PHP、Laravel、Android、.NET、JAVA 等。同时它可提供了和其他流行服务集成的方案,例如 GitHub、GitLab、bitbuck、heroku、slack、Trello 等。
2. Webfunny
github地址:https://www.webfunny.cn/
项目描述:也是含有监控错误的功能,可以支持千万级别日PV量,额外的亮点是可以远程调试、性能分析,也可以docker私有化部署(免费),业务代码加密过。
总结:由于其代码没有开源,二次开发受限
3. zanePerfor
github地址:http://github.com/wangweianger
3.4 移动端监控资料
AndroidPerformanceMonitor : https://github.com/markzhai/AndroidPerformanceMonitor
leakcanary : https://github.com/square/leakcanary
watchdog : https://github.com/gorakhargosh/watchdog
iOS-System-Services : https://github.com/Shmoopi/iOS-System-Services
总结
监控系统是IT运维和产品运营的一双眼睛,随着业务到达一定的量级,监控需求会越来越丰富,目前市面上开源的监控系统都存在这样或者那样的问题。在国内外,监控系统的技术问题和产品体验都存在很多需要突破的点,后续将持续分享一些自己的看法。
云原生之可观测性 - APM概念及选型
专家压测服务-腾讯WeTest,您的质量守护专家