1. 程式人生 > 其它 >.Net Core with 微服務 - Elastic APM

.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 日誌聚合

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