微服務應用效能如何?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的安裝包,下載地址: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來做分散式請求鏈路追蹤,並且提供了資料庫及快取呼叫時長的統計,很好很強大!不止於此,它還可以用來實時監控應用效能資訊及度量指標,連錯誤日誌也收集好了,是一款很好的應用效能監控工具!