微服務應用性能如何?APM監控工具來告訴你!


當微服務系統越來越龐大,各個服務間的調用關系也變得越來越復雜,需要一個工具來幫忙理清請求調用的服務鏈路。之前在《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.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來做分布式請求鏈路追蹤,並且提供了數據庫及緩存調用時長的統計,很好很強大!不止於此,它還可以用來實時監控應用性能信息及度量指標,連錯誤日志也收集好了,是一款很好的應用性能監控工具!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM