.NET 7 Azure Function OpenTelemetry追踪无法导出至New Relic
.NET 7 Azure Function 追踪数据无法导出到New Relic的修复方案
核心问题定位
- Http触发器中
Activity.Current返回null,说明Azure Functions的自动追踪上下文未正确初始化,导致OpenTelemetry无法捕获Span数据,进而无法导出到New Relic。 - 日志与指标可正常导出,说明OTLP导出通道、New Relic API密钥配置有效,问题聚焦在追踪上下文初始化环节。
修复步骤
1. 安装必要的OpenTelemetry NuGet包
默认OTLP包不处理Azure Functions的追踪上下文,需添加专用扩展:
dotnet add package OpenTelemetry.Extensions.Hosting dotnet add package OpenTelemetry.Instrumentation.AzureFunctions
2. 调整Program.cs的OpenTelemetry配置
明确添加Azure Functions instrumentation,并配置正确的追踪源:
var builder = new HostBuilder(); builder.ConfigureFunctionsWorkerDefaults(); builder.ConfigureServices(services => { services.AddOpenTelemetry() .WithTracing(tracing => { // 关键:启用Azure Functions追踪 instrumentation tracing.AddAzureFunctionsInstrumentation(); // 配置OTLP导出到New Relic tracing.AddOtlpExporter(options => { options.Endpoint = new Uri(Environment.GetEnvironmentVariable("Telemetry:Otlp:Endpoint")); options.Headers = Environment.GetEnvironmentVariable("Telemetry:Otlp:Headers"); }); // 包含Functions内置追踪源 tracing.AddSource("Microsoft.Azure.Functions.Worker"); }); }); var host = builder.Build(); host.Run();
3. 确认local.settings.json配置有效性
确保OTLP相关配置正确,示例如下:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "Telemetry:Otlp:Endpoint": "https://otlp.nr-data.net:4317", "Telemetry:Otlp:Headers": "api-key=你的New Relic API密钥" } }
4. 在触发器中验证追踪上下文
修改Function1.cs,确保能获取并记录追踪信息:
[Function("Function1")] public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req) { var activity = Activity.Current; _logger.LogInformation("当前追踪信息 - TraceId: {TraceId}, SpanId: {SpanId}", activity?.TraceId, activity?.SpanId); var response = req.CreateResponse(HttpStatusCode.OK); response.Headers.Add("Content-Type", "text/plain; charset=utf-8"); response.WriteString("Welcome to Azure Functions!"); return response; }
验证流程
- 重启本地Function应用
- 调用
http://localhost:7256/api/Function1 - 查看控制台日志,确认TraceId和SpanId能正常输出
- 登录New Relic后台,在分布式追踪面板中检查是否生成对应的Span数据
内容的提问来源于stack exchange,提问作者Mike Ross
相关产品推荐
相关产品推荐

