腾讯云大数据 ES:使用 Elastic APM 监控 SpringBoot 服务的最佳实践
作者:吴容,腾讯云大数据 Elasticsearch 高级开发工程师
在《腾讯云ES:图文详解!你想了解的ElasticAPM这里全都有》这篇文章中,我们对 Elastic APM 的组件架构、数据模型和工作原理有了比较清晰的认识,本篇文章将从实践的角度出发,演示如何使用 Elastic APM 来实时监控我们的 SpringBoot 服务。
一、创建 ES 集群
首先在演示的第一步,需要先创建出一个 ES 集群环境,这里我们到腾讯云 ES 控制台创建一个 7.14.2 白金版的 ES 集群。
图 1. 腾讯云 ES 控制台创建 ES 集群
二、部署 APM Server
创建好 ES 集群后,开始部署 APM Sever。这里有两种部署模式,第一种是通过 Kibana 上的 Fleet Intergration 方式进行安装部署,第二种则是手动进行安装。本文演示手动部署模式。
1、下载 APM Server 下载 APM Server 安装包可通过如下链接获取:https://www.elastic.co/cn/downloads/past-releases#apm-server由于我们刚创建的腾讯云 ES 集群版本为 7.14.2,因此我们这里选择的 APM Server 版本也选择为 7.14.2。
2、修改配置文件下载完成后,解压到对应的目录,然后配置 apm-server.yml 文件如下:
其中,上面的配置中 output.elasticsearch 为 APM agent 采集的性能数据输出的 es 集群信息,monitoring.elasticsearch 则表示将 APM Server 的监控采集信息输出到对应的 es 集群中。
3、启动 APM Server 我们通过如下命令来启动 APM Server。如果是生产环境通常会通过以启动脚本文件方式进行启动。./apm-server -e 启动完成后,我们便可以在 ES 集群中看到新创建的 apm 相关索引:
图 2. APM Server 启动后默认创建的索引
并且在 Kibana 的监控模块,可以看到 APM Server 实例的监控信息:
图 3. Kibana 监控页展示 APM Server 实例信息
三、集成 APM Java agent
本文演示的 Java Application 是基于 SpringBoot 框架开发的一个 Java 服务,该服务里提供与 ES 集群交互的 Rest API 接口。如果希望通过 APM 来监控我们的 Java 服务,则必须要在 Java 服务中引入 APM Agent。因此,该服务中集成的 Java Agent 版本为 1.33.0。
1、下载 apm agent 下载地址:Maven Central Repository Search
图 4. 下载 apm agent
注意:这里的 Java Agent,不是通过 Maven 仓库依赖的方式集成,而是通过第三方 lib 方式。2、启动应用服务下载完成 apm agent 后,将 agent 的 jar 文件放置到 Java 项目的 lib 包中,然后在服务的启动命令里通过-javaagent 方式进行集成。本 demo 的集成命令为:
其中:-javaagent:lib/elastic-apm-agent-1.33.0.jar 为该 Java Agent 的相对路径;-Delastic.apm.application_packages=com.tencentyun.ces 为 APM 堆栈跟踪的应用包名称,多个包之间通过逗号分隔 https://www.elastic.co/guide/en/apm/agent/java/1.x/config-stacktrace.html#config-application-packages。-Delastic.apm.service_name=spring-boot-application 为 APM 的 service 名称,该名称最终会在 APM 的 Services 和 ServiceMap 中进行直观展示。-Delastic.apm.server_urls=http://localhost:8200 为 APM Server 的服务地址,由于我们这里的 Java 应用和 APM Server 是部署在同一台服务器上,因此地址为 localhost:8200。-jar wr-ces.jar 表示 java 服务的 jar 包名称。通过上面的命来启动 Java 服务,可以看到日志中打印了如下信息,表示 Java Agent 和 APM Server 连接成功。
图 5. 启动应用服务
3、查看 APM 数据随后通过 curl 命令向 Java 服务中添加一条数据,然后保存到 ES 集群中。再回到 Kibana 的 APM 界面可以看到 Service 列表页里已经有了刚刚启动的 Java 服务了。
图 6. APM Service 列表页
点击 spring-boot-application 这个 Service 进去之后,可以看到该 Service 更详细的监控和 Transaction 信息。如我们刚刚对 ES 集群做的写入文档 save 操作。
图 7. APM Transactions 列表页
选择其中一个 Transaction 再次点击进去后,可以看到每一次请求的调用链路和耗时情况。非常方便我们定位分析线上问题。
图 8. APM 调用链详情信息
另外 APM 还提供了服务地图的可视化界面,可以非常直观的看出服务与服务之间的拓扑结构,以及每个服务的基本性能指标。如本 Java 应用中,只与 ES 进行了交互。
图 9. APM Service Map
APM 的 Errors 还详细记录了每个服务的异常日志信息,通过这些信息,可以做异常告警等操作。
图 10. APM Errors 列表页
到此,我们演示完成了 Elastic APM 监控 SpringBoot 服务的完整过程。可以看出整个过程搭建起来非常简单和便捷。也能够看出 Elastic 生态的强大和繁荣。
四、Elastic APM 高性能构架
上面我们演示的 demo 由于数据量很小,因此直接采用了单机部署模式,并且 APM Server 从 agent 接收到的数据是直接写入 Elasticsearch 集群中的。但是在生产环境,由于服务通常都采用多实例或集群模式部署,且数据量庞大。因此为了提高 Elastic APM 的整体性能和吞吐量,我们会对 APM Server 采用多实例部署方式,且将数据先输出到 Kakfa 中,然后再通过 Logstash 等管道组件将数据消费到 ES 中。apm-server.yml 中将数据输出到 kafka 具体配置如下:
具体部署架构示意图如图 11 所示:
图 11. Elastic APM 高性能部署架构
四、小结
本文详细演示了在腾讯云 ES 集群的基础上,通过 Elastic APM 来实时监控 SpringBoot 的应用服务。通过 Elastic APM 我们能够非常直观地查看每一个请求链路的具体性能指标等信息。同时也能直观的看到服务与服务之间相互交互的拓扑结构。最后我们还介绍了如何在生产环境中部署一个高性能的 APM 系统架构。如要了解更多,快到腾讯云 Elasticsearch Service 控制台创建集群进行体验吧。
评论