ABP VNext + Elastic APM:微服務性能監控

ABP VNext + Elastic APM:微服務性能監控 🚀


📚目錄

  • ABP VNext + Elastic APM:微服務性能監控 🚀
    • 一、引言 ?
      • 架構全景圖 🏗?
    • 二、環境與依賴 📦
    • 三、APM 服務器與 Kibana 快速部署 🐳
      • Docker 網絡示意圖
    • 四、在 ABP VNext 中集成 Elastic APM .NET Agent ??
      • 4.1 安裝與注冊
        • 配置來源
      • 4.2 ABP 模塊中注冊中間件與標簽
      • 4.3 自動采集范圍
      • 4.4 URL 過濾 🚫
    • 五、自定義打點與標簽 🎯
    • 六、日志關聯 📝
      • 6.1 Serilog
      • 6.2 Microsoft.Extensions.Logging / NLog
    • 七、Kibana APM 儀表盤構建 📊
      • 7.1 創建儀表盤(Dashboard)
      • 7.2 Transaction 概覽
        • 響應時間分布(95th/99th 百分位)
        • 吞吐量(TPS)
      • 7.3 服務依賴圖(Service Map)
      • 7.4 錯誤監控
        • Error rate
        • 異常類型聚合
      • 7.5 原始 Trace 搜索
      • 7.6 告警與通知
    • 八、性能影響與采樣策略 ??
      • 8.1 配置示例(`appsettings.json`)
      • 8.2 性能調優要點
      • 8.3 微基準測試
    • 九、端到端演示示例 🎬
    • 參考文檔 📖


一、引言 ?

TL;DR

  • 🕵? 使用 Elastic.Apm.NetCoreAll 自動采集 HTTP、數據庫、外部調用與錯誤性能指標
  • ?? 支持環境變量與 appsettings.json 雙重配置,零侵入式集成到 ABP VNext 微服務
  • 🔗 在 ABP 模塊生命周期中注冊 APM 中間件,并注入租戶與用戶標簽(SetLabel API)
  • 📊 日志框架(Serilog、NLog、Microsoft.Extensions.Logging)一鍵關聯 TraceId/TransactionId
  • 🧪 完整示例覆蓋 URL 過濾、自定義 Span、微基準測試與性能調優

背景與動機
在微服務架構下,跨服務調用鏈長、性能瓶頸定位困難。Elastic APM 提供從事務到 Span、從代碼層到基礎設施的一體化可觀察方案,能幫助我們在 Kibana 中實時查看響應分布、調用拓撲與錯誤熱點。結合 ABP VNext 的模塊化與多租戶能力,可快速搭建高性能、可復現的 APM 監控流水線。

架構全景圖 🏗?

應用
服務集群
HTTP/gRPC + TLS
HTTP/gRPC + TLS
gRPC/TCP
HTTP
HTTP
Elastic APM Agent
OrderService-1
OrderService-2
APM Server
Elasticsearch
Kibana APM UI

二、環境與依賴 📦

  • 平臺版本

    • .NET 7/8
    • ABP VNext 7.x
  • Elastic Stack

    • Elasticsearch ≥ 8.x
    • Kibana ≥ 8.x(內置 APM 應用)
    • APM Server ≥ 8.x
  • NuGet 包

    • Elastic.Apm.NetCoreAll —— 包含 HTTP、EF Core、SqlClient、Redis 等默認自動打點功能

    • 可選:

      • Elastic.Apm.EntityFrameworkCore(EF Core 細粒度支持)
      • Elastic.Apm.SqlClient(針對 MySQL.Data 或其他 ADO.NET 驅動的拓展)
      • Elastic.Apm.SerilogEnricher(Serilog 日志追蹤關聯)
      • Elastic.Apm.Extensions.Logging(Microsoft.Extensions.Logging 關聯)

三、APM 服務器與 Kibana 快速部署 🐳

version: '3'
services:elasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:8.5.0environment:- discovery.type=single-nodeports: ["9200:9200"]kibana:image: docker.elastic.co/kibana/kibana:8.5.0ports: ["5601:5601"]apm-server:image: docker.elastic.co/apm/apm-server:8.5.0depends_on: ["elasticsearch"]ports: ["8200:8200"]command: >apm-server -e-E output.elasticsearch.hosts=["elasticsearch:9200"]

執行 docker-compose up -d 后,訪問 http://localhost:5601/app/apm 確認 APM 界面可用。

