1. APM简介 1.1 需求背景
在微服务流行的今天,一个大型系统可能包含数百个(甚至更多)服务。随着服务数量的增加,遇到问题后定位和分析问题的时间成本也相应增加。例如,当遇到系统故障或性能问题时,在传统的三层架构中,只需要分析有限数量的组件,例如Web服务器、应用服务器和数据库。但如果问题发生在微服务架构中,就需要排查大量的组件和服务器。此外,仅分析单个组件很难看到全局。当微服务架构中出现低可视性问题时,使用传统分析方法解决问题所需的时间也会呈指数级增长。
面对上述情况,我们需要一些工具能够帮助运维开发人员快速了解系统、定位问题、监控系统性能。这就是所谓的APM(应用程序性能管理)。
什么是APM?
简而言之,APM 是从业者用来确保应用程序一致的可用性、性能和响应时间的工具。网站、移动应用程序和业务应用程序是典型的监控用例。
APM区别于其他监控系统的核心技术之一是分布式调用链跟踪。借助该功能,我们可以在监控页面看到前端对底层服务的每一次请求的调用,以及对应的服务器地址。接口名称、响应时间、成功等信息。通过这个特性,当请求出现问题时,可以快速发现问题的根源。
APM 的功能远不止于此。在当今高度互联的数字世界中,APM的监控范围已经扩展到服务、进程、主机、日志、网络,当然还有访问这些应用程序的最终用户。
1.2 理论基础——调用链追踪的实现原理
是最早的APM系统,利用该系统帮助运维人员快速定位问题。相关论文《, a Large-Scale》[1]发表后,许多公司和组织基于调用链跟踪原理设计了各种优秀的APM系统。这些APM系统不仅包括调用链跟踪,还集成了性能监控、日志收集、报警等功能,可以作为独立的运维监控系统。
在《,一个大规模》中,解释了整个调用过程的跟踪过程:
① 当一个请求到来时,会生成一个全局系统,通过它可以连接整个调用链,每个调用链代表一个请求。
②此外,还需要用来记录调用的父子关系。每个服务都会记录id和span id,通过它们可以组织一个完整的调用链的父子关系。
③没有id的span成为根span,可以看作是调用链入口。
④所有这些ID都可以用全局唯一的64位整数来表示;
⑤整个调用过程中每个请求都必须透传。
⑥每个服务都会记录请求所附带的ID以及所附的ID,同时也会记录自己生成的ID。
⑦ 查看完整的通话,只需查出所有的通话记录,然后通过id和span id整理整个通话的父子关系即可。
1.3 统一规范——
当代的分布式追踪系统(例如,X-Trace等)以不同的方式实现,并且它们使用不兼容的API来实现各自的应用需求。通过提供独立于平台和供应商的API,开发人员可以轻松添加或修改跟踪系统的实现。 [2]为操作支持系统提供特定于平台的辅助库。
它是一个规范,它不是一个数据结构,它提供语义和概念。我们想要覆盖的是中间层,它是我们想要实现的一套 API。您需要按照规范向用户提供API,并实现探针或向API发送数据的探针。主要目的是做手动埋点,程序开发者必须主动调用API。
实现该规范的 APM 包括、、、、等。
2. 开源APM对比
著名的开源APM包括:[3]、[4]、[5]、[6]等,以下是这些开源APM的横向比较[7]。
图1 开源APM横向对比
综合以上分析,它对代码无侵入,集成成本低,支持轨迹查询、监控、报警等功能。最重要的是,它对应用程序吞吐量的影响最小,并且最符合我们项目的需求。因此,我们选择并使用。
3. 简介
是一款国产开源应用性能监控工具,支持分布式系统的监控、跟踪和诊断。以下是一些主要功能和组件:
①分布式跟踪:跟踪流经多个服务的请求,提供事务路径的端到端可见性。它捕获有关每个调用的详细信息,包括延迟、错误和依赖性。
②指标分析:收集并分析应用指标,如CPU使用率、内存消耗、网络流量等。它提供这些指标的实时监控和可视化,帮助识别性能瓶颈和资源使用模式。
③服务网格支持:与Istio、Envoy等流行的服务网格框架集成,允许用户监控和管理部署在服务网格环境中的微服务。
④报警和诊断:可以根据预定义的阈值或收集的数据中检测到的异常情况生成报警。它还提供强大的诊断工具来帮助解决性能问题并分析根本原因。
⑤ 插件生态系统:提供基于插件的架构,允许用户扩展其功能并与不同技术集成,并且可以支持各种数据库、消息代理和中间件系统。
⑥可视化显示:提供用户友好的基于网络的界面,用于可视化性能数据、生成报告和探索跟踪细节。它提供了一套全面的仪表板和图表来帮助用户了解系统行为。
⑦可扩展性和兼容性:设计用于处理大规模分布式系统。它支持水平可扩展性,可以跨多个节点以分布式方式部署。它兼容云原生环境和容器编排平台,例如.
整体可以分为四个部分(图2):
① Agent:采用字节码植入,非侵入式采集,通过HTTP或gRPC发送数据。
②:链路数据采集器,对Agent传输的数据进行整合、分析和处理,并存储在相关数据存储器中。
③:存储、时间变化,sw已开发并迭代至6.x版本。在6.x版本中,支持Mysql、TiDB、H2作为存储介质进行数据存储。
④UI:Web可视化平台,用于展示实现的数据。
图2 整体架构
通过在应用程序中集成Agent,您可以跟踪接口、服务、数据库、MQ等,并通过HTTP或gRPC协议发送跟踪结果。经过分析聚合后,结果存储在H2或H2等数据库中,并提供一个UI可视化界面,UI获取存储的数据以+HTTP的方式进行展示。
如果只是为了学习体验,则不需要单独安装每个组件。服务器最新版本支持该安装方式。您只需解压安装包并启动即可。数据库、UI 和其他服务器组件已安装。您可以直接登录UI进行体验。此时使用的是H2内存数据库,重启后数据会被清除。被监控的应用程序需要集成Agent,修改Agent配置然后重启,才能将收集到的信息上报给服务器。
另外,官方网站
它还提供了在线体验入口。打开网站,点击页面的“直播演示”->“进入UI”,进入监控页面,查看当前监控的应用程序和日志信息。
目前使用它的公司包括华为、当当网、小米等数十家。
4. 使用示例
下面以我们自己的部署(9.4.0版本)为例,介绍一下主要功能。
4.1 服务监控
进入首页,点击面板,显示如下页面。
图3 服务监控-1
在页面上可以看到,当前系统中有3个应用组件被纳入监控,分别是ops、user。页面显示每个应用的负载、请求成功率、延迟以及应用性能指数(Apdex)。
点击某个服务,可以查看该服务的各项指标的趋势图和报警信息,如下图所示。
图4 服务监控-2
报警规则可以在配置文件中设置。
4.2 拓扑显示
在页面中,您可以看到根据当前时间窗口的请求数据绘制的系统拓扑图。如果某个应用在监控期间没有请求,则拓扑图中不会显示该应用与其他应用的调用关系。
图5 拓扑展示
页面上不仅显示了被监控的服务,还显示了与这些服务有直接调用关系的对象或组件,如User、agent::ui、 10.100.201.73:61616等。
4.3 呼叫链接追踪
在Trace页面中,您可以查看请求的完整调用过程。如下图所示,在“ ID”输入框中输入您要查询的内容,然后点击搜索。该关联的所有请求都将显示在侧栏中。点击其中一个请求,右侧会显示从前端到存储层的所有调用步骤、延迟等。此外,您还可以点击具体路径查看当前调用关联的实例名称、IP、端口、业务日志等信息。
图6 调用链跟踪
4.4 日志监控
支持通过log4j将业务日志上报到服务器并配置在UI中显示。配置方法请参考文档[8][9][10]。配置完成后,您可以在UI的日志页面看到业务日志。如下图所示,
我们的Java程序通常使用log4j或log4j框架来打印业务日志。如果可以将这些标识关联起来,当出现报警日志时,可以根据报警日志找到对应的调用链。为此,提供了一种低侵入的集成方法,允许我们在业务日志中进行打印。
以log4j框架为例,首先在程序中添加apm--log4j-1.x依赖
复制
<dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-log4j-1.x</artifactId> <version>{project.release.version}</version> </dependency>
1.2.3.4.5.<dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-log4j-1.x</artifactId> <version>{project.release.version}</version> </dependency>
1.2.3.4.5.然后修改配置
复制
log4j.appender.CONSOLE.layout=org.apache.skywalking.apm.toolkit.log.log4j.v1.x.TraceIdPatternLayout
1.log4j.appender.CONSOLE.layout=org.apache.skywalking.apm.toolkit.log.log4j.v1.x.TraceIdPatternLayout
1.最后修改日志打印格式
复制
log4j.appender.CONSOLE.layout.Cnotallow=%d [%T] %-5p %c{1}:%L - %m%n
1.log4j.appender.CONSOLE.layout.Cnotallow=%d [%T] %-5p %c{1}:%L - %m%n
1.其中%T表示在日志中添加字段。
配置方法类似。详细信息请参考文献[8][9][10]。
鱼云专注于提供高性能云服务器和物理服务器租赁服务。我们致力于为企业提供安全、稳定、高效的解决方案,确保数据无忧、业务顺畅。