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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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. 牛顿-拉夫森法的基本原理 对于非线性方…