1. 程式人生 > 實用技巧 >微服務應用效能如何?APM監控工具來告訴你!

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