當微服務系統越來越龐大,各個服務間的調用關系也變得越來越復雜,需要一個工具來幫忙理清請求調用的服務鏈路。之前在《Spring Cloud Sleuth:分布式請求鏈路跟蹤》一文中使用的是Sleuth+Zipkin的解決方案,最近發現應用性能監控(Application Performance Monitoring,APM)也可以很好地解決該問題。對比SkyWalking和Elastic APM之后,發現Elastic APM更勝一籌,今天我們來一波Elastic APM的使用實踐!
福利 福利 福利 免費領取Java架構技能地圖 注意了是免費送
、
免費領取 要的+V 領取
Elastic APM 簡介
Elastic APM是基於Elastic Stack構建的應用性能監控(APM)系統。它主要有如下用途:
- 用來實時監控應用性能信息,包括HTTP請求調用時長、數據庫查詢信息、緩存調用信息和外部的HTTP請求調用信息。有助於我們快速找出並解決性能問題。
- 自動收集應用中未處理的錯誤和異常,顯示異常的堆棧信息,有助於快速定位異常和了解出現頻率。
- 度量指標是調試生產系統時的另一個重要信息來源。Elastic APM Agent 會自動收集主機級別的度量指標(比如Java JVM和Go Runtime的指標)。
- 支持分布式請求鏈路追蹤,使你能夠在一個視圖中分析整個服務架構的性能問題。
相關組件
Elastic APM 包括四大組件: APM Agent, APM Server, Elasticsearch, Kibana。
- APM Agent:以應用程序庫的形式提供,負責收集應用運行時的性能監控數據和錯誤數據,短時間緩存后發送APM Server。
- APM Server:一個獨立的組件,負責接收APM Agent中發送的性能監控數據。驗證並處理完數據后,會轉存儲到Elasticsearch中,之后就可以在Kibana APM 應用中查看性能監控數據了。
- Elasticsearch:用於存儲應用性能監控數據並提供聚合功能。
- Kibana APM app:可視化查看APM性能監控數據,有助於找到性能瓶頸。
數據模型
Elastic APM Agent 從其檢測的應用程序中捕獲不同類型的信息。這些操作被稱為事件,可以是Span, Transaction, Error, or Metric。
- Span(跨度):Span包含一次操作過程中代碼執行路徑的信息。它從操作的開始到結束進行度量,並且可以與其他Span具有父/子關系。
- Transaction(事務):Transaction是一種特殊的Span,具有與之關聯的其他屬性。它描述了Elastic APM Agent捕獲的最高級別事件,比如一次請求、一次批處理任務等。
- Error(錯誤):Error事件至少包含錯誤發生的原始異常或創建的日志的信息。
- Metric(度量):APM Agent 自動獲取基本的主機級別指標,包括系統和進程級別的CPU和內存指標。也可以獲取特定於代理的指標,例如Java Agent中的JVM指標和Go Agent中的Go運行時指標。
使用實踐
學習了上面的基本概念之后,是時候來波實踐了,接下來我們將使用Elastic APM來監控SpringBoot應用的性能信息。
安裝Elasticsearch和Kibana
安裝Elastic APM之前,我們需要先安裝好Elasticsearch和Kibana,具體參考《你居然還去服務器上撈日志,搭個日志收集系統難道不香么!》,注意使用7.6.2版本。
安裝APM Server
- 下載APM Server的安裝包,下載地址:www.elastic.co/cn/download…
- 下載完成后解壓到指定目錄;
- 修改配置文件
apm-server.yml
,修改下Elasticsearch的連接地址即可;
output.elasticsearch: hosts: ["localhost:9200"] 復制代碼
- 使用如下命令啟動APM Server即可,啟動成功APM Server將在
8200
端口運行;
apm-sever -e
復制代碼
- 在Kibana中檢測APM Server是否啟動成功,訪問地址:http://localhost:5601/app/kibana#/home/tutorial/apm
SpringBoot集成APM Agent
Java應用集成APM Agent的方式有三種,我們使用最簡單的方式,直接在應用中集成。
- 在
pom.xml
中添加相關依賴;
<!--Elastic Agent相關依賴--> <dependency> <groupId>co.elastic.apm</groupId> <artifactId>apm-agent-attach</artifactId> <version>1.17.0</version> </dependency> 復制代碼
- 在應用啟動類的
main
方法中添加Elastic APM的Attach API;
@SpringBootApplication public class MallTinyApplication { public static void main(String[] args) { ElasticApmAttacher.attach(); SpringApplication.run(MallTinyApplication.class, args); } } 復制代碼
- 在
resource
目錄下添加Elastic APM的配置文件elasticapm.properties
;
# 配置服務名稱 service_name=mall-tiny-apm # 配置應用所在基礎包 application_packages=com.macro.mall.tiny # 配置APM Server的訪問地址 server_urls=http://localhost:8200 復制代碼
- 在Kibana中檢測APM Agent是否啟動成功,訪問地址:http://localhost:5601/app/kibana#/home/tutorial/apm
查看性能監控信息
- 打開監控面板以后,可以發現我們的
mall-tiny-apm
服務已經存在了;
- 多次調用應用接口,即可查看到應用性能信息;
- 打開某個
Transaction
查看詳情,我們可以看到連SQL執行耗時信息都給我們統計好了;
- 不僅如此,打開執行查詢的
Span
查看詳情,連SQL語句都給我們收集好了;
- 在項目中添加一個有遠程調用接口,看看能不能收集到請求調用鏈路;
/** * 品牌管理Controller * Created by macro on 2019/4/19. */ @Api(tags = "PmsBrandController", description = "商品品牌管理") @Controller @RequestMapping("/brand") public class PmsBrandController { @ApiOperation("遠程調用獲取所有品牌信息") @RequestMapping(value = "/remoteListAll", method = RequestMethod.GET) @ResponseBody public CommonResult<List<PmsBrand>> remoteListAll() { //模擬耗時操作 ThreadUtil.sleep(1, TimeUnit.SECONDS); //遠程調用獲取數據 String response = HttpUtil.get("http://localhost:8088/brand/listAll"); JSONObject jsonObject = new JSONObject(response); JSONArray data = jsonObject.getJSONArray("data"); List<PmsBrand> brandList = data.toList(PmsBrand.class); return CommonResult.success(brandList); } } 復制代碼


- 發現完全可以,Elastic APM完全可以取代Sleuth+Zipkin來做微服務的請求鏈路跟蹤了;
- 使用我們之前
springcloud-learning
中的微服務調用案例,也是可以進行請求鏈路跟蹤的;
- 接下來我們人為制造一個異常,在方法中添加
int i=1/0;
即可,查看下收集到的異常信息;
- 再來看下應用主機的度量信息,非常全面,CPU、內存、JVM信息都有了,以后性能調優的時候可以看看!
總結
Elastic APM 完全可以取代Sleuth+Zipkin來做分布式請求鏈路追蹤,並且提供了數據庫及緩存調用時長的統計,很好很強大!不止於此,它還可以用來實時監控應用性能信息及度量指標,連錯誤日志也收集好了,是一款很好的應用性能監控工具!