上一次我們介紹了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 日志聚合