ABP vNext + Azure Application Insights:APM 监控与性能诊断最佳实践

ABP vNext + Azure Application Insights:APM 监控与性能诊断最佳实践 🚀


📚 目录

  • [ABP vNext + Azure Application Insights:APM 监控与性能诊断最佳实践 🚀](#ABP vNext + Azure Application Insights:APM 监控与性能诊断最佳实践 🚀)
    • [1️⃣ 集成目标与环境要求](#1️⃣ 集成目标与环境要求)
    • [2️⃣ 安装 SDK 与注入服务](#2️⃣ 安装 SDK 与注入服务)
    • [3️⃣ 日志与链路追踪整合](#3️⃣ 日志与链路追踪整合)
      • [🔥 系统流水线示意图](#🔥 系统流水线示意图)
      • [✅ ILogger 原生接入](#✅ ILogger 原生接入)
      • [✅ 手动埋点(TelemetryClient)](#✅ 手动埋点(TelemetryClient))
    • [4️⃣ 多租户与用户上下文注入](#4️⃣ 多租户与用户上下文注入)
    • [5️⃣ 后台任务中的链路恢复](#5️⃣ 后台任务中的链路恢复)
    • [6️⃣ 采样与 TelemetryChannel 调优](#6️⃣ 采样与 TelemetryChannel 调优)
      • [🎯 采样 (Sampling)](#🎯 采样 (Sampling))
      • [⚙ TelemetryChannel 调优](#⚙ TelemetryChannel 调优)
    • [7️⃣ 自定义指标与告警自动化](#7️⃣ 自定义指标与告警自动化)
    • [8️⃣ CLI 示例:创建告警](#8️⃣ CLI 示例:创建告警)
    • [9️⃣ 多环境与安全配置](#9️⃣ 多环境与安全配置)
    • [🔟 Azure Key Vault 集成示例](#🔟 Azure Key Vault 集成示例)
    • [1️⃣1️⃣ OpenTelemetry 混合方案](#1️⃣1️⃣ OpenTelemetry 混合方案)
    • [1️⃣2️⃣ 拓展建议](#1️⃣2️⃣ 拓展建议)
    • [✅ 参考文档](#✅ 参考文档)

1️⃣ 集成目标与环境要求

项目 最低版本
.NET SDK 6.0
ABP vNext 7.0
Application Insights Azure 实例 / Emulator
环境变量注入 APPLICATIONINSIGHTS_CONNECTION_STRING

💡 本地调试


2️⃣ 安装 SDK 与注入服务

bash 复制代码
dotnet add package Microsoft.ApplicationInsights.AspNetCore
csharp 复制代码
// Program.cs
builder.Services.AddApplicationInsightsTelemetry(options =>
{
    options.ConnectionString = builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"];
});
builder.Services.AddSingleton<TelemetryClient>();
builder.Logging.AddApplicationInsights();

3️⃣ 日志与链路追踪整合

🔥 系统流水线示意图

ABP 应用 ILogger ActivitySource ApplicationService / Controller BackgroundWorker TelemetryPipeline Application Insights SDK Azure Monitor / Log Analytics Dashboard / Alert Rules

✅ ILogger 原生接入

csharp 复制代码
public class OrderAppService : ApplicationService
{
    private readonly ILogger<OrderAppService> _logger;
    public OrderAppService(ILogger<OrderAppService> logger) => _logger = logger;
    public Task<string> PlaceOrder()
    {
        _logger.LogInformation("🛒 开始执行下单逻辑");
        return Task.FromResult("OK");
    }
}

✅ 手动埋点(TelemetryClient)

csharp 复制代码
public class OrderManager
{
    private readonly TelemetryClient _telemetry;
    public OrderManager(TelemetryClient telemetry) => _telemetry = telemetry;

    public void TrackLatency(long ms)
    {
        _telemetry.TrackMetric("OrderService.QueryOrder.LatencyMs", ms);
    }
}

4️⃣ 多租户与用户上下文注入

csharp 复制代码
public class AbpTelemetryInitializer : ITelemetryInitializer
{
    private readonly ICurrentUser _currentUser;
    public AbpTelemetryInitializer(ICurrentUser currentUser) => _currentUser = currentUser;

    public void Initialize(ITelemetry telemetry)
    {
        if (_currentUser.IsAuthenticated)
        {
            telemetry.Context.User.Id = _currentUser.Id?.ToString();
            telemetry.Context.Properties["TenantId"] = _currentUser.TenantId?.ToString();
        }
    }
}

// 注册
builder.Services.AddSingleton<ITelemetryInitializer, AbpTelemetryInitializer>();

5️⃣ 后台任务中的链路恢复

csharp 复制代码
using System.Diagnostics;

private static readonly ActivitySource BackgroundSource = new("AbpApp.BackgroundJobs");
public async Task ExecuteJobAsync()
{
    using var activity = BackgroundSource.StartActivity("SyncOrderTask");
    _telemetry.TrackTrace("🔄 执行后台同步订单", SeverityLevel.Information);
    // ...业务逻辑...
}

⚠️ 推荐使用 ActivitySource 以兼容 OpenTelemetry。


6️⃣ 采样与 TelemetryChannel 调优

🎯 采样 (Sampling)

csharp 复制代码
builder.Services.Configure<TelemetryConfiguration>(config =>
{
    config.DefaultTelemetrySink
          .TelemetryProcessorChainBuilder
          .UseSampling(percentage: 10)  // 10% 采样
          .Build();
});

⚙ TelemetryChannel 调优

csharp 复制代码
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.WindowsServer.Channel;

var channel = new ServerTelemetryChannel
{
    MaxTelemetryBufferCapacity = 500,
    FlushInterval = TimeSpan.FromSeconds(5)
};
builder.Services.AddSingleton<ITelemetryChannel>(channel);

7️⃣ 自定义指标与告警自动化

csharp 复制代码
// 上报慢 SQL 延迟
_telemetry.TrackMetric("Sql.Query.LatencyMs", elapsedMilliseconds);
kusto 复制代码
// Azure Monitor 告警查询示例
customMetrics
| where name == "Sql.Query.LatencyMs"
| summarize avg(value) by bin(timestamp, 5m)
| where avg_value > 300

8️⃣ CLI 示例:创建告警

bash 复制代码
az monitor metrics alert create   --name "HighSqlLatency"   --resource-group MyRG   --scopes /subscriptions/<sub>/resourceGroups/MyRG/providers/Microsoft.Insights/components/MyAI   --condition "avg CustomMetrics.Sql.Query.LatencyMs > 300"   --action /subscriptions/<sub>/resourceGroups/MyRG/providers/Microsoft.Web/sites/MyFunc/functions/RestartService

9️⃣ 多环境与安全配置

  • 禁止appsettings.json 明文保存连接串
  • ✅ 使用 环境变量Azure Key Vault
  • 📁 在 appsettings.{Development|Production}.json 中管理差异
json 复制代码
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning"
    }
  }
}

🔟 Azure Key Vault 集成示例

csharp 复制代码
using Azure.Identity;

builder.Configuration
       .AddAzureKeyVault(
           new Uri("https://<YourKeyVault>.vault.azure.net/"),
           new DefaultAzureCredential());

1️⃣1️⃣ OpenTelemetry 混合方案

csharp 复制代码
builder.Services.AddOpenTelemetryTracing(b =>
{
    b.AddAspNetCoreInstrumentation()
     .AddHttpClientInstrumentation()
     .AddSource("AbpApp.BackgroundJobs")
     .AddAzureMonitorTraceExporter(o =>
     {
         o.ConnectionString = builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"];
     });
});

OTEL + AI Trace OpenTelemetry SDK ASP.NET Core Azure Monitor Trace Exporter Azure Monitor


1️⃣2️⃣ 拓展建议

  • 🛠 自愈脚本:结合 Logic App、Function 或 Runbook
  • 📊 混合监控:Prometheus + Grafana + AI 混合可视化
  • 📈 性能对比:集成前后 QPS/延迟/成本评估
  • 🚀 CI/CD 集成:环境变量 & Key Vault 策略自动注入

✅ 参考文档

📘 Application Insights 文档

📘 ABP 日志扩展指南

相关推荐
考虑考虑25 分钟前
使用jpa中的group by返回一个数组对象
spring boot·后端·spring
今晚打老虎z27 分钟前
dotnet-env: .NET 开发者的环境变量加载工具
前端·chrome·.net
GiraKoo33 分钟前
【GiraKoo】C++11的新特性
c++·后端
MO2T38 分钟前
使用 Flask 构建基于 Dify 的企业资金投向与客户分类评估系统
后端·python·语言模型·flask
光溯星河1 小时前
【实践手记】Git重写已提交代码历史信息
后端·github
PetterHillWater1 小时前
Trae中实现OOP原则工程重构
后端·aigc
圆滚滚肉肉1 小时前
后端MVC(控制器与动作方法的关系)
后端·c#·asp.net·mvc
SimonKing1 小时前
拯救大文件上传:一文彻底彻底搞懂秒传、断点续传以及分片上传
java·后端·架构
深栈解码1 小时前
JUC并发编程 内存布局和对象头
java·后端
37手游后端团队1 小时前
巧妙利用装饰器模式给WebSocket连接新增持久化
后端