.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=//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 。

訪問 //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": "//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 的集成做到了幾乎零程式碼入侵,介面也非常友好。

演示項目地址

//github.com/kklldog/myhotel_microservice

相關文章

NET Core with 微服務 - 什麼是微服務
.Net Core with 微服務 - 架構圖
.Net Core with 微服務 - Ocelot 網關
.Net Core with 微服務 - Consul 註冊中心
.Net Core with 微服務 - Seq 日誌聚合

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