You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.NET APM Agent中创建自定义诊断订阅者监控耗时操作?

实现ASP.NET Core中耗时操作的性能监控(基于APM Agent/OpenTelemetry)

你可以通过OpenTelemetry或者主流APM Agent(如Elastic APM、New Relic)实现这类耗时操作的时间跨度监控,以下是具体实现方案:

一、基于OpenTelemetry的实现(推荐,标准化方案)

1. 安装依赖包

在项目中安装必要的NuGet包:

Install-Package OpenTelemetry.Extensions.Hosting
Install-Package OpenTelemetry.Instrumentation.AspNetCore
Install-Package OpenTelemetry.Exporter.Jaeger # 或其他你使用的后端导出器

2. 定义自定义ActivitySource

在项目中创建全局的ActivitySource实例:

public static class TelemetryConstants
{
    public static readonly ActivitySource FileProcessingSource = new("YourApp.FileProcessing");
}

3. 包裹耗时操作

在文件处理等耗时方法中,用自定义Activity包裹逻辑,自动生成时间跨度:

public async Task ProcessFileAsync(string filePath)
{
    // 启动自定义活动,指定操作名称
    using var activity = TelemetryConstants.FileProcessingSource.StartActivity("FileProcessing");
    
    // 添加自定义标签,便于后续排查
    activity?.SetTag("file.path", filePath);
    
    // 执行实际的文件处理逻辑
    await File.ReadAllTextAsync(filePath);
    // ...其他耗时操作
}

4. 配置OpenTelemetry

在Program.cs中配置追踪,整合已有监控(Http、EF Core、Redis)和自定义活动:

builder.Services.AddOpenTelemetry()
    .WithTracing(tracerProviderBuilder =>
    {
        tracerProviderBuilder
            .AddAspNetCoreInstrumentation() // 已有Http监控
            .AddEfCoreInstrumentation() // 已有EF Core监控
            .AddRedisInstrumentation() // 已有Redis监控(需对应包)
            .AddSource(TelemetryConstants.FileProcessingSource.Name) // 加入自定义活动源
            .AddJaegerExporter(options =>
            {
                options.AgentHost = "your-jaeger-host";
                options.AgentPort = 6831;
            });
    });

配置完成后,OpenTelemetry会自动将文件处理的时间跨度与请求链路绑定,在监控后端(如Jaeger、Grafana Tempo)中就能看到类似截图的请求时间线,包含所有操作的耗时分布。

二、基于APM Agent的实现(以Elastic APM为例)

1. 安装依赖包

Install-Package Elastic.Apm.AspNetCore

2. 配置APM Agent

在appsettings.json中添加APM配置:

{
  "ElasticApm": {
    "ServiceName": "YourWebApi",
    "ServerUrl": "http://your-apm-server:8200",
    "SecretToken": "your-token"
  }
}

3. 手动创建监控跨度

在文件处理方法中,手动创建Span来记录耗时:

using Elastic.Apm.Api;

public async Task ProcessFileAsync(string filePath)
{
    // 从当前事务中启动新的Span
    var span = Agent.Tracer.CurrentTransaction.StartSpan(
        name: "FileProcessing",
        type: ApiConstants.TypeExternal // 或自定义类型,如"file.processing"
    );
    
    try
    {
        span.Context.SetLabel("file.path", filePath);
        // 执行文件处理逻辑
        await File.ReadAllTextAsync(filePath);
        // ...其他操作
    }
    finally
    {
        span.End(); // 结束Span,记录耗时
    }
}

Elastic APM会自动将这个Span整合到请求的完整链路中,在Kibana的APM面板里就能看到每个请求下文件处理的耗时、调用顺序,和你期望的截图效果一致。

内容的提问来源于stack exchange,提问作者Navid_pdp11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 23:42:42