Docker 網絡示意圖

Docker Host
Elasticsearch:9200
APM Server:8200
Kibana:5601

四、在 ABP VNext 中集成 Elastic APM .NET Agent ??

4.1 安裝與注冊

dotnet add package Elastic.Apm.NetCoreAll
dotnet add package Elastic.Apm.SerilogEnricher
dotnet add package Elastic.Apm.Extensions.Logging
配置來源
  • 環境變量(優先級最高)

    export ELASTIC_APM_SERVER_URLS=http://localhost:8200
    export ELASTIC_APM_SERVICE_NAME=OrderService
    export ELASTIC_APM_ENVIRONMENT=production
    export ELASTIC_APM_TRANSACTION_SAMPLE_RATE=1.0
    
  • appsettings.json

    "ElasticApm": {"ServerUrls": "http://localhost:8200","ServiceName": "OrderService","Environment": "production","TransactionSampleRate": 1.0
    }
    

    Program.cs 中使用:

    builder.Services.AddAllElasticApm(builder.Configuration);
    

4.2 ABP 模塊中注冊中間件與標簽

public class OrderWebModule : AbpModule
{public override void OnApplicationInitialization(ApplicationInitializationContext context){var app = context.GetApplicationBuilder();// 1) 注入 APM 中間件app.UseElasticApm(context.GetConfiguration());// 2) 全局標簽注入:租戶 & 用戶Agent.Tracer.Subscribe(new LabelSubscriber(span =>{var tenant = context.ServiceProvider.GetService<ICurrentTenant>()?.Id?.ToString();var user   = context.ServiceProvider.GetService<ICurrentUser>()?.Id?.ToString();if (span is Transaction txn){txn.SetLabel("tenantId", tenant);txn.SetLabel("userId",   user);}}));// 3) ABP 默認管道app.UseAbpRequestLocalization();app.UseRouting();app.UseAuthentication();app.UseAuthorization();app.UseConfiguredEndpoints();}
}

💡 使用 SetLabelLabelSubscriber,保證線程安全與一致性。

4.3 自動采集范圍

  • HTTP/gRPC:自動創建 Transaction;
  • SQL 調用:跟蹤 System.Data.SqlClient / Microsoft.Data.SqlClient(含 Dapper) ;
  • 其他 ADO.NET 驅動:可引入 Elastic.Apm.SqlClient 或 Profiler 模式;
  • 外部 HTTPHttpClient 自動跟蹤;
  • 未捕獲異常:自動上報 Error。

4.4 URL 過濾 🚫

"ElasticApm": {"TransactionIgnoreUrls": "/health*,/metrics*"
}

五、自定義打點與標簽 🎯

using Elastic.Apm;
using Elastic.Apm.Api;// 自定義事務
using var transaction = Agent.Tracer.StartTransaction("ProcessOrder", "order");try
{// 業務邏輯
}
catch (Exception ex)
{// 捕獲并上報異常Agent.Tracer.CurrentTransaction?.CaptureException(ex);throw;
}// 自定義 Span
transaction.CaptureSpan("CallPaymentGateway", "external", () =>
{// 第三方支付調用
});// 額外標簽
transaction.SetLabel("orderType", "Express");

💡 僅在關鍵路徑添加 Span,避免過度細分導致存儲與性能壓力。


六、日志關聯 📝

6.1 Serilog

using Serilog;
using Elastic.Apm.SerilogEnricher;Log.Logger = new LoggerConfiguration().Enrich.WithElasticApmCorrelationInfo().WriteTo.Console(outputTemplate: "[{ElasticApmTraceId} {ElasticApmTransactionId}] {Message:lj}{NewLine}{Exception}").CreateLogger();builder.Host.UseSerilog();

6.2 Microsoft.Extensions.Logging / NLog

builder.Logging.AddConsole().AddConfiguration(builder.Configuration.GetSection("Logging")).AddElasticApm(builder.Configuration);

📑 日志中包含 TraceId/TransactionId,便于跨系統日志與調用鏈關聯


七、Kibana APM 儀表盤構建 📊

7.1 創建儀表盤(Dashboard)

