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

