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

.NET 4.7.2下ASP.NET MVC中Open Telemetry后续实现咨询

.NET 4.7.2 ASP.NET MVC 中 OpenTelemetry 三大信号实现与后端导出配置

一、跟踪(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 18:20:15