.Net Core with 微服務 - Elastic APM


上一次我們介紹了Seq日志聚合組件。這次要給大家介紹的是Elastic APM ,一款應用程序性能監控組件。APM 監控圍繞對應用、服務、容器的健康監控,對接口的調用鏈、性能進行監控。在我們實施微服務后,由於復雜的業務邏輯,服務之間的調用會像蜘蛛網一樣復雜。有了調用鏈監控后服務之間的調用可以用圖像的方式展示出來,每個請求的性能,響應等都會記錄下來。對於提前防范問題,以及排查問題有非常大的意義。

Elastic APM

大家對 ELK 套件一定非常熟悉。ELastic APM 同樣也是 Elastic 系列產品的一個組件。Elastic APM 是一款免費開源的應用程序性能監控組件。它底層依賴 Elasticsearch 來存儲跟查詢數據,使用 Kibana 來展示分析數據。它支持多種程序語音的探針,包括 JAVA,.NET, Nodejs 等語音。對於 .NET 的集成非常方便,只要簡單的配置就可以采集 .NET 程序的信息,對代碼幾乎是零入侵。

Elastic APM 的架構由4個部分組成。

  1. Elasticsearch 負責數據的持久化,查詢等能力
  2. Kibana APM數據的分析展示界面
  3. APM Agent 每個服務集成對應的 sdk 后就是一個個 agent,負責采集程序的各種指標數據
  4. 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 日志聚合

關注我的公眾號一起玩轉技術


免責聲明!

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



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