.NET 4.7.2下ASP.NET MVC中Open Telemetry后续实现咨询
一、跟踪(Traces)实现
1. 完善自动 instrumentation
确保已安装OpenTelemetry.Instrumentation.AspNet包,在Global.asax.cs的Application_Start中,给TracerProviderBuilder添加AspNet跟踪支持:
var tracerProvider = Sdk.CreateTracerProviderBuilder() .AddAspNetInstrumentation() // 自动捕获ASP.NET请求跟踪 // 后续添加导出器 .Build();
2. 手动添加业务跟踪
如果需要自定义业务链路,获取Tracer后创建Span:
// 在控制器或业务类中 var tracer = TracerProvider.Default.GetTracer("MyAspNetMvcApp"); using (var span = tracer.StartActiveSpan("ProcessOrder")) { // 标记业务属性 span.SetAttribute("OrderId", orderId.ToString()); // 嵌套子Span using (var validateSpan = tracer.StartActiveSpan("ValidateOrder")) { // 执行订单验证逻辑 } }
3. 自动捕获依赖调用
安装对应依赖的instrumentation包(如OpenTelemetry.Instrumentation.SqlClient、OpenTelemetry.Instrumentation.Http),并在TracerProvider中启用:
.AddSqlClientInstrumentation() // 自动捕获SQL调用 .AddHttpClientInstrumentation() // 自动捕获HTTP请求
二、指标(Metrics)实现
1. 启用ASP.NET内置指标
安装OpenTelemetry.Instrumentation.AspNet(已包含指标支持),在Global.asax.cs中初始化MeterProvider:
var meterProvider = Sdk.CreateMeterProviderBuilder() .AddAspNetInstrumentation() // 自动收集ASP.NET请求指标(如请求耗时、成功率) .AddMeter("MyApp.CustomMetrics") // 注册自定义指标的Meter // 后续添加导出器 .Build();
记得在Application_End中调用meterProvider.Dispose()释放资源。
2. 自定义业务指标
创建Meter和指标实例,在业务逻辑中上报:
// 全局静态实例 private static readonly Meter _customMeter = new Meter("MyApp.CustomMetrics", "1.0.0"); private static readonly Counter<int> _processedOrdersCounter = _customMeter.CreateCounter<int>( "orders.processed_total", description: "Total number of processed orders"); // 在业务代码中调用 _processedOrdersCounter.Add(1, new KeyValuePair<string, object>("OrderSource", "Web"));
三、日志(Logs)实现
1. 集成ASP.NET日志系统
安装OpenTelemetry.Extensions.Logging和对应导出器包,在Global.asax.cs中配置LoggerFactory:
var loggerFactory = LoggerFactory.Create(builder => { builder.AddOpenTelemetry(options => { options.AddAspNetInstrumentation(); // 自动关联日志到当前Trace // 后续添加导出器 }); }); // 可将loggerFactory注入控制器,或集成现有日志框架(如Log4net、NLog)
2. 自定义日志记录
使用ILogger记录日志,OpenTelemetry会自动附加TraceId/SpanId:
public class HomeController : Controller { private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger) { _logger = logger; } public ActionResult Index() { _logger.LogInformation("Handling Index request | TraceId: {TraceId}", Activity.Current?.TraceId.ToString()); return View(); } }
四、导出到后端服务
1. Azure Monitor
安装包
OpenTelemetry.Exporter.AzureMonitor
配置Traces导出
.AddAzureMonitorTraceExporter(options => { options.ConnectionString = "InstrumentationKey=YOUR_KEY;IngestionEndpoint=https://YOUR_REGION.in.applicationinsights.azure.com/"; })
配置Metrics导出
.AddAzureMonitorMetricExporter(options => { options.ConnectionString = "YOUR_CONNECTION_STRING"; })
配置Logs导出
options.AddAzureMonitorLogExporter(options => { options.ConnectionString = "YOUR_CONNECTION_STRING"; })
2. Jaeger
安装包
OpenTelemetry.Exporter.Jaeger
配置Traces导出(Agent模式)
.AddJaegerExporter(options => { options.AgentHost = "localhost"; // Jaeger Agent地址 options.AgentPort = 6831; // 默认UDP端口 // 若用Collector HTTP端点,替换为: // options.Endpoint = new Uri("http://localhost:14268/api/traces"); })
注:Jaeger主要支持Traces,Metrics可通过OpenTelemetry Prometheus Exporter导出,再由Jaeger抓取Prometheus数据。
3. Geneva(Microsoft)
安装包
Microsoft.OpenTelemetry.Exporter.Geneva
配置Traces导出
.AddGenevaTraceExporter(options => { options.ConnectionString = "EtwSession=OpenTelemetry"; // ETW会话模式,或用TCP端点 // options.Endpoint = "tcp://your-geneva-collector:port"; options.PrepopulatedFields.Add("cloud.role", "MyAspNetMvcApp"); // 标记服务角色 })
配置Metrics导出
.AddGenevaMetricExporter(options => { options.ConnectionString = "EtwSession=OpenTelemetry"; options.MetricNamespace = "MyApp.Metrics"; // 指标命名空间 })
配置Logs导出
options.AddGenevaLogExporter(options => { options.ConnectionString = "EtwSession=OpenTelemetry"; })
关键注意事项
- 所有Provider(TracerProvider、MeterProvider、LoggerProvider)需在
Application_Start初始化,并在Application_End中调用Dispose(),避免资源泄漏。 - 测试阶段可先添加
.AddConsoleExporter()验证数据是否正常生成。 - 确保安装的OpenTelemetry包版本兼容.NET Framework 4.7.2,优先使用稳定版。
内容的提问来源于stack exchange,提问作者Sadiq

