騰訊雲大資料ES:使用Elastic APM監控SpringBoot服務的最佳實踐

語言: CN / TW / HK

作者:吳容, 騰訊雲大資料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檔案如下:

apm-server:
host: "localhost:8200"
#-------------------------- Elasticsearch output --------------------------
output.elasticsearch:
hosts: ["ES-VIP:9200"]
enabled: true
username: "elastic"
password: "changeme"


#================================= Logging =================================
logging.level: info
logging.metrics.enabled: true
logging.metrics.period: 30s
logging.to_files: true
logging.files:
path: /usr/local/service/APMServer/apm-server-7.14.2/logs
name: apm-server.log


# Defines if the HTTP endpoint is enabled.
http.enabled: true
http.host: localhost
# Port on which the HTTP endpoint will bind. Default is 5066.
http.port: 5066
#============================= X-pack Monitoring =============================
# Set to true to enable the monitoring reporter.
monitoring.enabled: true
monitoring.elasticsearch:
hosts: ["ES-VIP:9200"]
username: "elastic"
password: "changeme"

其中,上面的配置中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的整合命令為:

java \
-javaagent:lib/elastic-apm-agent-1.33.0.jar \
-Delastic.apm.service_name=spring-boot-application \
-Delastic.apm.application_packages=org.tencentyun.ces \
-Delastic.apm.server_urls=http://localhost:8200 \
-jar wr-ces.jar &

其中: -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連線成功。

2022-07-29 19:45:14,764 [main] INFO co.elastic.apm.agent.configuration.StartupInfo - Starting Elastic APM 1.33.0 as apm-server (0.0.1) on Java 1.8.0_312 Runtime version: 1.8.0_312-b07 VM version: 25.312-b07 (Red Hat, Inc.) Linux 4.18.0-305.25.1.el8_4.x86_64
2022-07-29 19:45:14,764 [main] INFO co.elastic.apm.agent.configuration.StartupInfo - service_name: 'spring-boot-application' (source: Java System Properties)
2022-07-29 19:45:14,764 [main] INFO co.elastic.apm.agent.configuration.StartupInfo - server_urls: 'http://localhost:8200' (source: Java System Properties)
2022-07-29 19:45:14,764 [main] INFO co.elastic.apm.agent.configuration.StartupInfo - application_packages: 'org.tencentyun.ces' (source: Java System Properties)
2022-07-29 19:45:20,336 [main] INFO co.elastic.apm.agent.impl.ElasticApmTracer - Tracer switched to RUNNING state
2022-07-29 19:45:20,383 [elastic-apm-server-healthcheck] INFO co.elastic.apm.agent.report.ApmServerHealthChecker - Elastic APM server is available: { "build_date": "2021-09-15T09:23:02Z", "build_sha": "dd1680c3f841ef0392dcec228fb0f65d2ac446e2", "version": "7.14.2"}

圖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具體配置如下:

output.kafka:
enabled: true
hosts: ["localhost:9092"]
topic: apm-springboot
username: 'changeme'
password: 'changeme'

具體部署架構示意圖如圖11所示:

圖11. Elastic APM高效能部署架構

四、小結

本文詳細演示了在騰訊雲ES叢集的基礎上,通過Elastic APM來實時監控SpringBoot的應用服務。通過Elastic APM我們能夠非常直觀地檢視每一個請求鏈路的具體效能指標等資訊。同時也能直觀的看到服務與服務之間相互互動的拓撲結構。最後我們還介紹瞭如何在生產環境中部署一個高效能的APM系統架構。如要了解更多,快到騰訊雲Elasticsearch Service控制檯建立叢集進行體驗吧。

免費體驗活動專區

Elasticsearch 新使用者可享  2核4G,0元  體驗  30  天! 順暢體驗雲上叢集

新增小助手回覆 Elasticsearch 加入 Elasticsearch 技術社群:point_down:

推薦閱讀

關注騰訊雲大資料公眾號

邀您探索資料的無限可能

點選“閱讀原文”,瞭解相關產品最新動態

↓↓↓