  1. 在 Kibana 左側菜單中,依次點擊 “Dashboard” → “Create dashboard”
  2. 點擊 “Create new visualization”,選擇 “Lens” 作為可視化工具。

7.2 Transaction 概覽

響應時間分布(95th/99th 百分位)
  1. 在 Lens 中選擇 APM transaction duration 指標。
  2. transaction.duration.us 拖到縱軸,設置聚合方式為 Percentile,并在右側設置 Percentiles95,99
  3. 保存為 “響應時間分布(P95/P99)”,添加到 Dashboard。
吞吐量(TPS)
  1. 在 Lens 中選擇 APM transactions per minute(或用 count 并按分鐘做 X 軸)。
  2. 拖拽 @timestamp 到橫軸,聚合方式設為 Date histogram(interval: auto)
  3. 拖拽 transaction.id 計數到縱軸(Count)。
  4. 保存為 “每分鐘吞吐量 (TPS)”,添加到 Dashboard。

7.3 服務依賴圖(Service Map)

  1. 在 Kibana 左側菜單點擊 “Observability” → “Service map”
  2. 選擇目標服務(如 OrderService),即可看到上下游依賴拓撲。
  3. 可切換時間范圍和環境過濾標簽,查看不同環境下的調用鏈。

7.4 錯誤監控

Error rate
  1. 新建 Visualization,選擇 Lens
  2. 拖拽 Error count(apm.error.count)到縱軸,橫軸同樣用 Date histogram。
  3. 再拖一個 Transaction count(apm.transaction.duration.count),使用 Formula 計算 errors / transactions
  4. 保存為 “錯誤率(Error rate)”
異常類型聚合
  1. 在 Lens 中,選擇 apm.error.exception.type 作為分組字段(Break down by)。
  2. 縱軸用 Count of errors
  3. 保存為 “異常類型分布”

7.5 原始 Trace 搜索

  1. 點擊左側 “Observability” → “APM” → “Traces”
  2. 在上方搜索框輸入標簽或 transaction.id:<ID>,點擊 Search
  3. 瀏覽單次調用鏈,查看各個 Span 的詳細耗時和堆棧。

7.6 告警與通知

