.NET 6.0独立函数中Application Insights的operation_ParentId异常问题
.NET 6独立模式Azure函数与Application Insights追踪关联问题
我当前使用带HTTP触发器的.NET 6.0独立模式Azure函数。由于Activity未被自动填充,我添加了中间件,基于W3C的traceparent标头创建Activity。按照微软文档,期望Application Insights的operation_ParentId直接关联到日志所在Activity的ParentSpanId,但实际不符,具体情况:
- 应用A发送请求,
traceparent = 00-3abe9f15e940badc5f1521e6eb1eb411-bfd30439c918c783-00 - 在应用B的中间件中,启动Activity并记录日志,验证该Activity的
ParentId等于上述traceparent值,ParentSpanId等于bfd30439c918c783,代码如下:
using var requestActivity = new Activity(context.FunctionDefinition.Name); requestActivity.SetParentId(traceParent); requestActivity.Start(); _logger.LogInformation("Invoking '{Name}'", context.FunctionDefinition.Name);
- 在Application Insights中,
OperationId符合预期等于W3C的trace-id(3abe9f15e940badc5f1521e6eb1eb411),但operation_ParentId是一个从未见过的Span,既不是requestActivity.SpanId也不是requestActivity.ParentSpanId。
疑问:Application Insights在日志时不使用当前的Activity吗?
应用配置代码
var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults(worker => { worker.UseMiddleware<TracingMiddleware>(); }) .ConfigureServices(collection => { }) .ConfigureLogging(x=>x.AddApplicationInsights()) .Build(); host.Run();
中间件函数代码
public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next) { using var requestActivity = new Activity(context.FunctionDefinition.Name); SetParentId(context, requestActivity); requestActivity.Start(); _logger.LogInformation("Invoking '{Name}'", context.FunctionDefinition.Name); var t = Activity.Current; System.Console.WriteLine(); System.Console.WriteLine($"Activity.TraceId: {t.TraceId}"); System.Console.WriteLine($"Activity.ParentId: {t.ParentId}"); System.Console.WriteLine($"Activity.SpanId: {t.SpanId}"); await next(context); var statusCode = (context.Items != null) ? context.GetHttpResponseData()?.StatusCode : System.Net.HttpStatusCode.OK; _logger.LogInformation( "Executed '{Name}', Result {Result}, Duration = {Duration}ms", context.FunctionDefinition.Name, statusCode, (DateTime.UtcNow - requestActivity.StartTimeUtc).TotalMilliseconds); requestActivity.Stop(); }
更新
- Application Insights在独立模式函数中仍未完全适配,部分值可能丢失(如操作名称),但可通过Application Insights SDK(如
ITelemetryInitializer)统一补充这些值。 - 关于HTTP Span的差异:执行HTTP调用时,相关库可能会启动新的子Activity,这就是出现意外父Span的原因。负责协调追踪信息自动传递的类是
DistributedContextPropagator。我曾修改过它以消除子Activity的额外层级,但最终恢复了默认设置——因为Application Insights更适配默认配置,相比追踪语句的完美对齐,获取良好的应用概览(如应用程序地图)优先级更高。
内容的提问来源于stack exchange,提问作者XWIKO
相关产品推荐
相关产品推荐

