如何在.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
相关产品推荐
相关产品推荐