  1. 在 Kibana 菜單中選擇 “Alerting” → “Create rule”
  2. 規則類型選擇 “APM transaction duration threshold”
  3. 配置閾值(如平均響應時間 > 500 ms)、時間窗口和觸發條件。
  4. 添加動作(Email、Slack、Webhook 等)并啟用規則。
  5. 在 Dashboard 中可以直接用 “Add panel” 引入告警狀態監控。

八、性能影響與采樣策略 ??

8.1 配置示例(appsettings.json

"ElasticApm": {"TransactionSampleRate": 0.2,"SpanStackTraceMinDuration": "10ms","StackTraceLimit": 200,"CaptureBody": "errors","SanitizeFieldNames": ["password"],"TransactionIgnoreUrls": "/health*,/metrics*"
}

8.2 性能調優要點

  • 🔽 降低采樣率可顯著提升吞吐與減少資源占用
  • 🔧 調整堆棧閾值可降低內存與 GC 壓力

8.3 微基準測試

[MemoryDiagnoser]
public class ApmSamplingBenchmark
{private readonly HttpClient _client = new();[Params(1.0, 0.5, 0.2)]public double SampleRate;[GlobalSetup]public void Setup(){Environment.SetEnvironmentVariable("ELASTIC_APM_TRANSACTION_SAMPLE_RATE",SampleRate.ToString());// 重啟應用后執行 Benchmark}[Benchmark]public async Task CallOrderApi() =>await _client.GetAsync("https://localhost:5001/api/orders");
}

CI 跑分,僅供參考

SampleRate吞吐 (ops/s)內存 (MB)覆蓋率 (%)
1.05200155100
0.5610012580
0.273009840

九、端到端演示示例 🎬

HTTP/gRPC + TLS
gRPC/TCP
HTTP
HTTP
ABP 微服務
Elastic APM Agent
APM Server
Elasticsearch
Kibana APM UI
  1. 🚀 啟動微服務集群與 Elastic Stack
  2. 🔄 調用下單接口,觸發數據庫與外部 HTTP
  3. 📈 在 Kibana 查看事務、錯誤與調用鏈
  4. 🐌 模擬慢查詢與異常,驗證告警與過濾規則

參考文檔 📖

  • ABP VNext 官方文檔
  • Elastic APM .NET Agent 快速上手
  • Elastic APM .NET Agent Serilog 集成
  • Elastic APM .NET Agent Logging 集成
  • APM Server 安裝與配置
  • Kibana APM 使用概覽
  • BenchmarkDotNet 入門指南
  • Elasticsearch 索引生命周期管理(ILM)
  • Docker Compose 快速入門 Elastic Stack

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916855.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916855.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916855.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

單片機學習筆記.AD/DA(略含有SPI,用的是普中開發板上的XPT2046芯片)

AD/DA基礎知識 硬件電路&#xff1a; 模電運放知識回顧&#xff1a; 虛短&#xff08;Virtual Short&#xff09;定義&#xff1a;運放同相輸入端&#xff08;&#xff09;和反相輸入端&#xff08;-&#xff09;的電位近似相等&#xff0c;即V V-&#xff0c;仿佛兩個輸入端短…

避坑指南:VMware安裝CentOS常見錯誤及完美解決方案

1. 引言 虛擬機允許在同一臺機子上有不同的操作系統&#xff0c;還可以用于搭建實驗環境、軟件測試和兼容性測試等。我是主攻大數據方向的會用到Linux操作系統&#xff0c;所以虛擬機對我來說是很有必要的。我把之前的筆記和安裝包整理了一下&#xff0c;就有了現在這個教程。…

Python爬蟲04_Requests豆瓣電影爬取

一、 爬取豆瓣電影排行榜數據 import requests import json url ‘https://movie.douban.com/j/chart/top_list’ param { ‘type’:‘24’, ‘interval_id’:‘100:90’, ‘action’:‘’, ‘start’:‘0’, #從庫中的第幾部電影去取 ‘limit’:‘20’, } headers { ‘Use…

工業物聯網模塊運營指南?

一、運營目標 工業物聯網模塊運營的核心目標在于通過高效運作,實現提高工業設備運行效率、降低生產成本、推動生產過程智能化管理,進而提升企業的整體競爭力。這一目標是后續所有運營工作的出發點和落腳點,為各項運營環節提供方向指引。 二、關鍵運營環節及做法 (一)設…

9.項目起步(3)

1項目起步-靜態資源初始化 和 Error Lens 安裝圖片資源和樣式資源error lens 安裝2項目起步-scss文件自動導入為什么要自動導入自動導入配置scss變量自動導入$xtxColor: #27ba9b; $helpColor: #e26237; $sucColor: #1dc779; $warnColor: #ffb302; $priceColor: #cf4444;css: {p…

MCP提示詞工程:上下文注入的藝術與科學

MCP提示詞工程&#xff1a;上下文注入的藝術與科學 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#xff0c;每一個特性都是我放飛的蝴蝶…

字節跳動GR-3:可泛化、支持長序列復雜操作任務的機器人操作大模型(技術報告解讀)

1.總結 GR-3 是一個大規模的視覺 - 語言 - 動作&#xff08;VLA&#xff09;模型。它對新物體、新環境以及含抽象概念的新指令展現出較好的泛化能力。此外&#xff0c;GR-3 支持少量人類軌跡數據的高效微調&#xff0c;可快速且經濟地適應新任務。GR-3 在處理長周期和靈巧性任…

713. 乘積小于 K 的子數組

中等 給你一個整數數組 nums 和一個整數 k &#xff0c;請你返回子數組內所有元素的乘積嚴格小于 k 的連續子數組的數目。 示例 1&#xff1a; 輸入&#xff1a;nums [10,5,2,6], k 100 輸出&#xff1a;8 解釋&#xff1a;8 個乘積小于 100 的子數組分別為&#xff1a;[10…

【算法】 SM2、FSRS、SuperMemo算法實現艾賓浩斯記憶曲線,通過以上算法你也可以開發出單詞記憶軟件

有那些算法可以實現艾賓浩斯單詞記憶 用戶: 有那些算法可以實現艾賓浩斯單詞記憶 元寶: 以下是基于 艾賓浩斯遺忘曲線 的智能記憶算法實現方案&#xff0c;結合 間隔重復算法 與 現代機器學習技術&#xff0c;提供從理論到實踐的完整解決方案&#xff1a; 一、核心算法原理 1. …

SQL167 連續簽到領金幣

SQL167 連續簽到領金幣 題目描述 用戶行為日志表 tb_user_log iduidartical_idin_timeout_timesign_in110102021-07-07 10:00:002021-07-07 10:00:091210102021-07-08 10:00:002021-07-08 10:00:091310102021-07-09 10:00:002021-07-09 10:00:42141010 2021-07-10 10:00:00 …

PHP性能優化與高并發處理:從基礎到高級實踐

引言 在當今高流量的互聯網環境中,PHP應用的性能優化變得至關重要。本文將全面探討PHP性能優化的各個層面,從基礎優化技巧到高級并發處理方案,幫助開發者構建高性能的PHP應用。 基礎性能優化 OPcache配置優化 ; php.ini 推薦OPcache配置 [opcache] opcache.enable=1 opc…

C++ std::map erase() 和迭代器詳解:常見面試陷阱與深入理解

在使用 C 的 std::map 時&#xff0c;配合 erase() 和迭代器的使用是一個經典面試點&#xff0c;也是實際開發中經常出錯的地方。本文將深入講解 erase() 的行為、end() 的本質以及迭代器失效規則&#xff0c;幫助你寫出更健壯的代碼。1. erase(it) 的行為當你使用 erase(it) 刪…

求職招聘小程序源碼搭建招聘小程序開發定制人力資源系統

身份&#xff1a;求職者、企業求職者&#xff1a;完善簡歷&#xff0c;簡歷投遞企業&#xff1a;企業入駐&#xff0c;查看簡歷企業會員&#xff1a;半年 、年度 權益&#xff1a;每日發布條數、刷新條數&#xff0c;簡歷下載數量聊天&#xff1a;求職者可以和企業聊天招聘會…

【31】C# WinForm入門到精通 ——保存文件SaveFileDialog 【屬性、方法、事件、實例、源碼】

WinForm 是 Windows Form 的簡稱&#xff0c;是基于 .NET Framework 平臺的客戶端&#xff08;PC軟件&#xff09;開發技術&#xff0c;是 C# 語言中的一個重要應用。 .NET 提供了大量 Windows 風格的控件和事件&#xff0c;可以直接拿來使用。 本專欄內容是按照標題序號逐漸…

socket網絡編程(1)

socket網絡編程&#xff08;1&#xff09; 設計echo server進行接口使用 生成的Makefile文件如下 .PHONY:all all:udpclient udpserverudpclient:UdpClient.ccg -o $ $^ -stdc17 -static udpserver:UdpServer.ccg -o $ $^ -stdc17.PHONY:clean clean:rm -f udpclient udpserver…

數據集:機器學習的基石

三、數據集&#xff1a;機器學習的基石1. sklearn 玩具數據集&#xff1a;快速入門的理想選擇1.1 玩具數據集的特點與價值sklearn 內置的玩具數據集&#xff08;Toy Datasets&#xff09;是機器學習入門的絕佳資源。這類數據集通常具有以下特點&#xff1a;數據量小&#xff1a…

SQL排查、分析海量數據以及鎖機制

1. SQL排查 1.1 慢查詢日志: mysql提供的一種日志記錄, 用戶記錄MySQL中響應時間超過閾值的SQL語句(long_query_time, 默認10秒), 慢查詢日志默認是關閉的, 建議開發調優時打開, 最終部署的時候關閉 1.1.1 檢查是否開啟了慢查詢日志 show variables like %slow_query_log%;臨…

conda 安裝prokka教程

本章教程,記錄如何在wsl2+ubuntu下載通過conda安裝prokka軟件包。 Prokka 是一個快速的、功能強大的基因組注釋工具,特別適用于細菌基因組的注釋。它能夠自動化完成從基因組序列到功能注釋的整個流程,包括基因的識別、功能預測和注釋,并且支持多種文件格式輸出,廣泛應用于…

CSS3 圓角

CSS3 圓角 引言 CSS3圓角是現代網頁設計中非常重要的一項功能&#xff0c;它使得網頁元素的外觀更加平滑、美觀。本文將詳細介紹CSS3圓角的概念、實現方法以及相關屬性&#xff0c;幫助您更好地掌握這一技巧。 CSS3圓角概念 CSS3圓角指的是通過CSS3屬性為元素&#xff08;如div…

牛頓-拉夫森法求解非線性方程組

牛頓-拉夫森法&#xff08;Newton-Raphson method&#xff09;是一種用于求解非線性方程組的迭代方法。該方法通過線性化非線性方程組&#xff0c;并逐步逼近方程組的解。以下是牛頓-拉夫森法求解非線性方程組的詳細步驟和MATLAB實現。 1. 牛頓-拉夫森法的基本原理 對于非線性方…