上一次我們介紹了Seq日誌聚合元件。這次要給大家介紹的是Elastic APM ,一款應用程式效能監控元件。APM 監控圍繞對應用、服務、容器的健康監控,對介面的呼叫鏈、效能進行監控。在我們實施微服務後,由於複雜的業務邏輯,服務之間的呼叫會像蜘蛛網一樣複雜。有了呼叫鏈監控後服務之間的呼叫可以用影象的方式展示出來,每個請求的效能,響應等都會記錄下來。對於提前防範問題,以及排查問題有非常大的意義。
Elastic APM
大家對 ELK 套件一定非常熟悉。ELastic APM 同樣也是 Elastic 系列產品的一個元件。Elastic APM 是一款免費開源的應用程式效能監控元件。它底層依賴 Elasticsearch 來儲存跟查詢資料,使用 Kibana 來展示分析資料。它支援多種程式語音的探針,包括 JAVA,.NET, Nodejs 等語音。對於 .NET 的整合非常方便,只要簡單的配置就可以採集 .NET 程式的資訊,對程式碼幾乎是零入侵。
Elastic APM 的架構由4個部分組成。
- Elasticsearch 負責資料的持久化,查詢等能力
- Kibana APM資料的分析展示介面
- APM Agent 每個服務整合對應的 sdk 後就是一個個 agent,負責採集程式的各種指標資料
- APM Server ,agent 採集到資料後會上報給 APM Server ,由APM Server彙集資料後儲存到 Elasticsearch 。
使用 docker-compose 安裝
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.13.2
restart: always
container_name: elasticsearch
hostname: elasticsearch
environment:
- discovery.type=single-node
ports:
- 9200:9200
- 9300:9300
kibana:
image: docker.elastic.co/kibana/kibana:7.13.2
restart: always
container_name: kibana
hostname: kibana
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- 5601:5601
depends_on:
- elasticsearch
apm_server:
image: docker.elastic.co/apm/apm-server:7.13.2
restart: always
container_name: apm_server
hostname: apm_server
command: --strict.perms=false -e
environment:
- output.elasticsearch.hosts=["elasticsearch:9200"]
ports:
- 8200:8200
depends_on:
- kibana
- elasticsearch
使用 docker-compose 來安裝 Elastic APM 。Elastic APM 依賴 elasticsearch kibana,所以 docker-compose 檔案需要定義3個service。其中 apm_server 定義depends_on: kibana,elasticsearch 。
訪問 http://localhost:5601 出現 kabina 介面。點選"Add Data" 出現新增 Apm Server 指引。
滾動到最後,點選 "Check APM Server Status "。
如果出現 “You have correctly setup APM Server” 的提示,說明我們的APM Server安裝成功了。
在 ASP.NET Core 整合 Elastic APM
Install-Package Elastic.Apm.NetCoreAll
使用 nuget 來安裝 Elastic APM 的sdk包。在 nuget 上搜索 Elastic apm 會出現多個包,這裡選擇 Elastic.Apm.NetCoreAll 包。
"ElasticApm": {
"ServerUrls": "http://192.168.18.164:8200", //Set custom APM Server URL
"ServiceName": "ordering_service", //allowed characters: a-z, A-Z, 0-9, -, _, and space. Default is the entry assembly of the application
"Environment": "dev" // Set the service environment
}
在 appsettings.json 檔案內新增一個 ElasticApm 節點。
- ServerUrls:apm server 地址
- ServiceName: 服務的名稱
- Environment:環境
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseAllElasticApm(Configuration);
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
在 startup 類的 Configure 方法的頂部注入 ElasticApm 的中介軟體。這樣 Elastic APM 就跟 asp.net core 整合好了,整個過程還是很方便的。
檢視 Kibana UI
我們把幾個示例專案整合後之後執行起來,隨便訪問幾個http介面。
開啟 kibana 介面,點選選單 “APM” 。
可以看到我們3個服務已經出現在服務列表裡面。列表上顯示了環境,TPM等資訊。
點選 “Traces” 標籤,這裡就會列出剛才所有的請求列表。
隨便點選一個服務,會出現這個服務的詳細資訊,顯示了併發情況,延遲情況,已經請求的歷史。
檢視呼叫鏈
在微服務架構下,服務之間的呼叫是非常複雜的。這給我們排錯的時候帶來非常大的壓力。現在有了 APM 可以幫我們改進這個問題。Elastic APM 可以幫我們顯示每個請求的呼叫鏈情況。
以我們訂單服務的獲取訂單詳情介面為例。我們找到/order/OD001 這個請求,點選展示它的明細資訊。可以看到這個請求裡面包含了另外兩次呼叫。第一次是訪問Consul獲取會員服務的地址,第二次是訪問會員服務獲取會員明細資訊。點選每一次請求,裡面都有詳細的元資料。這為我們除錯,排錯,監控帶來了非常大的便利。
Metrics 指標
這個頁面展示了服務的硬體指標,主要是顯示了CPU,記憶體利用率。
總結
我們通過以上內容,介紹了什麼是Elastic APM ,如何安裝Elastic APM,如何在 ASP.NET Core 程式裡整合 Elastic APM 的 sdk ,以及簡單介紹了 Kibana 上的展示資訊,特別是服務呼叫鏈的內容。可以看到Elastic APM 還是非常不錯的一款 APM 元件,特別是對 ASP.NET Core 的整合做到了幾乎零程式碼入侵,介面也非常友好。
演示專案地址
https://github.com/kklldog/myhotel_microservice
相關文章
NET Core with 微服務 - 什麼是微服務
.Net Core with 微服務 - 架構圖
.Net Core with 微服務 - Ocelot 閘道器
.Net Core with 微服務 - Consul 註冊中心
.Net Core with 微服務 - Seq 日誌聚合