本文主要包含五个部分。第一部分对应用性能监控(APM)相关的概念进行了介绍,包括可观察性和应用性能监控;第二部分将Elastic APM和业界流行的APM产品Apache SkyWalking进行了对比;第三部分对Elastic公司推出的APM产品相关的组件和数据模型进行了介绍;第四部分介绍Elastic APM的使用实践,最后在第五部分进行了总结。
包括我在内,相信很多人都会对这个名词比较陌生并且产生疑问:“可观察性是什么?”。按照文章《借助 Elastic Stack 实现可观察性》的定义:
“可观察性”不是供应商能够在系统之外单独交付的功能,而是您在构建系统时植根于其中的一个属性,就像易用性、高可用性和稳定性一样。设计和构建“可观察”系统的目标在于,确保当它在生产中运行时,负责操作它的人员能够检测到不良行为(例如,服务停机、错误、响应缓慢),并拥有可操作的信息以有效地确定根本原因(例如,详细的事件日志、细粒度的资源使用信息,以及应用程序跟踪)。
那么这个概念又是什么怎么出现的呢?文章《观察之道:带你走进可观察性》提到:
可观察性进入人们的视野是来自于 Apple 的工程师 Cindy Sridharan 的博文“监控与观察”(Monitoring and Oberservability)。 但我认为,Google 著名的 SRE 体系在之前就已经奠定了可观察性的理论基础。
打造可观察性的系统包括三个要素:
介绍完可观察性这个概念,下面将介绍文章的主题APM。
对于大部分应用程序来说性能都是很重要的一个因素,尤其对于比如网站、手机app等直接由用户访问的应用来说更是如此,因为性能较差的应用将会直接影响其用户体验。因此,能对应用进行性能监控变得非常重要,这将帮助我们找到性能瓶颈并优化。
应用性能监控(Application Performance Monitoring,APM),是对应用程序性能和可用性的监视和管理。 APM努力检测和诊断复杂的应用程序性能问题,以维持预期的服务等级。
APM 在维基百科上的定义是应用性能管理(Application Performance Management),而市面上大多数APM产品定义则是应用性能监控(Application Performance Monitoring)。《What Is Application Performance Monitoring and Why It Is Not Application Performance Management》 此文认为应用性能监控是应用性能管理一部分,前者能帮你找到问题,而后者能帮你分析并解决问题。但实际上大部分APM产品都包含了分析问题的部分,并且业界也没有对两个定义作出明确的区分,所以基本上我们可以将两者视为是相同的。
Gartner Research 将APM按功能分为五个维度(2016年将这5个维度归纳至3个),业界的APM产品的主要功能也都基本包含在内。
这部分将对Elastic APM和目前比较流行的开源APM系统Apache SkyWalking进行一些主要功能上的对比。
Elastic APM | SkyWalking | |
---|---|---|
支持语言 | Java, .NET, NodeJS, Python, Ruby, Javascript, Go | Java, .NET Core, NodeJS, PHP and Go |
是否支持tracing | 是 | 是 |
支持存储 | Elasticsearch | ElasticSearch, H2 or MySQL |
UI丰富度 | 高。相比后者能在UI中进行复杂的查询和过滤 | 高。相比前者有服务间的拓扑图 |
Agent易用性(代码侵入性) | Java, .NET Core、Node.js 部分开源库无需侵入代码自动装配(instrument),Python, Ruby, Javascript, Go 部分开源库提供SDK手动装配。而对于不支持的库/框架,也能通过Public API采集。 | Java, .NET Core, NodeJS 部分开源库无需侵入代码自动装配,不支持的无法使用;Go和PHP提供SDK手动装配。 |
查询能力 | 能在Kibana APM UI对任意APM信息进行查询或过滤 | 仅支持TraceId、endpoint name查询 |
告警 | 支持 | 支持 |
JVM 监控 | 支持 | 支持 |
Go Runtime监控 | 支持 | 不支持 |
收集错误和异常 | 支持 | 不支持 |
实现全面可观察性 | 支持。在Elastic Stack中你已经可以拥有日志及指标的完备解决方案,再结合APM,就可以实现全面的可观察性系统。 | 不支持 |
从上述对比可以看出Elastic APM比Apache Skywalking更胜一筹,更多APM产品的对比可以参考文章《应用性能监控(APM)》第二部分“选型”。
Elastic APM是一个Elastic Stack的应用性能监控(APM)系统,它能够:
Elastic APM由四个组件组成:
Elastic APM agent从其检测(instrument)的应用程序中收集不同类型的数据,这些被称为事件,类型包括span,transaction,错误和指标四种。
这部分将通过基于go gin http框架和java spring-boot 开发的两个demo介绍Elastic APM的使用实践。
APM Agent与Server的版本兼容情况见:Agent and Server compatibility
对于在支持技术中的库,APM Java Agent 能够自动检测应用程序性能和跟踪错误,例如,它记录传入HTTP请求的事务(Transaction)和数据库查询的Span。这得益于javaagent提供的字节码注入功能。
对于不支持的库或具体业务代码,可以使用Public API 手动采集性能数据。
spring-boot-demo是一个基于spring boot的简单web程序,提供了”新增用户“和”查询所有用户“两个接口。此demo中使用了 Web框架 Spring Web MVC 以及数据库连接库 JDBC,agent将自动检测这两个库而无需修改代码。根据文档中的介绍:
ControllerClass#controllerMethod
试试看效果。
[root@VM_17_4_centos spring-boot-demo]# curl localhost:8080/user -XPOST -d name=First -d email=first@xx.com
Saved
[root@VM_17_4_centos spring-boot-demo]# curl localhost:8080/user
[{"id":1,"name":"First","email":"first@xx.com"}]
spring-boot-demo
,说明请求APM agent已有数据上报spring-boot-demo
,可以看到关于服务的APM整体性能数据:可以看到“Request”中已经有了我们的两次接口请求UserController#getAllUsers
和 UserController#addNewUser
。
UserController#addNewUser
,可以看到这个请求(对应一个“事务”事件)相关的信息:在页面上方是关于请求耗时、每分钟请求数以及响应时间分布情况的图表,而下方是一个事务(Transaction)的详细信息,包括在Timelines中展现请求处理中各组件的耗时情况(在此例中是使用JDBC进行数据库操作)。
除了自动检测的方式外,我们还可以为指定的代码片段手动收集性能数据。
下述例子给”添加新用户“接口增加了一个耗时操作(Thread.sleep(1000)
)并为其创建名为Thread.sleep
的 span,以及为这个span添加了自定义标签opArg
,值为1000
。
@PostMapping(path="") // Map ONLY POST Requests
public @ResponseBody String addNewUser (@RequestParam String name
, @RequestParam String email) throws Exception {
// 除了在框架默认采集的span外,还可以的给指定的代码片段增加自定义span
Transaction parent = ElasticApm.currentTransaction();
Span span = parent.startSpan();
try {
span.setName("Thread.sleep");
span.addLabel("opArg", 1000);
// do your things
Thread.sleep(1000);
} catch (Exception e) {
span.captureException(e);
throw e;
} finally {
span.end();
}
// 创建User
User n = new User();
n.setName(name);
n.setEmail(email);
userRepository.save(n);
return "Saved";
}
重新构建运行demo后看看执行效果。
[root@VM_17_4_centos spring-boot-demo]# curl localhost:8080/user -XPOST -d name=Second -d email=second@xx.com
Thread.sleep
的span分布式追踪是现代应用程序性能监视的关键功能之一, 随着软件应用程序体系结构从单一体系结构转变为分布式的基于服务的体系结构,跟踪请求如何在系统间流动的能力也变得至关重要。
使用分布式跟踪,请求事务被链接到一起形成一个跟踪,其中包括端到端性能,即如何处理请求以及其中包含哪些服务。 分布式跟踪使开发和运维人员可以根据上下文关联各个事务的性能,从而快速查明最终用户体验的瓶颈。
为了演示分布式服务跟踪,这里引入一个新的demo程序 gin-demo,基于go语言的http web框架gin 开发,功能为:查询一个用户id对应的所有商品订单。
在spring-boot-demo
中,为了能在调用gin-demo
http接口时将事务(Transaction)id传递给它以支持分布式追踪,需要使用在 Supported technologies - Networking frameworks 中提到的网络库,这里选择的是Apache HttpClient
库。
两个demo程序的调用关系如下图所示:
调用spring-boot-demo
获取用户信息接口/user/:id
,其内部将会通过调用gin-demo
接口/user/:id/orders
获取用户的订单信息
[root@VM_17_4_centos ~]# curl localhost:8080/user/1
{"user":{"id":1,"name":"First","email":"first@xx.com"},"orders":[{"id":"1","productID":"1","userID":"1"}]}
到这里实践部分就已经结束了,若你想了解更多Elastic APM的使用实践,可以参考官方提供的demo opbeans。
应用性能监控(APM)作为可观察性系统三个要素中的重要一员,有着其他两者(日志和指标)所无法做到的事:能帮助我们深入到代码层面的追踪(或监控),包括程序内部执行过程、服务之间链路调用等情况,能轻易的找到程序“慢”的原因。
在和其他产品的对比方面,通过对Elastic APM和Apache Skywalking进行对比发现Elastic APM在功能上更胜一筹。
最后在使用方面,可以看到有部分语言(Java、.Net、Node.js)的一些库得益于“注入”的技术,可以在不需要侵入代码的情况下就能进行应用性能监控,使用上非常便利;而对于未提供这种技术的语言(Python, Ruby, Javascript, Go ),Elastic APM也为一些库提供了方便使用的SDK。即使上述两种方式对你的应用程序都不适用,你也可以使用Elastic APM为各语言都提供的 Public API 的手动采集。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。