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

如何为.NET 6 Azure Functions添加OpenTelemetry支持

为.NET 6 Azure Functions添加OpenTelemetry支持的实现步骤

1. 安装依赖NuGet包

需要安装适配Azure Functions、Service Bus及自定义追踪的OpenTelemetry相关包,可通过命令行执行:

dotnet add package OpenTelemetry.Extensions.Hosting
dotnet add package OpenTelemetry.Instrumentation.AzureFunctions
dotnet add package OpenTelemetry.Instrumentation.ServiceBus
dotnet add package OpenTelemetry.Exporter.Console
dotnet add package OpenTelemetry.Extensions.DependencyInjection

2. 在Program.cs中配置OpenTelemetry服务

修改函数项目的启动配置,集成自动追踪和自定义扩展:

using OpenTelemetry;
using OpenTelemetry.Trace;

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices(services =>
    {
        // 注册MediatR(若尚未注册)
        services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblyContaining<EBcktErroredFunction>());

        // 配置OpenTelemetry追踪链路
        services.AddOpenTelemetry()
            .WithTracing(tracerBuilder =>
            {
                tracerBuilder
                    // 启用Azure Functions自动埋点
                    .AddAzureFunctionsInstrumentation()
                    // 启用Azure Service Bus消息链路追踪
                    .AddServiceBusInstrumentation()
                    // 关联MediatR命令追踪源
                    .AddSource("MediatR")
                    // 控制台输出追踪数据(测试用)
                    .AddConsoleExporter()
                    // 关联当前项目自定义活动源
                    .AddSource(typeof(EBcktErroredFunction).Assembly.GetName().Name);
                    // 生产环境可替换为Azure Monitor/Jaeger等 exporter
                    //.AddAzureMonitorTraceExporter(o => o.ConnectionString = "你的Azure Monitor连接字符串");
            });
    })
    .Build();

host.Run();

3. 为MediatR添加自定义追踪链路

OpenTelemetry默认不支持MediatR自动追踪,可通过Pipeline Behavior手动实现:

using MediatR;
using OpenTelemetry.Trace;

public class MediatRInstrumentationBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
    where TRequest : IRequest<TResponse>
{
    private readonly Tracer _tracer;

    public MediatRInstrumentationBehavior(TracerProvider tracerProvider)
    {
        _tracer = tracerProvider.GetTracer("MediatR");
    }

    public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next, CancellationToken cancellationToken)
    {
        using var activity = _tracer.StartActivity($"MediatR: {typeof(TRequest).Name}", ActivityKind.Internal);
        
        // 可选:添加请求元数据到追踪标签
        activity?.SetTag("request.type", typeof(TRequest).FullName);
        
        try
        {
            var response = await next();
            activity?.SetStatus(ActivityStatusCode.Ok);
            return response;
        }
        catch (Exception ex)
        {
            activity?.SetStatus(ActivityStatusCode.Error, ex.Message);
            activity?.RecordException(ex);
            throw;
        }
    }
}

然后在Program.cs的服务注册中添加该行为:

services.AddTransient(typeof(IPipelineBehavior<,>), typeof(MediatRInstrumentationBehavior<,>));

4. 验证追踪效果

运行函数并触发EBcktErroredFunction,控制台会输出完整链路追踪数据,包含Service Bus触发事件、MediatR命令执行的全流程信息。

5. 生产环境适配建议

  • 替换ConsoleExporter为生产级导出器(如Azure Monitor、Jaeger)
  • 设置环境变量OTEL_SERVICE_NAME为函数应用名称,便于追踪链路识别

补充:你的Bicep配置优化建议

你提供的Service Bus订阅配置存在属性值缺失,建议补充完整参数:

resource eBcktErroredSubscription 'Microsoft.ServiceBus/namespaces/topics/subscriptions' = {
  name: '${serviceBusName}/e-bckt-errored/${appName}'
  properties: {
    autoDeleteOnIdle: 'P10675199DT2H48M5.4775807S' // 永不过期,或设置具体时长
    deadLetteringOnMessageExpiration: true
    defaultMessageTimeToLive: 'P7D' // 消息默认存活7天
    enableBatchedOperations: true
    lockDuration: 'PT1M' // 消息锁时长1分钟
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:20:45